future-promise增加对失败的统计。

This commit is contained in:
zhengchao
2018-09-04 08:52:01 +08:00
parent ff0f729660
commit 3adc052a3d

View File

@@ -22,7 +22,9 @@ struct future_promise_instance
struct _future_promise_debug struct _future_promise_debug
{ {
int field_id; int fsid_latency;
int fsid_failed;
long long succ_times;
struct timespec create_time; struct timespec create_time;
}; };
struct future struct future
@@ -40,7 +42,7 @@ struct promise
void * ctx; void * ctx;
int has_timeout; int has_timeout;
promise_ctx_destroy_cb * cb_ctx_destroy; promise_ctx_destroy_cb * cb_ctx_destroy;
struct _future_promise_debug __debug; struct _future_promise_debug debug;
}; };
static struct future_promise_instance g_FP_instance; static struct future_promise_instance g_FP_instance;
static int g_is_FP_init=0; static int g_is_FP_init=0;
@@ -95,23 +97,33 @@ struct field_get_set_args
{ {
MESA_htable_handle htable; MESA_htable_handle htable;
screen_stat_handle_t fs_handle; screen_stat_handle_t fs_handle;
int fsid_latency;
int fsid_failed;
}; };
static long field_get_set_cb(void * data, const uchar * key, uint size, void * user_arg) static long field_get_set_cb(void * data, const uchar * key, uint size, void * user_arg)
{ {
struct field_get_set_args* args=(struct field_get_set_args*)user_arg; struct field_get_set_args* args=(struct field_get_set_args*)user_arg;
int *field_id=NULL, ret=0; int *field_id=NULL, ret=0;
const char* fail_str="_fail";
char buff[size+strlen(fail_str)+1];
if(data==NULL) if(data==NULL)
{ {
field_id=(int*)malloc(sizeof(int)); field_id=(int*)malloc(sizeof(int)*2);
*field_id=FS_register(args->fs_handle, FS_STYLE_HISTOGRAM, FS_CALC_SPEED, (const char * )key); field_id[0]=FS_register(args->fs_handle, FS_STYLE_HISTOGRAM, FS_CALC_SPEED, (const char * )key);
args->fsid_failed=field_id[0];
snprintf(buff,sizeof(buff),"%s%s",(char*)key,fail_str);
field_id[1]=FS_register(args->fs_handle, FS_STYLE_FIELD, FS_CALC_SPEED,buff);
args->fsid_latency=field_id[1];
ret = MESA_htable_add(args->htable, key, size, (void*)field_id); ret = MESA_htable_add(args->htable, key, size, (void*)field_id);
assert(ret==0); assert(ret==0);
} }
else else
{ {
field_id=(int*)data; field_id=(int*)data;
args->fsid_failed=field_id[0];
args->fsid_latency=field_id[1];
} }
return *field_id; return 0;
} }
struct future * future_create(const char* symbol, future_success_cb * cb_success, future_failed_cb * cb_failed, void * user) struct future * future_create(const char* symbol, future_success_cb * cb_success, future_failed_cb * cb_failed, void * user)
@@ -122,12 +134,13 @@ struct future * future_create(const char* symbol, future_success_cb * cb_success
p->f.cb_failed = cb_failed; p->f.cb_failed = cb_failed;
strncpy(p->f.symbol,symbol,sizeof(p->f.symbol)); strncpy(p->f.symbol,symbol,sizeof(p->f.symbol));
clock_gettime(CLOCK_MONOTONIC,&p->__debug.create_time); clock_gettime(CLOCK_MONOTONIC,&p->debug.create_time);
void * no_use = NULL; void * no_use = NULL;
long cb_ret=0; long cb_ret=0;
struct field_get_set_args args{.htable = g_FP_instance.name_table, .fs_handle = g_FP_instance.fs_handle}; struct field_get_set_args args{.htable = g_FP_instance.name_table, .fs_handle = g_FP_instance.fs_handle};
no_use=MESA_htable_search_cb(g_FP_instance.name_table, (const unsigned char*)symbol, strlen(symbol), field_get_set_cb, &args, &cb_ret); no_use=MESA_htable_search_cb(g_FP_instance.name_table, (const unsigned char*)symbol, strlen(symbol), field_get_set_cb, &args, &cb_ret);
p->__debug.field_id=(int)cb_ret; p->debug.fsid_latency=args.fsid_latency;
p->debug.fsid_failed=args.fsid_failed;
FS_operate(g_FP_instance.fs_handle,g_FP_instance.fsid_f_num, 0, FS_OP_ADD, 1); FS_operate(g_FP_instance.fs_handle,g_FP_instance.fsid_f_num, 0, FS_OP_ADD, 1);
return &p->f; return &p->f;
} }
@@ -145,15 +158,30 @@ void future_destroy(struct future * f)
{ {
p->cb_ctx_destroy(p); p->cb_ctx_destroy(p);
} }
struct timespec end;
clock_gettime(CLOCK_MONOTONIC,&end);
long long jiffies=(end.tv_sec-p->__debug.create_time.tv_sec)*1000000000+end.tv_nsec-p->__debug.create_time.tv_nsec;
FS_operate(g_FP_instance.fs_handle, p->__debug.field_id, 0, FS_OP_SET, jiffies);
FS_operate(g_FP_instance.fs_handle,g_FP_instance.fsid_f_num, 0, FS_OP_SUB, 1); FS_operate(g_FP_instance.fs_handle,g_FP_instance.fsid_f_num, 0, FS_OP_SUB, 1);
memset(p, 0, sizeof(struct promise)); memset(p, 0, sizeof(struct promise));
free(p); free(p);
} }
static void fp_stat_latency(struct _future_promise_debug* debug, int is_success)
{
struct timespec end;
long long jiffies=0;
clock_gettime(CLOCK_MONOTONIC,&end);
if(is_success==1)
{
debug->succ_times++;
}
else
{
FS_operate(g_FP_instance.fs_handle, debug->fsid_failed, 0, FS_OP_ADD, 1);
}
if(debug->succ_times<=1)
{
jiffies=(end.tv_sec-debug->create_time.tv_sec)*1000000000+end.tv_nsec-debug->create_time.tv_nsec;
FS_operate(g_FP_instance.fs_handle, debug->fsid_latency, 0, FS_OP_SET, jiffies);
}
return;
}
void promise_failed(struct promise * p, enum e_future_error error, const char * what) void promise_failed(struct promise * p, enum e_future_error error, const char * what)
{ {
p->f.cb_failed(error, what, p->f.user); p->f.cb_failed(error, what, p->f.user);