From: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp> Current sheepdog allows the condition of a number of zones < a number of copies. But "dog vdi check" cannot handle the case well because it tries to create copies of lost/corrupted objects based on inode->nr_copies. This patch lets "dog vdi check" create a minimum number of copies and zones. Reported-by: Marcin Mirosław <marcin at mejor.pl> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp> --- v2: renameing, zones_nr -> sd_zones_nr dog/vdi.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/dog/vdi.c b/dog/vdi.c index 8fd4664..4847350 100644 --- a/dog/vdi.c +++ b/dog/vdi.c @@ -1800,11 +1800,11 @@ static void vdi_check_object_main(struct work *work) } static void queue_vdi_check_work(const struct sd_inode *inode, uint64_t oid, - uint64_t *done, struct work_queue *wq) + uint64_t *done, struct work_queue *wq, + int nr_copies) { struct vdi_check_info *info; const struct sd_vnode *tgt_vnodes[SD_MAX_COPIES]; - int nr_copies = inode->nr_copies; info = xzalloc(sizeof(*info) + sizeof(info->vcw[0]) * nr_copies); info->oid = oid; @@ -1830,6 +1830,7 @@ struct check_arg { const struct sd_inode *inode; uint64_t *done; struct work_queue *wq; + int nr_copies; }; static void check_cb(void *data, enum btree_node_type type, void *arg) @@ -1844,7 +1845,8 @@ static void check_cb(void *data, enum btree_node_type type, void *arg) oid = vid_to_data_oid(ext->vdi_id, ext->idx); *(carg->done) = (uint64_t)ext->idx * SD_DATA_OBJ_SIZE; vdi_show_progress(*(carg->done), carg->inode->vdi_size); - queue_vdi_check_work(carg->inode, oid, NULL, carg->wq); + queue_vdi_check_work(carg->inode, oid, NULL, carg->wq, + carg->nr_copies); } } } @@ -1855,8 +1857,9 @@ int do_vdi_check(const struct sd_inode *inode) uint64_t done = 0, oid; uint32_t vid; struct work_queue *wq; + int nr_copies = min((int)inode->nr_copies, sd_zones_nr); - if (sd_nodes_nr < inode->nr_copies) { + if (sd_nodes_nr < nr_copies) { sd_err("ABORT: Not enough active nodes for consistency-check"); return EXIT_FAILURE; } @@ -1865,7 +1868,8 @@ int do_vdi_check(const struct sd_inode *inode) init_fec(); - queue_vdi_check_work(inode, vid_to_vdi_oid(inode->vdi_id), NULL, wq); + queue_vdi_check_work(inode, vid_to_vdi_oid(inode->vdi_id), NULL, wq, + nr_copies); if (inode->store_policy == 0) { max_idx = count_data_objs(inode); @@ -1874,14 +1878,15 @@ int do_vdi_check(const struct sd_inode *inode) vid = INODE_GET_VID(inode, idx); if (vid) { oid = vid_to_data_oid(vid, idx); - queue_vdi_check_work(inode, oid, &done, wq); + queue_vdi_check_work(inode, oid, &done, wq, + nr_copies); } else { done += SD_DATA_OBJ_SIZE; vdi_show_progress(done, inode->vdi_size); } } } else { - struct check_arg arg = {inode, &done, wq}; + struct check_arg arg = {inode, &done, wq, nr_copies}; traverse_btree(dog_bnode_reader, inode, check_cb, &arg); vdi_show_progress(inode->vdi_size, inode->vdi_size); } -- 1.8.1.2 |