From 1efbe650312947db0f1a1376d7d77c549d1c0b7c Mon Sep 17 00:00:00 2001 From: zhangchengwei Date: Mon, 8 Oct 2018 16:07:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9promis=5Ffail=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/cache_evbase_client.cpp | 50 ++++++++++++++--------------- cache/include/tango_cache_client.h | 2 ++ cache/pangu_tango_cache.a | Bin 236060 -> 239654 bytes cache/tango_cache_client.cpp | 24 ++++++++++++-- cache/tango_cache_client_in.h | 2 ++ cache/tango_cache_transfer.cpp | 49 +++++++++++----------------- 6 files changed, 70 insertions(+), 57 deletions(-) diff --git a/cache/cache_evbase_client.cpp b/cache/cache_evbase_client.cpp index f880a4b..40de5c2 100644 --- a/cache/cache_evbase_client.cpp +++ b/cache/cache_evbase_client.cpp @@ -115,13 +115,13 @@ static int32_t iothread_notify_event(int32_t socket_fd, void *content, int32_t l } if(res <= 0) { - printf("log_error: select io res=%d, error: %s", res, strerror(errno)); + printf("log_error: select io res=%d, error: %s\n", res, strerror(errno)); return -1; } if(FD_ISSET(socket_fd, &e_set)) { - printf("log_error: select io is in efds, error: %s", strerror(errno)); + printf("log_error: select io is in efds, error: %s\n", strerror(errno)); return -2; } @@ -250,15 +250,11 @@ void cache_evbase_update_end(struct cache_evbase_ctx *ctx_asyn) buffer->ctx_asyn = ctx_asyn; buffer->cmd_type = CACHE_ASYN_UPLOAD_END; - if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { if(!ctx_asyn->ctx->fail_state) { - ctx_asyn->ctx->fail_state = true; - if(ctx_asyn->ctx->future != NULL) - { - promise_failed(future_to_promise(ctx_asyn->ctx->future), FUTURE_ERROR_CANCEL, "write sockpair error"); - } + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); } tango_cache_ctx_destroy(ctx_asyn->ctx); cache_asyn_ctx_destroy(ctx_asyn); @@ -289,12 +285,11 @@ int cache_evbase_update_frag_data(struct cache_evbase_ctx *ctx_asyn, enum PUT_ME buffer->ctx_asyn = ctx_asyn; buffer->cmd_type = CACHE_ASYN_UPLOAD_FRAG_DATA; - if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { - ctx_asyn->ctx->fail_state = true; - if(ctx_asyn->ctx->future != NULL) + if(!ctx_asyn->ctx->fail_state) { - promise_failed(future_to_promise(ctx_asyn->ctx->future), FUTURE_ERROR_CANCEL, "write sockpair error"); + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); } free(buffer->data); free(buffer); @@ -317,12 +312,11 @@ int cache_evbase_update_frag_evbuf(struct cache_evbase_ctx *ctx_asyn, struct evb buffer->evbuf = evbuffer_new(); evbuffer_add_buffer(buffer->evbuf, evbuf); - if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { - ctx_asyn->ctx->fail_state = true; - if(ctx_asyn->ctx->future != NULL) + if(!ctx_asyn->ctx->fail_state) { - promise_failed(future_to_promise(ctx_asyn->ctx->future), FUTURE_ERROR_CANCEL, "write sockpair error"); + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); } evbuffer_free(buffer->evbuf); free(buffer); @@ -352,9 +346,9 @@ struct cache_evbase_ctx *cache_evbase_update_start(struct cache_evbase_instance buffer->cmd_type = CACHE_ASYN_UPLOAD_START; //事件通知仅为了增加统计信息 - if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { - ctx_asyn->ctx->fail_state = true; + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); tango_cache_ctx_destroy(ctx_asyn->ctx); cache_asyn_ctx_destroy(ctx_asyn); free(buffer); @@ -398,11 +392,11 @@ int cache_evbase_upload_once_data(struct cache_evbase_instance *instance, struct buffer->ctx_asyn = ctx_asyn; buffer->cmd_type = CACHE_ASYN_UPLOAD_ONCE_DATA; - if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { free(buffer->data); free(buffer); - ctx_asyn->ctx->fail_state = true; + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); tango_cache_ctx_destroy(ctx); cache_asyn_ctx_destroy(ctx_asyn); return -2; @@ -437,11 +431,11 @@ int cache_evbase_upload_once_evbuf(struct cache_evbase_instance *instance, struc buffer->evbuf = evbuffer_new(); evbuffer_add_buffer(buffer->evbuf, evbuf); - if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { evbuffer_free(buffer->evbuf); free(buffer); - ctx_asyn->ctx->fail_state = true; + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); tango_cache_ctx_destroy(ctx); cache_asyn_ctx_destroy(ctx_asyn); return -2; @@ -467,8 +461,10 @@ int cache_evbase_fetch_object(struct cache_evbase_instance *instance, struct fut buffer->ctx_asyn = ctx_asyn; buffer->cmd_type = CACHE_ASYN_FETCH; - if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); + promise_failed(future_to_promise(future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx_asyn->ctx)); tango_cache_ctx_destroy(ctx_asyn->ctx); cache_asyn_ctx_destroy(ctx_asyn); free(buffer); @@ -496,9 +492,13 @@ int cache_evbase_delete_object(struct cache_evbase_instance *instance, struct fu buffer->cmd_type = CACHE_ASYN_DELETE; //参考Unix高级编程432页关于多线程写的安全性描述 - if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 0) != sizeof(void *)) + if(iothread_notify_event(instance->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *)) { - ctx_asyn->ctx->fail_state = true; + tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR); + if(future != NULL) + { + promise_failed(future_to_promise(future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx_asyn->ctx)); + } 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 90e0f28..268cdf5 100644 --- a/cache/include/tango_cache_client.h +++ b/cache/include/tango_cache_client.h @@ -17,6 +17,8 @@ enum CACHE_ERR_CODE CACHE_OUTOF_MEMORY,//当前内存占用超过限制,查看MAX_USED_MEMORY_SIZE_MB是否过小或者当前上传速率跟不上调用者的速率 CACHE_ERR_CURL, CACHE_ERR_WIREDLB, + CACHE_ERR_SOCKPAIR, + CACHE_ERR_INTERNAL, }; enum PUT_MEMORY_COPY_WAY diff --git a/cache/pangu_tango_cache.a b/cache/pangu_tango_cache.a index 0094000bec4e626f3e6c0f6906765bfa17ab047a..20e2fea4bc931b0901cc549425953b0fe6a5fa17 100644 GIT binary patch delta 73616 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 delta 73282 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 diff --git a/cache/tango_cache_client.cpp b/cache/tango_cache_client.cpp index f25177e..2938552 100644 --- a/cache/tango_cache_client.cpp +++ b/cache/tango_cache_client.cpp @@ -54,6 +54,26 @@ enum CACHE_ERR_CODE tango_cache_ctx_error(const struct tango_cache_instance *ins return instance->error_code; } +void tango_cache_set_fail_state(struct tango_cache_ctx *ctx, enum CACHE_ERR_CODE error_code) +{ + ctx->fail_state = true; + ctx->error_code = error_code; +} + +const char *tango_cache_get_errstring(const struct tango_cache_ctx *ctx) +{ + switch(ctx->error_code) + { + case CACHE_CACHE_MISS: return "cache not hit"; + case CACHE_TIMEOUT: return "cache not fresh"; + case CACHE_OUTOF_MEMORY:return "outof memory"; + case CACHE_ERR_WIREDLB: return "wiredlb error"; + case CACHE_ERR_SOCKPAIR:return "socketpair error"; + case CACHE_ERR_INTERNAL:return "cache Expires or x-amz-meta-lm not found"; + default: return ctx->error; + } +} + void tango_cache_get_statistics(const struct tango_cache_instance *instance, struct cache_statistics *out) { out->get_recv_num = instance->statistic.get_recv_num; @@ -182,7 +202,7 @@ void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx) { if(ctx->fail_state) { - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, ctx->error); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); } else { @@ -313,7 +333,7 @@ struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance * { ctx->headers = curl_slist_append(ctx->headers, "Content-Type:"); } - ctx->headers = curl_slist_append(ctx->headers, "Expect:"); + //ctx->headers = curl_slist_append(ctx->headers, "Expect:"); //不可以添加?curl_multi_socket_action会卡住 //其他定义的头部,GET时会原样返回 if(meta->usertag_len>0 && meta->usertag_len<=USER_TAG_MAX_LEN) { diff --git a/cache/tango_cache_client_in.h b/cache/tango_cache_client_in.h index 2c6295d..3c2ab00 100644 --- a/cache/tango_cache_client_in.h +++ b/cache/tango_cache_client_in.h @@ -130,6 +130,8 @@ void easy_string_savedata(struct easy_string *estr, const char *data, size_t len void easy_string_destroy(struct easy_string *estr); void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx); +void tango_cache_set_fail_state(struct tango_cache_ctx *ctx, enum CACHE_ERR_CODE error_code); +const char *tango_cache_get_errstring(const struct tango_cache_ctx *ctx); struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta); struct tango_cache_ctx *tango_cache_fetch_prepare(struct tango_cache_instance *instance, struct future* future, struct tango_cache_meta *meta); diff --git a/cache/tango_cache_transfer.cpp b/cache/tango_cache_transfer.cpp index fd76937..8945abb 100644 --- a/cache/tango_cache_transfer.cpp +++ b/cache/tango_cache_transfer.cpp @@ -157,8 +157,7 @@ static size_t curl_write_uploadID_cb(void *ptr, size_t size, size_t count, void code = curl_easy_getinfo(ctx->curl, CURLINFO_RESPONSE_CODE, &ctx->res_code); if(code != CURLE_OK || ctx->res_code!=200L) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); if(code != CURLE_OK) MESA_HANDLE_RUNTIME_LOGV2(ctx->instance->runtime_log, RLOG_LV_DEBUG, "%s", ctx->error); return size*count; } @@ -182,6 +181,7 @@ int curl_get_minio_uploadID(struct tango_cache_ctx *ctx) snprintf(minio_url, 256, "http://%s/%s/%s?uploads", ctx->hostaddr, ctx->instance->bucketname, ctx->object_key); curl_easy_setopt(ctx->curl, CURLOPT_POST, 1L); curl_easy_setopt(ctx->curl, CURLOPT_URL, minio_url); + curl_easy_setopt(ctx->curl, CURLOPT_USERAGENT, "aws-sdk-cpp/1.5.24 Linux/3.10.0-327.el7.x86_64 x86_64 pangu_cache"); curl_easy_setopt(ctx->curl, CURLOPT_NOSIGNAL,1L); curl_easy_setopt(ctx->curl, CURLOPT_WRITEFUNCTION, curl_write_uploadID_cb); @@ -321,8 +321,7 @@ bool cache_kick_upload_minio_multipart(struct tango_cache_ctx *ctx, size_t block if(ret <= 0) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); return false; } return true; @@ -339,8 +338,7 @@ int http_put_complete_part_evbuf(struct tango_cache_ctx *ctx) ret = http_put_bodypart_request_evbuf(ctx, true); if(ret <= 0) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); tango_cache_ctx_destroy(ctx); } } @@ -381,8 +379,7 @@ int cache_kick_upload_minio_end(struct tango_cache_ctx *ctx) } else { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); tango_cache_ctx_destroy(ctx); } } @@ -391,8 +388,7 @@ int cache_kick_upload_minio_end(struct tango_cache_ctx *ctx) ret = http_put_bodypart_request_evbuf(ctx, false); if(ret <= 0) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); if(cache_cancel_upload_minio(ctx)) { ctx->put.state = PUT_STATE_CANCEL; @@ -422,8 +418,7 @@ void tango_cache_curl_put_done(struct tango_cache_ctx *ctx, CURLcode res, long r if(res!=CURLE_OK||res_code!=200L|| ctx->fail_state || !parse_uploadID_xml(ctx->response.buff, ctx->response.len, &ctx->put.uploadID)) { easy_string_destroy(&ctx->response); - ctx->error_code = CACHE_ERR_CURL; - ctx->fail_state = true; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); if(res != CURLE_OK) MESA_HANDLE_RUNTIME_LOGV2(ctx->instance->runtime_log, RLOG_LV_DEBUG, "%s", ctx->error); if(ctx->put.close_state) { @@ -452,8 +447,7 @@ void tango_cache_curl_put_done(struct tango_cache_ctx *ctx, CURLcode res, long r case PUT_STATE_PART: if(res != CURLE_OK || res_code!=200L) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); if(res != CURLE_OK) MESA_HANDLE_RUNTIME_LOGV2(ctx->instance->runtime_log, RLOG_LV_DEBUG, "%s", ctx->error); } if(ctx->fail_state) @@ -491,8 +485,7 @@ void tango_cache_curl_put_done(struct tango_cache_ctx *ctx, CURLcode res, long r case PUT_STATE_END: if(res != CURLE_OK || res_code!=200L) { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_CURL); if(res != CURLE_OK) MESA_HANDLE_RUNTIME_LOGV2(ctx->instance->runtime_log, RLOG_LV_DEBUG, "%s", ctx->error); } tango_cache_ctx_destroy(ctx); @@ -600,8 +593,8 @@ void tango_cache_curl_get_done(struct tango_cache_ctx *ctx, CURLcode res, long r { if(res!=CURLE_OK || res_code!=200L) { - ctx->error_code = (res!=CURLE_OK)?CACHE_ERR_CURL:CACHE_CACHE_MISS; - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, ctx->error); + tango_cache_set_fail_state(ctx, (res!=CURLE_OK)?CACHE_ERR_CURL:CACHE_CACHE_MISS); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); } else { @@ -641,10 +634,9 @@ static size_t curl_get_response_body_cb(void *ptr, size_t size, size_t count, vo if(ctx->get.need_hdrs!=RESPONSE_HDR_ALL) //无Expires时 { - ctx->fail_state = true; - ctx->error_code = CACHE_ERR_CURL; + tango_cache_set_fail_state(ctx, CACHE_ERR_INTERNAL); ctx->get.state = GET_STATE_DELETE; - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, "cache Expires or x-amz-meta-lm not found"); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); return size*count; } @@ -680,11 +672,10 @@ static bool check_expires_header(struct tango_cache_ctx *ctx, const char *expire if(time_gmt > ctx->get.expires) //缓存失效;TODO relative_age的含义是啥 { - ctx->fail_state = true; - ctx->error_code = CACHE_TIMEOUT; + tango_cache_set_fail_state(ctx, CACHE_TIMEOUT); ctx->get.state = GET_STATE_DELETE; //缓存失效时在下载完毕时触发删除动作 easy_string_destroy(&ctx->response); - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, "cache not fresh"); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); return false; } return true; @@ -700,10 +691,9 @@ static bool check_fresh_header(struct tango_cache_ctx *ctx) now_gmt = get_gmtime_timestamp(time(NULL)); if(ctx->get.last_modify+ctx->get.max_age > now_gmt || now_gmt+ctx->get.min_fresh>ctx->get.expires) { - ctx->fail_state = true; - ctx->error_code = CACHE_TIMEOUT; + tango_cache_set_fail_state(ctx, CACHE_TIMEOUT); easy_string_destroy(&ctx->response); - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, "cache not fresh"); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); return false; } return true; @@ -716,9 +706,8 @@ static bool check_get_result_code(struct tango_cache_ctx *ctx) code = curl_easy_getinfo(ctx->curl, CURLINFO_RESPONSE_CODE, &ctx->res_code); if(code != CURLE_OK || ctx->res_code!=200L) { - ctx->fail_state = true; - ctx->error_code = (code!=CURLE_OK)?CACHE_ERR_CURL:CACHE_CACHE_MISS; - promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, (code!=CURLE_OK)?ctx->error:"cache not hit"); + tango_cache_set_fail_state(ctx, (code!=CURLE_OK)?CACHE_ERR_CURL:CACHE_CACHE_MISS); + promise_failed(future_to_promise(ctx->future), FUTURE_ERROR_CANCEL, tango_cache_get_errstring(ctx)); return false; } return true;