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

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

diff --git a/sheep/recovery.c b/sheep/recovery.c
index 2f9fb22..ce43adb 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -87,19 +87,33 @@ static int recover_object_from_replica(uint64_t oid, struct 
vnode_info *old,
        struct sd_req hdr;
        struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
        unsigned rlen;
-       int nr_copies, ret;
+       int nr_copies, ret, start = 0;
        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)) {
+                       start = i;
+                       break;
+               }
+       }
+
        rlen = get_objsize(oid);
        buf = xvalloc(rlen);
 
        /* 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;
+               int idx = (i + start) % nr_copies;
 
-               vnode = oid_to_vnode(old->vnodes, old->nr_vnodes, oid, i);
+               vnode = oid_to_vnode(old->vnodes, old->nr_vnodes, oid, idx);
 
                if (is_invalid_vnode(vnode, cur->nodes, cur->nr_nodes))
                        continue;
-- 
1.7.9.5

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

Reply via email to