[sheepdog] [PATCH v4] dog: use a minimum number of copies and zones for vdi checking

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Mon Jan 20 05:22:27 CET 2014


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>
---

v4: check inode->copy_policy == 1 explicitly for future expansion

v3: handle a case of erasure coded VDIs

v2: renameing, zones_nr -> sd_zones_nr

 dog/vdi.c |   25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/dog/vdi.c b/dog/vdi.c
index 8fd4664..f9cd495 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,15 @@ 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 (inode->copy_policy == 1 && sd_zones_nr < nr_copies) {
+		sd_err("ABORT: Not enough active zones for consistency-checking"
+		       " erasure coded VDI");
+		return EXIT_FAILURE;
+	}
 
-	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 +1874,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 +1884,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.7.10.4




More information about the sheepdog mailing list