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

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

diff --git a/sheep/recovery.c b/sheep/recovery.c
index dc38dac..688058a 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -141,7 +141,7 @@ static int do_recover_object(struct recovery_work *rw)
        struct vnode_info *old;
        uint64_t oid = rw->oids[rw->done];
        uint32_t epoch = rw->epoch, tgt_epoch = rw->epoch;
-       int nr_copies, ret, i;
+       int nr_copies, ret, i, start = 0;
 
        old = grab_vnode_info(rw->old_vinfo);
 
@@ -149,13 +149,26 @@ again:
        sd_dprintf("try recover object %"PRIx64" from epoch %"PRIu32, oid,
                   tgt_epoch);
 
-       /* Let's do a breadth-first search */
        nr_copies = get_obj_copy_number(oid, old->nr_zones);
+       /* find local node first to try to recover from local */
        for (i = 0; i < nr_copies; i++) {
                const struct sd_vnode *tgt_vnode;
 
                tgt_vnode = oid_to_vnode(old->vnodes, old->nr_vnodes, oid, i);
 
+               if (vnode_is_local(tgt_vnode)) {
+                       start = i;
+                       break;
+               }
+       }
+
+       /* Let's do a breadth-first search */
+       for (i = 0; i < nr_copies; i++) {
+               const struct sd_vnode *tgt_vnode;
+               int idx = (i + start) % nr_copies;
+
+               tgt_vnode = oid_to_vnode(old->vnodes, old->nr_vnodes, oid, idx);
+
                if (is_invalid_vnode(tgt_vnode, rw->cur_vinfo->nodes,
                                     rw->cur_vinfo->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