From: levin li <[email protected]>

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 <[email protected]>
---
 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);
        if (ret != SD_RES_SUCCESS)
                eprintf("failed to push object %x\n", ret);
 
-- 
1.7.10

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to