支持promise finish。

This commit is contained in:
zhangchengwei
2018-11-23 20:55:28 +08:00
committed by zhengchao
parent 313f36c58a
commit 9fc2a8a0d2
8 changed files with 85 additions and 29 deletions

View File

@@ -28,6 +28,7 @@ enum CACHE_ASYN_CMD
CACHE_ASYN_UPLOAD_FRAG_DATA,
CACHE_ASYN_UPLOAD_FRAG_EVBUF,
CACHE_ASYN_UPLOAD_END,
CACHE_ASYN_UPLOAD_CANCEL,
CACHE_ASYN_DELETE,
CACHE_ASYN_HEAD,
};
@@ -153,21 +154,21 @@ static void cache_asyn_ctx_destroy(struct cache_evbase_ctx *ctx_asyn)
static void cache_asyn_ioevent_dispatch(struct databuffer *buffer)
{
struct cache_evbase_ctx *ctx_asyn=buffer->ctx_asyn;
struct future *f;
struct promise *p;
int ret=0;
switch(buffer->cmd_type)
{
case CACHE_ASYN_FETCH:
f = ctx_asyn->ctx->future;
p = ctx_asyn->ctx->promise;
if(tango_cache_fetch_start(ctx_asyn->ctx) < 0)
{
promise_failed(future_to_promise(f), FUTURE_ERROR_CANCEL, "CACHE_ASYN_FETCH failed");
promise_failed(p, FUTURE_ERROR_CANCEL, "CACHE_ASYN_FETCH failed");
}
cache_asyn_ctx_destroy(ctx_asyn);
break;
case CACHE_ASYN_HEAD:
f = ctx_asyn->ctx->future;
p = ctx_asyn->ctx->promise;
if(ctx_asyn->instance_asyn->instance->param->head_meta_source == HEAD_META_FROM_REDIS)
{
ret = tango_cache_head_redis(ctx_asyn->ctx);
@@ -178,7 +179,7 @@ static void cache_asyn_ioevent_dispatch(struct databuffer *buffer)
}
if(ret<0)
{
promise_failed(future_to_promise(f), FUTURE_ERROR_CANCEL, "CACHE_ASYN_HEAD failed");
promise_failed(p, FUTURE_ERROR_CANCEL, "CACHE_ASYN_HEAD failed");
}
cache_asyn_ctx_destroy(ctx_asyn);
break;
@@ -217,6 +218,10 @@ static void cache_asyn_ioevent_dispatch(struct databuffer *buffer)
tango_cache_update_end(ctx_asyn->ctx);
cache_asyn_ctx_destroy(ctx_asyn);
break;
case CACHE_ASYN_UPLOAD_CANCEL:
tango_cache_update_cancel(ctx_asyn->ctx);
cache_asyn_ctx_destroy(ctx_asyn);
break;
default: assert(0);break;
}
}
@@ -286,6 +291,26 @@ void cache_evbase_update_end(struct cache_evbase_ctx *ctx_asyn)
}
}
void cache_evbase_update_cancel(struct cache_evbase_ctx *ctx_asyn)
{
struct databuffer *buffer;
buffer = (struct databuffer *)malloc(sizeof(struct databuffer));
buffer->ctx_asyn = ctx_asyn;
buffer->cmd_type = CACHE_ASYN_UPLOAD_CANCEL;
if(iothread_notify_event(ctx_asyn->instance_asyn->notify_sendfd, &buffer, sizeof(void *), 2) != sizeof(void *))
{
if(!ctx_asyn->ctx->fail_state)
{
tango_cache_set_fail_state(ctx_asyn->ctx, CACHE_ERR_SOCKPAIR);
}
tango_cache_ctx_destroy(ctx_asyn->ctx, false);
cache_asyn_ctx_destroy(ctx_asyn);
free(buffer);
}
}
int cache_evbase_update_frag_data(struct cache_evbase_ctx *ctx_asyn, enum PUT_MEMORY_COPY_WAY way, const char *data, size_t size)
{
struct databuffer *buffer;