From 09a3d6598d3ae81bc22f91cf2c16fd15e40b9525 Mon Sep 17 00:00:00 2001 From: zhangchengwei Date: Sat, 29 Sep 2018 11:28:09 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=9E=E7=BB=93=E6=9E=84=E5=8C=96=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E7=BA=BF=E7=A8=8B=E5=AE=89=E5=85=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/cache_evbase_client.cpp | 33 ++++++++++++++++++++++++----- cache/include/tango_cache_client.h | 1 + cache/pangu_tango_cache.a | Bin 229256 -> 229848 bytes cache/tango_cache_client.cpp | 12 +++++------ cache/tango_cache_transfer.cpp | 10 ++++++--- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/cache/cache_evbase_client.cpp b/cache/cache_evbase_client.cpp index c4e68c4..b7b4077 100644 --- a/cache/cache_evbase_client.cpp +++ b/cache/cache_evbase_client.cpp @@ -23,6 +23,7 @@ enum CACHE_ASYN_CMD CACHE_ASYN_FETCH=0, CACHE_ASYN_UPLOAD_ONCE_DATA, CACHE_ASYN_UPLOAD_ONCE_EVBUF, + CACHE_ASYN_UPLOAD_START, CACHE_ASYN_UPLOAD_FRAG_DATA, CACHE_ASYN_UPLOAD_FRAG_EVBUF, CACHE_ASYN_UPLOAD_END, @@ -172,6 +173,11 @@ static void cache_asyn_ioevent_dispatch(struct databuffer *buffer) evbuffer_free(buffer->evbuf); cache_asyn_ctx_destroy(ctx_asyn); break; + + case CACHE_ASYN_UPLOAD_START: + ctx_asyn->ctx->instance->statistic.put_recv_num += 1; + ctx_asyn->ctx->instance->error_code = CACHE_OK; + break; case CACHE_ASYN_UPLOAD_FRAG_DATA: tango_cache_update_frag_data(ctx_asyn->ctx, buffer->data, buffer->size); @@ -292,7 +298,7 @@ int cache_evbase_update_frag_data(struct cache_evbase_ctx *ctx_asyn, enum PUT_ME } free(buffer->data); free(buffer); - return -1; + return -2; } return 0; } @@ -320,7 +326,7 @@ int cache_evbase_update_frag_evbuf(struct cache_evbase_ctx *ctx_asyn, struct evb } evbuffer_free(buffer->evbuf); free(buffer); - return -1; + return -2; } return 0; } @@ -329,8 +335,9 @@ struct cache_evbase_ctx *cache_evbase_update_start(struct cache_evbase_instance { struct cache_evbase_ctx *ctx_asyn; struct tango_cache_ctx *ctx; + struct databuffer *buffer; - ctx = tango_cache_update_start(instance->instance, future, meta); + ctx = tango_cache_update_prepare(instance->instance, future, meta); if(ctx == NULL) { return NULL; @@ -340,6 +347,19 @@ struct cache_evbase_ctx *cache_evbase_update_start(struct cache_evbase_instance ctx_asyn->instance_asyn = instance; ctx_asyn->ctx = ctx; + buffer = (struct databuffer *)malloc(sizeof(struct databuffer)); + buffer->ctx_asyn = ctx_asyn; + buffer->cmd_type = CACHE_ASYN_UPLOAD_START; + + //事件通知仅为了增加统计信息 + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + { + ctx_asyn->ctx->fail_state = true; + tango_cache_ctx_destroy(ctx_asyn->ctx); + cache_asyn_ctx_destroy(ctx_asyn); + free(buffer); + return NULL; + } return ctx_asyn; } @@ -382,9 +402,10 @@ int cache_evbase_upload_once_data(struct cache_evbase_instance *instance, struct { free(buffer->data); free(buffer); + ctx_asyn->ctx->fail_state = true; tango_cache_ctx_destroy(ctx); cache_asyn_ctx_destroy(ctx_asyn); - return -1; + return -2; } return 0; } @@ -420,9 +441,10 @@ int cache_evbase_upload_once_evbuf(struct cache_evbase_instance *instance, struc { evbuffer_free(buffer->evbuf); free(buffer); + ctx_asyn->ctx->fail_state = true; tango_cache_ctx_destroy(ctx); cache_asyn_ctx_destroy(ctx_asyn); - return -1; + return -2; } return 0; } @@ -465,6 +487,7 @@ int cache_evbase_delete_object(struct cache_evbase_instance *instance, struct fu if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) { + ctx_asyn->ctx->fail_state = true; tango_cache_ctx_destroy(ctx_asyn->ctx); cache_asyn_ctx_destroy(ctx_asyn); free(buffer); diff --git a/cache/include/tango_cache_client.h b/cache/include/tango_cache_client.h index bcd2f63..fc03964 100644 --- a/cache/include/tango_cache_client.h +++ b/cache/include/tango_cache_client.h @@ -42,6 +42,7 @@ struct cache_statistics long long del_recv_num; //发起DELETE的次数 long long del_succ_num; //DELETE成功的次数 long long del_error_num;//DELETE成功的次数 + long long totaldrop_num;//内存满DROP的次数 long long memory_used; //当前UPLOAD BODY所占内存大小 long long session_num; //当前正在进行GET/PUT的HTTP会话数 }; diff --git a/cache/pangu_tango_cache.a b/cache/pangu_tango_cache.a index 31ea050125cdcc2c233e380345967ded93ec6634..5db5f7014a8dbed041dfb6d8afe39b1c38007b92 100644 GIT binary patch delta 49820 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 delta 49161 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 zJ!~17del_recv_num = instance->statistic.del_recv_num; out->del_succ_num = instance->statistic.del_succ_num; out->del_error_num= instance->statistic.del_error_num; + out->totaldrop_num= instance->statistic.totaldrop_num; out->session_num = instance->statistic.session_num; out->memory_used = instance->statistic.memory_used; } @@ -245,8 +246,6 @@ struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance * instance->error_code = CACHE_OUTOF_MEMORY; return NULL; } - instance->statistic.put_recv_num += 1; - instance->error_code = CACHE_OK; ctx = (struct tango_cache_ctx *)calloc(1, sizeof(struct tango_cache_ctx)); ctx->instance = instance; @@ -301,6 +300,8 @@ struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance * free(p); } + ctx->put.evbuf = evbuffer_new(); + TAILQ_INIT(&ctx->put.etag_head); return ctx; } @@ -313,9 +314,8 @@ struct tango_cache_ctx *tango_cache_update_start(struct tango_cache_instance *in { return NULL; } - - ctx->put.evbuf = evbuffer_new(); - TAILQ_INIT(&ctx->put.etag_head); + ctx->instance->statistic.put_recv_num += 1; + ctx->instance->error_code = CACHE_OK; return ctx; } @@ -367,7 +367,6 @@ struct tango_cache_ctx *tango_cache_fetch_prepare(struct tango_cache_instance *i ctx->get.state = GET_STATE_START; ctx->get.max_age = meta->get.max_age; ctx->get.min_fresh = meta->get.min_fresh; - instance->statistic.get_recv_num += 1; if(instance->hash_object_key) { @@ -396,7 +395,6 @@ struct tango_cache_ctx *tango_cache_delete_prepare(struct tango_cache_instance * ctx->instance = instance; ctx->future = future; ctx->method = CACHE_REQUEST_DELETE; - instance->statistic.del_recv_num += 1; if(instance->hash_object_key) { diff --git a/cache/tango_cache_transfer.cpp b/cache/tango_cache_transfer.cpp index 9a4b1af..fd76937 100644 --- a/cache/tango_cache_transfer.cpp +++ b/cache/tango_cache_transfer.cpp @@ -204,6 +204,7 @@ int cache_delete_minio_object(struct tango_cache_ctx *ctx) CURLMcode rc; char minio_url[256]; + ctx->instance->statistic.del_recv_num += 1; if(NULL == (ctx->curl=curl_easy_init())) { return 0; @@ -505,6 +506,8 @@ int tango_cache_upload_once_start_data(struct tango_cache_ctx *ctx, enum PUT_MEM CURLMcode rc; char minio_url[256]; + ctx->instance->statistic.put_recv_num += 1; + ctx->instance->error_code = CACHE_OK; if(NULL == (ctx->curl=curl_easy_init())) { tango_cache_ctx_destroy(ctx); @@ -556,7 +559,9 @@ int tango_cache_upload_once_start_evbuf(struct tango_cache_ctx *ctx, enum EVBUFF { size_t size; - ctx->put.evbuf = evbuffer_new(); + ctx->instance->statistic.put_recv_num += 1; + ctx->instance->error_code = CACHE_OK; + size = evbuffer_get_length(evbuf); if(way == EVBUFFER_MOVE) { @@ -639,7 +644,6 @@ static size_t curl_get_response_body_cb(void *ptr, size_t size, size_t count, vo ctx->fail_state = true; ctx->error_code = CACHE_ERR_CURL; ctx->get.state = GET_STATE_DELETE; - ctx->instance->statistic.del_recv_num += 1; promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, "cache Expires or x-amz-meta-lm not found"); return size*count; } @@ -679,7 +683,6 @@ static bool check_expires_header(struct tango_cache_ctx *ctx, const char *expire ctx->fail_state = true; ctx->error_code = CACHE_TIMEOUT; ctx->get.state = GET_STATE_DELETE; //缓存失效时在下载完毕时触发删除动作 - ctx->instance->statistic.del_recv_num += 1; easy_string_destroy(&ctx->response); promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, "cache not fresh"); return false; @@ -791,6 +794,7 @@ int tango_cache_fetch_start(struct tango_cache_ctx *ctx) CURLMcode rc; char minio_url[256]; + ctx->instance->statistic.get_recv_num += 1; if(NULL == (ctx->curl=curl_easy_init())) { tango_cache_ctx_destroy(ctx);