From 84624425a9e762f2d68954d0f342bf67f1335861 Mon Sep 17 00:00:00 2001 From: fengweihao Date: Tue, 10 Jul 2018 10:53:10 +0800 Subject: [PATCH] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9redis=E5=88=86=E5=B8=83?= =?UTF-8?q?=E5=BC=8F=E9=94=81=EF=BC=8C=E4=BF=AE=E6=94=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?key=E8=AE=BE=E7=BD=AE=202.=E4=BF=AE=E6=94=B9fs=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cert_session.c | 38 +++++++++-------------------- src/components/redis/rd_lock.c | 5 +--- src/inc/field_stat2.h | 1 - src/inc/moodycamel_field_stat2.cpp | 9 +++++++ src/inc/moodycamel_field_stat2.h | 4 ++- src/lib/libMESA_field_stat2.a | Bin 58876 -> 58804 bytes 6 files changed, 25 insertions(+), 32 deletions(-) diff --git a/src/cert_session.c b/src/cert_session.c index e7d7a65..65db23c 100644 --- a/src/cert_session.c +++ b/src/cert_session.c @@ -61,9 +61,6 @@ static struct fs_stats_t SGstats = { rt_mutex entries_mtx = PTHREAD_MUTEX_INITIALIZER; -uint64_t startTime = 0; -uint64_t endTime = 0; - void connectCallback(const struct redisAsyncContext *c, int status) { if (status != REDIS_OK) { mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Redis connect error : %s\n", c->errstr); @@ -685,7 +682,7 @@ finish: static int fs_internal_operate(int id, int id2, int column_id, int column_id2, long long diffTime) { - int ret = -1, value = -1; + int ret = -1; screen_stat_handle_t handle = SGstats.handle; FS_internal_operate(handle, id, column_id, FS_OP_ADD, 1); @@ -698,11 +695,7 @@ static int fs_internal_operate(int id, int id2, int column_id, int column_id2, l if (column_id2 < 0) goto finish; - value = FS_internal_operate(handle, id, column_id, FS_OP_GET, 0); - if (value < 0) - goto finish; - - ret = FS_internal_operate(handle, id, column_id2, FS_OP_SET, diffTime/value); + ret = FS_internal_operate(handle, id, column_id2, FS_OP_SET, diffTime); finish: return ret; } @@ -784,7 +777,6 @@ void rd_get_callback(redisAsyncContext *c, void *r, void *privdata) break; case REDIS_REPLY_NIL: - /* Certificate information modification and Strategy to judge**/ mesa_runtime_log(RLOG_LV_INFO, MODULE_NAME, "Generating certificate information"); xret = rd_encode_sendbuf(request, c, sendbuf); @@ -797,7 +789,6 @@ void rd_get_callback(redisAsyncContext *c, void *r, void *privdata) evhttp_socket_send(request->evh_req, sendbuf); finish: - //kfree(request); return; } @@ -943,14 +934,6 @@ pthread_work_proc(struct evhttp_request *evh_req, void *arg) switch (evhttp_request_get_command(evh_req)) { case EVHTTP_REQ_GET: cmdtype = "GET"; break; - case EVHTTP_REQ_POST: cmdtype = "POST"; break; - case EVHTTP_REQ_HEAD: cmdtype = "HEAD"; break; - case EVHTTP_REQ_PUT: cmdtype = "PUT"; break; - case EVHTTP_REQ_DELETE: cmdtype = "DELETE"; break; - case EVHTTP_REQ_OPTIONS: cmdtype = "OPTIONS"; break; - case EVHTTP_REQ_TRACE: cmdtype = "TRACE"; break; - case EVHTTP_REQ_CONNECT: cmdtype = "CONNECT"; break; - case EVHTTP_REQ_PATCH: cmdtype = "PATCH"; break; default: cmdtype = "unknown"; break; } fs_internal_operate(thread_info->column_ids, -1, SGstats.line_ids[0], -1, 0); @@ -962,7 +945,7 @@ pthread_work_proc(struct evhttp_request *evh_req, void *arg) if (request->host[0] != '\0' && request->evh_req != NULL){ #ifdef RD_MUTEX_LOCK - rd_mutex_lock("key", 30, &request->mtx, thread_info->sync); + rd_mutex_lock(request->host, 30, &request->mtx, thread_info->sync); #endif xret = redisAsyncCommand(thread_info->cl_ctx, rd_get_callback, request, "GET %s", request->host); if (xret < 0) @@ -973,7 +956,6 @@ pthread_work_proc(struct evhttp_request *evh_req, void *arg) evhttp_uri_free(decoded); goto error; } - evhttp_uri_free(decoded); goto finish; @@ -994,7 +976,6 @@ cert_trapper_task_int(struct event_base *base, libevent_thread *me) mesa_runtime_log(RLOG_LV_FATAL, MODULE_NAME, "Initialize the redis connection is failure\n"); goto finish; } - xret = redis_sync_int(&me->sync); /* Initialize the X509 CA*/ @@ -1207,18 +1188,23 @@ fs_screen_init() value=3; FS_internal_set_para(SGstats.handle, STAT_CYCLE, &value, sizeof(value)); - snprintf(buff,sizeof(buff),"%s", "req"); + snprintf(buff,sizeof(buff),"%s", "http-get"); SGstats.line_ids[0] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); - snprintf(buff,sizeof(buff),"%s", "store"); + snprintf(buff,sizeof(buff),"%s", "local-storage"); SGstats.line_ids[1] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); - snprintf(buff,sizeof(buff),"%s", "sign"); + snprintf(buff,sizeof(buff),"%s", "generate-cert"); SGstats.line_ids[2] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); - snprintf(buff,sizeof(buff),"%s", "ssl(ms)"); + snprintf(buff,sizeof(buff),"%s", "take-time"); SGstats.line_ids[3] = FS_internal_register(SGstats.handle, FS_STYLE_COLUMN, FS_CALC_CURRENT, buff); + snprintf(buff,sizeof(buff),"average-time"); + FS_internal_register_ratio(SGstats.handle, SGstats.line_ids[3], + SGstats.line_ids[2], 1, + FS_STYLE_COLUMN, FS_CALC_CURRENT, + buff); FS_internal_start(SGstats.handle); return 0; diff --git a/src/components/redis/rd_lock.c b/src/components/redis/rd_lock.c index 68587b2..f58e05e 100644 --- a/src/components/redis/rd_lock.c +++ b/src/components/redis/rd_lock.c @@ -22,7 +22,6 @@ struct rd_RedLock{ sds m_unlockScript; int m_retryCount; int m_retryDelay; - char *m_continueLockScript; }; static struct rd_RedLock redlock = { @@ -30,7 +29,6 @@ static struct rd_RedLock redlock = { .m_unlockScript = NULL, .m_retryCount = 0, .m_retryDelay = 0, - .m_continueLockScript = NULL, }; struct rd_RedLock *mutx_redlock() @@ -195,9 +193,8 @@ void rd_lock_init() { struct rd_RedLock *rdlock = mutx_redlock(); - rdlock->m_continueLockScript = sdsnew("if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('del', KEYS[1]) end return redis.call('set', KEYS[1], ARGV[2], 'px', ARGV[3], 'nx')"); rdlock->m_unlockScript = sdsnew("if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"); - rdlock->m_retryCount = 8; + rdlock->m_retryCount = 3; rdlock->m_retryDelay = 10; rdlock->m_clockDriftFactor = 0.01; diff --git a/src/inc/field_stat2.h b/src/inc/field_stat2.h index d27c309..6ed212c 100644 --- a/src/inc/field_stat2.h +++ b/src/inc/field_stat2.h @@ -22,7 +22,6 @@ enum field_op { FS_OP_ADD=1, FS_OP_SET, - FS_OP_GET, }; diff --git a/src/inc/moodycamel_field_stat2.cpp b/src/inc/moodycamel_field_stat2.cpp index a618b26..f09bcfc 100644 --- a/src/inc/moodycamel_field_stat2.cpp +++ b/src/inc/moodycamel_field_stat2.cpp @@ -17,6 +17,9 @@ extern "C" int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_s enum field_calc_algo calc_type,const char* name); extern "C" int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value); +extern "C" int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling, + enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name); + screen_stat_handle_t FS_internal_create_handle(void) { return FS_create_handle(); @@ -43,3 +46,9 @@ int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum fi return FS_operate(handle, id, column_id, op, value); } +int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling, + enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name) +{ + return FS_register_ratio(handle, numerator_id, denominator_id, scaling, style, calc_type, name); +} + diff --git a/src/inc/moodycamel_field_stat2.h b/src/inc/moodycamel_field_stat2.h index 64d8a52..84bb7c7 100644 --- a/src/inc/moodycamel_field_stat2.h +++ b/src/inc/moodycamel_field_stat2.h @@ -24,7 +24,6 @@ enum field_op { FS_OP_ADD=1, FS_OP_SET, - FS_OP_GET, }; typedef void* screen_stat_handle_t; @@ -56,4 +55,7 @@ int FS_internal_register(screen_stat_handle_t handle,enum field_dsp_style_t styl int FS_internal_operate(screen_stat_handle_t handle,int id,int column_id,enum field_op op,long long value); +int FS_internal_register_ratio(screen_stat_handle_t handle,int numerator_id,int denominator_id,int scaling, + enum field_dsp_style_t style,enum field_calc_algo calc_type,const char* name); + #endif diff --git a/src/lib/libMESA_field_stat2.a b/src/lib/libMESA_field_stat2.a index 7ba8281c5306be7075f782b21cd6c41f5fcac0cf..a6aa4b083f5b0be0b82a5f63a5e9c8d1dff81cb3 100644 GIT binary patch delta 14881 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

n(HpZ?^2c45=D)la@Oo^i)noX+C&YW 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 jcF=a71pQJ6wG^^1byVMi`IkESJKwMe{=Zx*i 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 EKbkVy{{R30