From: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>

Signed-off-by: MORITA Kazutaka <morita.kazut...@lab.ntt.co.jp>
---
 sheep/recovery.c |   27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/sheep/recovery.c b/sheep/recovery.c
index bf54b63..46c167c 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -91,6 +91,23 @@ static int recover_object_from_replica(uint64_t oid, struct 
vnode_info *old,
        void *buf = NULL;
        struct siocb iocb = { 0 };
 
+       nr_copies = get_obj_copy_number(oid, old->nr_zones);
+
+       /* find local node first to try to recover from local */
+       for (int i = 0; i < nr_copies; i++) {
+               const struct sd_vnode *vnode;
+
+               vnode = oid_to_vnode(old->vnodes, old->nr_vnodes, oid, i);
+
+               if (vnode_is_local(vnode)) {
+                       if (tgt_epoch < sys_epoch())
+                               ret = sd_store->link(oid, tgt_epoch);
+                       else
+                               ret = SD_RES_NO_OBJ;
+                       goto out;
+               }
+       }
+
        rlen = get_objsize(oid);
        buf = valloc(rlen);
        if (!buf) {
@@ -100,7 +117,6 @@ static int recover_object_from_replica(uint64_t oid, struct 
vnode_info *old,
        }
 
        /* Let's do a breadth-first search */
-       nr_copies = get_obj_copy_number(oid, old->nr_zones);
        for (int i = 0; i < nr_copies; i++) {
                const struct sd_vnode *vnode;
 
@@ -109,13 +125,8 @@ static int recover_object_from_replica(uint64_t oid, 
struct vnode_info *old,
                if (is_invalid_vnode(vnode, cur->nodes, cur->nr_nodes))
                        continue;
 
-               if (vnode_is_local(vnode)) {
-                       if (tgt_epoch < sys_epoch())
-                               ret = sd_store->link(oid, tgt_epoch);
-                       else
-                               ret = SD_RES_NO_OBJ;
-                       goto out;
-               }
+               if (vnode_is_local(vnode))
+                       continue;
 
                sd_init_req(&hdr, SD_OP_READ_PEER);
                hdr.epoch = epoch;
-- 
1.7.9.5

-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to