From: levin li <[email protected]>

---
 sheep/store.c |   20 ++++++++++++++++++--
 1 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/sheep/store.c b/sheep/store.c
index 56e3cd2..59eba86 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -222,7 +222,7 @@ static int forward_read_obj_req(struct request *req)
        struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&hdr;
        struct sd_vnode *e;
        uint64_t oid = hdr.oid;
-       int copies;
+       int copies, copies_index = 0;
 
        e = req->entry;
        nr = req->nr_vnodes;
@@ -243,11 +243,21 @@ static int forward_read_obj_req(struct request *req)
 
                if (is_myself(e[n].addr, e[n].port)) {
                        ret = do_local_io(req, hdr.epoch);
+
+                       if (SD_RES_SUCCESS != ret && 
+                       !(SD_RES_NO_OBJ == ret && hdr.flags & 
SD_FLAG_CMD_RECOVERY)) {
+
+                               dprintf("%x, read object %" PRIx64" locally 
failed.\n",
+                                               hdr.opcode, oid);
+                               break;
+                       }
+            
                        goto out;
                }
        }
 
-       n = obj_to_sheep(e, nr, oid, 0);
+fetch_again:
+       n = obj_to_sheep(e, nr, oid, copies_index);
 
        fd = get_sheep_fd(e[n].addr, e[n].port, e[n].node_idx, hdr.epoch);
        if (fd < 0) {
@@ -262,6 +272,12 @@ static int forward_read_obj_req(struct request *req)
 
        if (ret) { /* network errors */
                del_sheep_fd(fd);
+
+               copies_index ++;
+               if (copies_index < copies) {
+                       goto fetch_again;
+               }
+
                ret = SD_RES_NETWORK_ERROR;
        } else {
                memcpy(&req->rp, rsp, sizeof(*rsp));
-- 
1.7.1

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

Reply via email to