[Sheepdog] [PATCH 14/14] retry getting object list when an error occurs
MORITA Kazutaka
morita.kazutaka at lab.ntt.co.jp
Sat May 14 09:03:59 CEST 2011
Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
sheep/store.c | 19 ++++++++++++++++---
1 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index 6cb60de..82176a5 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -1638,6 +1638,8 @@ static int merge_objlist(struct sheepdog_vnode_list_entry *entries, int nr_entri
return nr_list1;
}
+#define MAX_RETRY_CNT 6
+
static int fill_obj_list(struct recovery_work *rw,
struct sheepdog_node_list_entry *old_entry, int old_nr,
struct sheepdog_node_list_entry *cur_entry, int cur_nr,
@@ -1647,7 +1649,7 @@ static int fill_obj_list(struct recovery_work *rw,
uint8_t *buf = NULL;
size_t buf_size = SD_DATA_OBJ_SIZE; /* FIXME */
struct sheepdog_vnode_list_entry vnodes[SD_MAX_VNODES];
- int nr_vnodes;
+ int nr_vnodes, retry_cnt = 0;
buf = malloc(buf_size);
if (!buf)
@@ -1665,9 +1667,20 @@ static int fill_obj_list(struct recovery_work *rw,
/* cur_entry[i] doesn't have a list file */
continue;
+ retry:
nr = __fill_obj_list(cur_entry + i, rw->epoch, buf, buf_size);
- if (nr < 0)
- goto fail;
+ if (nr < 0) {
+ retry_cnt++;
+ if (retry_cnt > MAX_RETRY_CNT) {
+ eprintf("failed to get object list\n");
+ eprintf("some objects may be lost\n");
+ continue;
+ } else {
+ dprintf("retry get object list\n");
+ sleep(1);
+ goto retry;
+ }
+ }
rw->count = merge_objlist(vnodes, nr_vnodes, rw->oids,
rw->count, (uint64_t *)buf, nr, nr_objs);
}
--
1.5.6.5
More information about the sheepdog
mailing list