From: levin li <xingke.lwp at taobao.com> The same reason as write/read/remove_object(), push_cache_object() also needs a retrying machanism like gateway, so we also queue a local gateway request instead of directly calling forward_write_obj_req(). Signed-off-by: levin li <xingke.lwp at taobao.com> --- sheep/gateway.c | 3 ++- sheep/object_cache.c | 24 ++++++++---------------- sheep/sdnet.c | 2 +- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/sheep/gateway.c b/sheep/gateway.c index 42f028a..18ab926 100644 --- a/sheep/gateway.c +++ b/sheep/gateway.c @@ -216,7 +216,8 @@ void do_gateway_request(struct work *work) dprintf("%x, %" PRIx64" , %u\n", req->rq.opcode, req->rq.obj.oid, req->rq.epoch); - if (!sys->enable_write_cache || bypass_object_cache(req)) { + if (!sys->enable_write_cache || req->local || + bypass_object_cache(req)) { if (req->rq.flags & SD_FLAG_CMD_WRITE) ret = forward_write_obj_req(req); else diff --git a/sheep/object_cache.c b/sheep/object_cache.c index 1854a77..e538cda 100644 --- a/sheep/object_cache.c +++ b/sheep/object_cache.c @@ -552,8 +552,7 @@ static uint64_t idx_to_oid(uint32_t vid, uint32_t idx) static int push_cache_object(struct vnode_info *vnode_info, uint32_t vid, uint32_t idx, uint64_t bmap, int create) { - struct request fake_req; - struct sd_req *hdr = &fake_req.rq; + struct sd_req hdr; void *buf; off_t offset; unsigned data_length; @@ -568,8 +567,6 @@ static int push_cache_object(struct vnode_info *vnode_info, uint32_t vid, return SD_RES_SUCCESS; } - memset(&fake_req, 0, sizeof(fake_req)); - first_bit = ffsll(bmap) - 1; last_bit = fls64(bmap) - 1; @@ -595,20 +592,15 @@ static int push_cache_object(struct vnode_info *vnode_info, uint32_t vid, if (ret != SD_RES_SUCCESS) goto out; - hdr->opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ; - hdr->flags = SD_FLAG_CMD_WRITE; - hdr->data_length = data_length; - hdr->epoch = sys_epoch(); - - hdr->obj.oid = oid; - hdr->obj.offset = offset; - hdr->obj.copies = sys->nr_copies; + memset(&hdr, 0, sizeof(hdr)); + hdr.opcode = create ? SD_OP_CREATE_AND_WRITE_OBJ : SD_OP_WRITE_OBJ; + hdr.flags = SD_FLAG_CMD_WRITE; - fake_req.data = buf; - fake_req.op = get_sd_op(hdr->opcode); - fake_req.vnodes = vnode_info; + hdr.obj.oid = oid; + hdr.obj.offset = offset; + hdr.obj.copies = sys->nr_copies; - ret = forward_write_obj_req(&fake_req); + ret = exec_local_req(&hdr, buf, data_length); if (ret != SD_RES_SUCCESS) eprintf("failed to push object %x\n", ret); diff --git a/sheep/sdnet.c b/sheep/sdnet.c index dc860f5..02e2d12 100644 --- a/sheep/sdnet.c +++ b/sheep/sdnet.c @@ -471,11 +471,11 @@ void req_done(struct request *req) struct client_info *ci = req->ci; if (req->local) { - req->done = 1; sys->nr_outstanding_reqs--; sys->outstanding_data_size -= req->data_length; pthread_mutex_lock(&req->wait_mutex); + req->done = 1; pthread_cond_signal(&req->wait_cond); pthread_mutex_unlock(&req->wait_mutex); } else { -- 1.7.10 |