From 0f77b9c44c7a252d4aa8cc5a2bd99056c5eacdfb Mon Sep 17 00:00:00 2001 From: zhangchengwei Date: Wed, 31 Oct 2018 09:43:41 +0800 Subject: [PATCH] =?UTF-8?q?curl=E6=93=8D=E4=BD=9C=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E9=99=90=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cache/src/tango_cache_client.cpp | 10 +-- cache/src/tango_cache_client_in.h | 1 - cache/src/tango_cache_transfer.cpp | 75 +++++++---------------- cache/test/cache_evbase_test_threads.cpp | 5 -- cache/test/lib/libhiredis.a | Bin 460438 -> 460470 bytes cache/test/tango_cache_test.c | 2 +- 6 files changed, 27 insertions(+), 66 deletions(-) diff --git a/cache/src/tango_cache_client.cpp b/cache/src/tango_cache_client.cpp index c6fa89d..54dd8b7 100644 --- a/cache/src/tango_cache_client.cpp +++ b/cache/src/tango_cache_client.cpp @@ -261,12 +261,12 @@ int tango_cache_update_frag_data(struct tango_cache_ctx *ctx, const char *data, { if(ctx->fail_state) { - return -1; + return 0; //TODO: 暂时忽略返回值!! } if(evbuffer_add(ctx->put.evbuf, data, size)) { tango_cache_set_fail_state(ctx, CACHE_OUTOF_MEMORY); - return -1; + return 0; } ctx->instance->statistic.memory_used += size; if(evbuffer_get_length(ctx->put.evbuf) >= ctx->instance->upload_block_size) @@ -282,7 +282,7 @@ int tango_cache_update_frag_evbuf(struct tango_cache_ctx *ctx, enum EVBUFFER_COP if(ctx->fail_state) { - return -1; + return 0;//TODO: 暂时忽略返回值!! } size = evbuffer_get_length(evbuf); @@ -291,7 +291,7 @@ int tango_cache_update_frag_evbuf(struct tango_cache_ctx *ctx, enum EVBUFFER_COP if(evbuffer_add_buffer(ctx->put.evbuf, evbuf)) { tango_cache_set_fail_state(ctx, CACHE_OUTOF_MEMORY); - return -1; + return 0; } } else @@ -299,7 +299,7 @@ int tango_cache_update_frag_evbuf(struct tango_cache_ctx *ctx, enum EVBUFFER_COP if(evbuffer_add_buffer_reference(ctx->put.evbuf, evbuf)) { tango_cache_set_fail_state(ctx, CACHE_OUTOF_MEMORY); - return -1; + return 0; } } ctx->instance->statistic.memory_used += size; diff --git a/cache/src/tango_cache_client_in.h b/cache/src/tango_cache_client_in.h index a9b7688..123a84d 100644 --- a/cache/src/tango_cache_client_in.h +++ b/cache/src/tango_cache_client_in.h @@ -158,7 +158,6 @@ void easy_string_destroy(struct easy_string *estr); void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx, bool callback=true); void tango_cache_set_fail_state(struct tango_cache_ctx *ctx, enum CACHE_ERR_CODE error_code); -const char *tango_cache_errcode2str(enum CACHE_ERR_CODE err_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* f, struct tango_cache_meta_put *meta); diff --git a/cache/src/tango_cache_transfer.cpp b/cache/src/tango_cache_transfer.cpp index 20dd2f6..c404e77 100644 --- a/cache/src/tango_cache_transfer.cpp +++ b/cache/src/tango_cache_transfer.cpp @@ -13,6 +13,19 @@ #include "tango_cache_xml.h" #include "tango_cache_tools.h" +static inline void curl_set_common_options(CURL *curl, long transfer_timeout, char *errorbuf) +{ + curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorbuf); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, transfer_timeout); //测试发现多链接有某链接接收卡住的情况 + //ctx->error="Operation too slow. Less than 1024 bytes/sec transferred the last 3 seconds" + curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 2L); + curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 100L); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "aws-sdk-cpp/1.5.24 Linux/3.10.0-327.el7.x86_64 x86_64 pangu_cache"); +} + //response body很短或不关心时 size_t curl_response_any_cb(void *ptr, size_t size, size_t count, void *userp) { @@ -119,23 +132,16 @@ static int http_put_bodypart_request_evbuf(struct tango_cache_ctx *ctx, bool ful curl_easy_setopt(ctx->curl, CURLOPT_HEADERDATA, ctx); } 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_response_any_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); - curl_easy_setopt(ctx->curl, CURLOPT_TIMEOUT, ctx->instance->transfer_timeout); //测试发现有某链接接收卡住的情况 curl_easy_setopt(ctx->curl, CURLOPT_HTTPHEADER, ctx->headers); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_TIME, 2L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_LIMIT, 100L); curl_easy_setopt(ctx->curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(ctx->curl, CURLOPT_INFILESIZE, ctx->put.upload_length); curl_easy_setopt(ctx->curl, CURLOPT_READFUNCTION, curl_put_multipart_send_cb); curl_easy_setopt(ctx->curl, CURLOPT_READDATA, ctx); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); @@ -183,17 +189,11 @@ int curl_get_minio_uploadID(struct tango_cache_ctx *ctx) curl_easy_setopt(ctx->curl, CURLOPT_POSTFIELDSIZE, 0); //默认使用回调函数调用fread,测试发现关闭Expect时会导致卡在curl_multi_socket_action 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_response_body_save_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); curl_easy_setopt(ctx->curl, CURLOPT_HTTPHEADER, ctx->headers); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_TIME, 2L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_LIMIT, 100L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); @@ -217,14 +217,10 @@ int cache_delete_minio_object(struct tango_cache_ctx *ctx, bool call_back) snprintf(minio_url, 256, "http://%s/%s/%s", ctx->hostaddr, ctx->instance->bucketname, ctx->object_key); curl_easy_setopt(ctx->curl, CURLOPT_CUSTOMREQUEST, "DELETE"); 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_response_any_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); @@ -245,14 +241,10 @@ bool cache_cancel_upload_minio(struct tango_cache_ctx *ctx) snprintf(minio_url, 256, "http://%s/%s/%s?uploadId=%s", ctx->hostaddr, ctx->instance->bucketname, ctx->object_key, ctx->put.uploadID); curl_easy_setopt(ctx->curl, CURLOPT_CUSTOMREQUEST, "DELETE"); 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_response_any_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); @@ -275,17 +267,13 @@ bool cache_kick_combine_minio(struct tango_cache_ctx *ctx) snprintf(minio_url, 256, "http://%s/%s/%s?uploadId=%s", ctx->hostaddr, ctx->instance->bucketname, ctx->object_key, ctx->put.uploadID); 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_response_any_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); curl_easy_setopt(ctx->curl, CURLOPT_POSTFIELDSIZE, len); //填充Content-Length curl_easy_setopt(ctx->curl, CURLOPT_POSTFIELDS, ctx->put.combine_xml); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); if(ctx->headers != NULL) { @@ -508,18 +496,11 @@ int tango_cache_upload_once_start_data(struct tango_cache_ctx *ctx, enum PUT_MEM snprintf(minio_url, 256, "http://%s/%s/%s", ctx->hostaddr, ctx->instance->bucketname, ctx->object_key); 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_response_any_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); - curl_easy_setopt(ctx->curl, CURLOPT_TIMEOUT, ctx->instance->transfer_timeout); //测试发现有某链接接收卡住的情况 curl_easy_setopt(ctx->curl, CURLOPT_HTTPHEADER, ctx->headers); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_TIME, 2L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_LIMIT, 100L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); if(way == PUT_MEM_COPY) { @@ -632,17 +613,11 @@ int tango_cache_multi_delete_start(struct tango_cache_ctx *ctx, bool callback) curl_easy_setopt(ctx->curl, CURLOPT_POSTFIELDSIZE, ctx->response.size); //填充Content-Length,在CURLOPT_COPYPOSTFIELDS之前设置 curl_easy_setopt(ctx->curl, CURLOPT_COPYPOSTFIELDS, ctx->response.buff); 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_HTTPHEADER, ctx->headers); - curl_easy_setopt(ctx->curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(ctx->curl, CURLOPT_WRITEFUNCTION, curl_response_body_save_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_TIME, 2L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_LIMIT, 100L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); @@ -878,20 +853,12 @@ int tango_cache_fetch_start(struct tango_cache_ctx *ctx) { curl_easy_setopt(ctx->curl, CURLOPT_NOBODY, 1L); } - 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_get_response_body_cb); curl_easy_setopt(ctx->curl, CURLOPT_WRITEDATA, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_ERRORBUFFER, ctx->error); curl_easy_setopt(ctx->curl, CURLOPT_PRIVATE, ctx); - curl_easy_setopt(ctx->curl, CURLOPT_FOLLOWLOCATION, 1L); - curl_easy_setopt(ctx->curl, CURLOPT_CONNECTTIMEOUT_MS, 500L); - curl_easy_setopt(ctx->curl, CURLOPT_TIMEOUT, ctx->instance->transfer_timeout); //测试发现有某链接接收卡住的情况 curl_easy_setopt(ctx->curl, CURLOPT_HEADERFUNCTION, curl_get_response_header_cb); curl_easy_setopt(ctx->curl, CURLOPT_HEADERDATA, ctx); - //ctx->error="Operation too slow. Less than 1024 bytes/sec transferred the last 3 seconds" - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_TIME, 2L); - curl_easy_setopt(ctx->curl, CURLOPT_LOW_SPEED_LIMIT, 100L); + curl_set_common_options(ctx->curl, ctx->instance->transfer_timeout, ctx->error); rc = curl_multi_add_handle(ctx->instance->multi_hd, ctx->curl); assert(rc==CURLM_OK); diff --git a/cache/test/cache_evbase_test_threads.cpp b/cache/test/cache_evbase_test_threads.cpp index 9d3827b..b792bea 100644 --- a/cache/test/cache_evbase_test_threads.cpp +++ b/cache/test/cache_evbase_test_threads.cpp @@ -193,7 +193,6 @@ void* thread_upload_download(void *arg) { sprintf(filename_out, "file_index_%d_%d.bin", thread_data->thread_id, i); pdata->future = future_create(get_future_success, get_future_failed, pdata); - promise_set_ctx(future_to_promise(pdata->future), NULL, NULL); pdata->fp = fopen(filename_out, "w"); cache_evbase_fetch_object(instance_asyn, pdata->future, &getmeta); @@ -201,7 +200,6 @@ void* thread_upload_download(void *arg) else if(!strcasecmp(p, "DEL")) { pdata->future = future_create(del_future_success, del_future_failed, pdata); - promise_set_ctx(future_to_promise(pdata->future), NULL, NULL); sprintf(pdata->filename, "%s", filename_in); cache_evbase_delete_object(instance_asyn, pdata->future, filename_in); } @@ -210,7 +208,6 @@ void* thread_upload_download(void *arg) size_t filelen; p = get_file_content(filename_in, &filelen); pdata->future = future_create(put_future_success, put_future_failed, pdata); - promise_set_ctx(future_to_promise(pdata->future), NULL, NULL); if(cache_evbase_upload_once_data(instance_asyn, pdata->future, PUT_MEM_FREE, p, filelen, &putmeta, pdata->filename, 256)) { @@ -223,7 +220,6 @@ void* thread_upload_download(void *arg) { size_t readlen; pdata->future = future_create(put_future_success, put_future_failed, pdata); - promise_set_ctx(future_to_promise(pdata->future), NULL, NULL); struct evbuffer *evbuf = evbuffer_new(); char buffer[1024]; @@ -249,7 +245,6 @@ void* thread_upload_download(void *arg) else { pdata->future = future_create(put_future_success, put_future_failed, pdata); - promise_set_ctx(future_to_promise(pdata->future), NULL, NULL); ctx = cache_evbase_update_start(instance_asyn, pdata->future, &putmeta); if(ctx==NULL) diff --git a/cache/test/lib/libhiredis.a b/cache/test/lib/libhiredis.a index 670ea58f661f76385172a6664ff604f269442b2f..e0c95b67ef7cb022137a0ca0c3f41ecf0242403a 100644 GIT binary patch delta 27538 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 diff --git a/cache/test/tango_cache_test.c b/cache/test/tango_cache_test.c index 560673c..19c6b19 100644 --- a/cache/test/tango_cache_test.c +++ b/cache/test/tango_cache_test.c @@ -312,7 +312,7 @@ static void dummy_accept_callback(evutil_socket_t fd, short events, void *arg) ctx = tango_cache_update_start(tango_instance, pdata->future, &putmeta); if(ctx==NULL) { - put_future_failed(FUTURE_ERROR_CANCEL, "NULL", pdata); + put_future_failed(FUTURE_ERROR_CANCEL, "tango_cache_update_start_NULL", pdata); continue; } tango_cache_get_object_path(ctx, pdata->filename, 256);