This is necessary to recover objects when we have less zones available
than the desired redundancy.

Signed-off-by: MORITA Kazutaka <[email protected]>
---
 sheep/ops.c         |    5 +++--
 sheep/plain_store.c |    2 +-
 sheep/recovery.c    |    4 ++--
 sheep/sheep_priv.h  |    2 +-
 sheep/vdi.c         |    9 +++++----
 5 files changed, 12 insertions(+), 10 deletions(-)

diff --git a/sheep/ops.c b/sheep/ops.c
index 5d6c80b..c6a4f3b 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -655,7 +655,7 @@ static int read_copy_from_replica(struct vnode_info 
*vnodes, uint32_t epoch,
        char name[128];
        int rounded_rand, local = -1;
 
-       nr_copies = get_obj_copy_number(oid);
+       nr_copies = get_obj_copy_number(oid, vnodes->nr_zones);
        oid_to_vnodes(vnodes->vnodes, vnodes->nr_vnodes, oid,
                      nr_copies, obj_vnodes);
 
@@ -765,7 +765,8 @@ int peer_read_obj(struct request *req)
        if (hdr->obj.copies)
                rsp->obj.copies = hdr->obj.copies;
        else
-               rsp->obj.copies = get_obj_copy_number(hdr->obj.oid);
+               rsp->obj.copies = get_obj_copy_number(hdr->obj.oid,
+                                                     req->vinfo->nr_zones);
 out:
        return ret;
 }
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index fe2ced9..9eb2fb6 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -307,7 +307,7 @@ static bool oid_stale(uint64_t oid)
        struct sd_vnode *obj_vnodes[SD_MAX_COPIES];
 
        vinfo = get_vnode_info();
-       nr_copies = get_obj_copy_number(oid);
+       nr_copies = get_obj_copy_number(oid, vinfo->nr_zones);
        if (!nr_copies) {
                ret = false;
                goto out;
diff --git a/sheep/recovery.c b/sheep/recovery.c
index 325f3a5..72c90cd 100644
--- a/sheep/recovery.c
+++ b/sheep/recovery.c
@@ -172,7 +172,7 @@ again:
                oid, tgt_epoch);
 
        /* Let's do a breadth-first search */
-       nr_copies = get_obj_copy_number(oid);
+       nr_copies = get_obj_copy_number(oid, old->nr_zones);
        for (i = 0; i < nr_copies; i++) {
                struct sd_vnode *tgt_vnode = oid_to_vnode(old->vnodes,
                                                          old->nr_vnodes,
@@ -516,7 +516,7 @@ static void screen_object_list(struct recovery_work *rw,
        int i, j;
 
        for (i = 0; i < nr_oids; i++) {
-               nr_objs = get_obj_copy_number(oids[i]);
+               nr_objs = get_obj_copy_number(oids[i], rw->cur_vinfo->nr_zones);
                if (!nr_objs) {
                        dprintf("can not find copy number for object %" PRIx64
                                "\n", oids[i]);
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index df30f57..224be51 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -215,7 +215,7 @@ int init_base_path(const char *dir);
 
 int fill_vdi_copy_list(void *data);
 int get_vdi_copy_number(uint32_t vid);
-int get_obj_copy_number(uint64_t oid);
+int get_obj_copy_number(uint64_t oid, int nr_zones);
 int get_max_copy_number(void);
 int get_req_copy_number(struct request *req);
 int add_vdi_copy_number(uint32_t vid, int nr_copies);
diff --git a/sheep/vdi.c b/sheep/vdi.c
index 80ec4b2..97d9f4e 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -86,7 +86,7 @@ int get_vdi_copy_number(uint32_t vid)
        return entry->nr_copies;
 }
 
-int get_obj_copy_number(uint64_t oid)
+int get_obj_copy_number(uint64_t oid, int nr_zones)
 {
        uint32_t vid;
        if (is_vdi_attr_obj(oid))
@@ -94,16 +94,17 @@ int get_obj_copy_number(uint64_t oid)
        else
                vid = oid_to_vid(oid);
 
-       return get_vdi_copy_number(vid);
+       return min(get_vdi_copy_number(vid), nr_zones);
 }
 
 int get_req_copy_number(struct request *req)
 {
        int nr_copies;
 
-       nr_copies = req->rq.obj.copies;
+       nr_copies = min((int)req->rq.obj.copies, req->vinfo->nr_zones);
        if (!nr_copies)
-               nr_copies = get_obj_copy_number(req->rq.obj.oid);
+               nr_copies = get_obj_copy_number(req->rq.obj.oid,
+                                               req->vinfo->nr_zones);
 
        return nr_copies;
 }
-- 
1.7.2.5

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

Reply via email to