[sheepdog] [PATCH 2/2] sheep: clean leaked object during recycling VID

Hitoshi Mitake mitake.hitoshi at lab.ntt.co.jp
Sat May 30 16:00:28 CEST 2015


This patch let sheep collect garbage objects during VID recycling. It
is required because sheepdog doesn't have mtadata journaling.

Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
---
 sheep/vdi.c | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/sheep/vdi.c b/sheep/vdi.c
index 49ee2f5..7f6cf67 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -2197,6 +2197,26 @@ main_fn void free_vdi_state_snapshot(int epoch)
 	panic("invalid free request for vdi state snapshot, epoch: %d", epoch);
 }
 
+static int clean_matched_obj(uint64_t oid, const char *path,
+			     uint32_t epoch, uint8_t ec_index,
+			     struct vnode_info *vinfo, void *arg)
+{
+	uint32_t vid = oid_to_vid(*(uint64_t *)arg);
+	int ret = SD_RES_SUCCESS;
+
+	if (oid_to_vid(oid) == vid) {
+		sd_info("removing object %"PRIx64" (path: %s), it means the"
+			" object is leaked", oid, path);
+		ret = unlink(path);
+		if (ret) {
+			sd_err("failed to unlink %s", path);
+			ret = SD_RES_EIO;
+		}
+	}
+
+	return ret;
+}
+
 static main_fn void do_vid_gc(struct vdi_family_member *member)
 {
 	struct vdi_state_entry *entry = member->entry;
@@ -2216,9 +2236,10 @@ static main_fn void do_vid_gc(struct vdi_family_member *member)
 
 	free(member);
 
-	if (sd_store && sd_store->exist(oid, -1))
-		/* TODO: gc other objects */
+	if (sd_store && sd_store->exist(oid, -1)) {
 		sd_store->remove_object(oid, -1);
+		for_each_object_in_wd(clean_matched_obj, false, &oid);
+	}
 
 	atomic_clear_bit(vid, sys->vdi_inuse);
 	atomic_clear_bit(vid, sys->vdi_deleted);
-- 
1.9.1



More information about the sheepdog mailing list