This is necessary to recover objects when we have less zones available than the desired redundancy. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- 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 |