On Wed, Jun 27, 2012 at 11:07 AM, levin li <levin108 at gmail.com> wrote: > 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 ++++++++---------------- > 2 files changed, 10 insertions(+), 17 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); sys->outstanding_data_size would be updated in alloc_local_request() which was called in exec_local_req(), this will be a race. > if (ret != SD_RES_SUCCESS) > eprintf("failed to push object %x\n", ret); > > -- > 1.7.10 > > -- > sheepdog mailing list > sheepdog at lists.wpkg.org > http://lists.wpkg.org/mailman/listinfo/sheepdog -- Yunkai Zhang Work at Taobao |