[1]统一GET/PUT结束后结果通知机制,API直接调用失败时不回调,其他情况回调(promise);
[2]hiredis版本确定为0.14.0版; [3]修复tango_cache_ctx_destroy中TAILQ内存释放的BUG;
This commit is contained in:
41
cache/src/tango_cache_client.cpp
vendored
41
cache/src/tango_cache_client.cpp
vendored
@@ -94,6 +94,7 @@ const char *tango_cache_get_errstring(const struct tango_cache_ctx *ctx)
|
||||
case CACHE_ERR_INTERNAL:return "internal error";
|
||||
case CACHE_ERR_REDIS_JSON:return "parse redis json error";
|
||||
case CACHE_ERR_REDIS_CONNECT:return "redis is not connected";
|
||||
case CACHE_OUTOF_SESSION:return "two many curl sessions";
|
||||
default: return ctx->error;
|
||||
}
|
||||
}
|
||||
@@ -194,7 +195,8 @@ void easy_string_savedata(struct easy_string *estr, const char *data, size_t len
|
||||
estr->buff[estr->len]='\0';
|
||||
}
|
||||
|
||||
void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx)
|
||||
//callback: <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪΪ<D2AA><CEAA><EFBFBD><EFBFBD>ֱ<EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>APIʱʧ<CAB1>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ٵ<EFBFBD><D9B5>ûص<C3BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ж<EFBFBD>
|
||||
void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx, bool callback)
|
||||
{
|
||||
struct multipart_etag_list *etag;
|
||||
|
||||
@@ -220,7 +222,7 @@ void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx)
|
||||
ctx->instance->statistic.memory_used -= evbuffer_get_length(ctx->put.evbuf);
|
||||
evbuffer_free(ctx->put.evbuf);
|
||||
}
|
||||
TAILQ_FOREACH(etag, &ctx->put.etag_head, node)
|
||||
while(NULL != (etag = TAILQ_FIRST(&ctx->put.etag_head)))
|
||||
{
|
||||
TAILQ_REMOVE(&ctx->put.etag_head, etag, node);
|
||||
free(etag->etag);
|
||||
@@ -232,7 +234,7 @@ void tango_cache_ctx_destroy(struct tango_cache_ctx *ctx)
|
||||
curl_slist_free_all(ctx->headers);
|
||||
}//no break here
|
||||
case CACHE_REQUEST_DELETE:
|
||||
if(ctx->future != NULL)
|
||||
if(callback && ctx->future != NULL)
|
||||
{
|
||||
if(ctx->fail_state)
|
||||
{
|
||||
@@ -263,6 +265,7 @@ int tango_cache_update_frag_data(struct tango_cache_ctx *ctx, const char *data,
|
||||
}
|
||||
if(evbuffer_add(ctx->put.evbuf, data, size))
|
||||
{
|
||||
tango_cache_set_fail_state(ctx, CACHE_OUTOF_MEMORY);
|
||||
return -1;
|
||||
}
|
||||
ctx->instance->statistic.memory_used += size;
|
||||
@@ -287,6 +290,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;
|
||||
}
|
||||
}
|
||||
@@ -294,6 +298,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;
|
||||
}
|
||||
}
|
||||
@@ -311,7 +316,7 @@ struct tango_cache_ctx *tango_cache_update_prepare(struct tango_cache_instance *
|
||||
char buffer[2064];
|
||||
time_t expires, now, last_modify;
|
||||
|
||||
if((u_int64_t)instance->statistic.memory_used >= instance->cache_limit_size)
|
||||
if((u_int64_t)instance->statistic.memory_used>=instance->cache_limit_size || instance->statistic.session_num>=instance->max_session_num)
|
||||
{
|
||||
instance->error_code = CACHE_OUTOF_MEMORY;
|
||||
instance->statistic.totaldrop_num += 1;
|
||||
@@ -441,6 +446,13 @@ struct tango_cache_ctx *tango_cache_fetch_prepare(struct tango_cache_instance *i
|
||||
struct tango_cache_ctx *ctx;
|
||||
char sha256[72];
|
||||
|
||||
if(instance->head_meta_source!=HEAD_META_FROM_REDIS && instance->statistic.session_num>=instance->max_session_num)
|
||||
{
|
||||
instance->error_code = CACHE_OUTOF_SESSION;
|
||||
instance->statistic.totaldrop_num += 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx = (struct tango_cache_ctx *)calloc(1, sizeof(struct tango_cache_ctx));
|
||||
ctx->instance = instance;
|
||||
ctx->future = f;
|
||||
@@ -477,7 +489,7 @@ int tango_cache_fetch_object(struct tango_cache_instance *instance, struct futur
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
return tango_cache_fetch_start(ctx);
|
||||
return (tango_cache_fetch_start(ctx)==1)?0:-1;
|
||||
}
|
||||
|
||||
int tango_cache_head_object(struct tango_cache_instance *instance, struct future* f, struct tango_cache_meta_get *meta)
|
||||
@@ -496,7 +508,7 @@ int tango_cache_head_object(struct tango_cache_instance *instance, struct future
|
||||
}
|
||||
else
|
||||
{
|
||||
return tango_cache_fetch_start(ctx);
|
||||
return (tango_cache_fetch_start(ctx)==1)?0:-1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -505,6 +517,13 @@ struct tango_cache_ctx *tango_cache_delete_prepare(struct tango_cache_instance *
|
||||
struct tango_cache_ctx *ctx;
|
||||
char sha256[72];
|
||||
|
||||
if(instance->statistic.session_num >= instance->max_session_num)
|
||||
{
|
||||
instance->error_code = CACHE_OUTOF_SESSION;
|
||||
instance->statistic.totaldrop_num += 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx = (struct tango_cache_ctx *)calloc(1, sizeof(struct tango_cache_ctx));
|
||||
ctx->instance = instance;
|
||||
ctx->future = f;
|
||||
@@ -546,6 +565,13 @@ struct tango_cache_ctx *tango_cache_multi_delete_prepare(struct tango_cache_inst
|
||||
struct tango_cache_ctx *ctx;
|
||||
char md5[48]={0}, content_md5[48];
|
||||
|
||||
if(instance->statistic.session_num >= instance->max_session_num)
|
||||
{
|
||||
instance->error_code = CACHE_OUTOF_SESSION;
|
||||
instance->statistic.totaldrop_num += 1;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ctx = (struct tango_cache_ctx *)calloc(1, sizeof(struct tango_cache_ctx));
|
||||
ctx->instance = instance;
|
||||
ctx->future = f;
|
||||
@@ -755,9 +781,12 @@ static int load_local_configure(struct tango_cache_instance *instance, const cha
|
||||
|
||||
MESA_load_profile_uint_def(profile_path, section, "MAX_CONNECTION_PER_HOST", &intval, 0);
|
||||
instance->max_cnn_host = intval;
|
||||
MESA_load_profile_uint_def(profile_path, section, "MAX_CURL_SESSION_NUM", &instance->max_session_num, 200);
|
||||
MESA_load_profile_uint_def(profile_path, section, "MAX_USED_MEMORY_SIZE_MB", &intval, 5120);
|
||||
longval = intval;
|
||||
instance->cache_limit_size = longval * 1024 * 1024;
|
||||
MESA_load_profile_uint_def(profile_path, section, "MAX_CURL_TRANSFER_TIMEOUT_S", &intval, 15);
|
||||
instance->transfer_timeout = intval;
|
||||
if(MESA_load_profile_string_nodef(profile_path, section, "CACHE_BUCKET_NAME", instance->bucketname, 256) < 0)
|
||||
{
|
||||
MESA_HANDLE_RUNTIME_LOGV2(instance->runtime_log, RLOG_LV_FATAL, "Load config %s [%s] CACHE_BUCKET_NAME not found.\n", profile_path, section);
|
||||
|
||||
Reference in New Issue
Block a user