[Sheepdog] [PATCH 3/3] sheep: split merge_objlist()
Liu Yuan
namei.unix at gmail.com
Mon Dec 5 07:39:18 CET 2011
From: Liu Yuan <tailai.ly at taobao.com>
We actually use merge_objlist() for two different purposes, that is screening
and mergeing. Let's split them out to make code more readable, since nothing
these two share.
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/store.c | 57 ++++++++++++++++++++++++++++++++++++---------------------
1 files changed, 36 insertions(+), 21 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index c32d23c..de952d4 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -97,9 +97,8 @@ int stat_sheep(uint64_t *store_size, uint64_t *store_free, uint32_t epoch)
return SD_RES_SUCCESS;
}
-static int merge_objlist(struct sheepdog_vnode_list_entry *entries, int nr_entries,
- uint64_t *list1, int nr_list1,
- uint64_t *list2, int nr_list2, int nr_objs);
+static int merge_objlist(uint64_t *list1, int nr_list1,
+ uint64_t *list2, int nr_list2);
int get_obj_list(const struct sd_list_req *hdr, struct sd_list_rsp *rsp, void *data)
{
@@ -151,7 +150,7 @@ int get_obj_list(const struct sd_list_req *hdr, struct sd_list_rsp *rsp, void *d
closedir(dir);
- nr = merge_objlist(NULL, 0, p, nr, objlist, obj_nr, 0);
+ nr = merge_objlist(p, nr, objlist, obj_nr);
}
out:
free(buf);
@@ -1616,29 +1615,17 @@ static int __fill_obj_list(struct sheepdog_node_list_entry *e, uint32_t epoch,
return -1;
}
- dprintf("%"PRIu32"\n", rsp->data_length);
+ dprintf("%lu\n", rsp->data_length / sizeof(uint64_t));
return rsp->data_length / sizeof(uint64_t);
}
-static int merge_objlist(struct sheepdog_vnode_list_entry *entries, int nr_entries,
- uint64_t *list1, int nr_list1,
- uint64_t *list2, int nr_list2, int nr_objs)
+static int merge_objlist(uint64_t *list1, int nr_list1, uint64_t *list2, int nr_list2)
{
- int i, j, idx;
+ int i;
int old_nr_list1 = nr_list1;
for (i = 0; i < nr_list2; i++) {
- if (entries) {
- for (j = 0; j < nr_objs; j++) {
- idx = obj_to_sheep(entries, nr_entries, list2[i], j);
- if (is_myself(entries[idx].addr, entries[idx].port))
- break;
- }
- if (j == nr_objs)
- continue;
- }
-
if (bsearch(list2 + i, list1, old_nr_list1, sizeof(*list1), obj_cmp))
continue;
@@ -1650,6 +1637,31 @@ static int merge_objlist(struct sheepdog_vnode_list_entry *entries, int nr_entri
return nr_list1;
}
+static int screen_obj_list(struct sheepdog_vnode_list_entry *nodes, int nodes_nr,
+ uint64_t *list, int list_nr, int nr_objs)
+{
+ int ret, i, cp, idx;
+ struct strbuf buf = STRBUF_INIT;
+
+ for (i = 0; i < list_nr; i++) {
+ for (cp = 0; cp < nr_objs; cp++) {
+ idx = obj_to_sheep(nodes, nodes_nr, list[i], cp);
+ if (is_myself(nodes[idx].addr, nodes[idx].port))
+ break;
+ }
+ if (cp == nr_objs)
+ continue;
+ strbuf_add(&buf, &list[i], sizeof(uint64_t));
+ }
+ memcpy(list, buf.buf, buf.len);
+
+ ret = buf.len / sizeof(uint64_t);
+ dprintf("%d\n", ret);
+ strbuf_release(&buf);
+
+ return ret;
+}
+
#define MAX_RETRY_CNT 6
static int fill_obj_list(struct recovery_work *rw,
@@ -1696,10 +1708,13 @@ static int fill_obj_list(struct recovery_work *rw,
goto retry;
}
}
- rw->count = merge_objlist(rw->cur_vnodes, rw->cur_nr_vnodes, rw->oids,
- rw->count, (uint64_t *)buf, nr, nr_objs);
+ nr = screen_obj_list(rw->cur_vnodes, rw->cur_nr_vnodes, (uint64_t *)buf,
+ nr, nr_objs);
+ if (nr)
+ rw->count = merge_objlist(rw->oids, rw->count, (uint64_t *)buf, nr);
}
+ dprintf("%d\n", rw->count);
free(buf);
return 0;
fail:
--
1.7.8.rc3
More information about the sheepdog
mailing list