[Sheepdog] [PATCH v5 17/17] store: abstract VDI bitmap set-up

Liu Yuan namei.unix at gmail.com
Fri Dec 30 14:07:12 CET 2011


From: Liu Yuan <tailai.ly at taobao.com>

Sheep needs to set system VDI bitmap when starting up. And VDI object
is stored in the underlying backend stores which have different layouts.

Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
 sheep/farm/farm.c    |   37 +++++++++++++++++++++++++++++++++++++
 sheep/simple_store.c |   43 +++++++++++++++++++++++++++++++++++++++++--
 sheep/store.c        |   46 ++--------------------------------------------
 3 files changed, 80 insertions(+), 46 deletions(-)

diff --git a/sheep/farm/farm.c b/sheep/farm/farm.c
index d4b0bd4..da36bc4 100644
--- a/sheep/farm/farm.c
+++ b/sheep/farm/farm.c
@@ -185,6 +185,40 @@ static int farm_close(uint64_t oid, struct siocb *iocb)
 	return SD_RES_SUCCESS;
 }
 
+static int init_sys_vdi_bitmap(char *path)
+{
+	DIR *dir;
+	struct dirent *dent;
+
+	dir = opendir(path);
+	if (!dir) {
+		vprintf(SDOG_ERR, "failed to open the working directory: %m\n");
+		return -1;
+	}
+
+	vprintf(SDOG_INFO, "found the working directory %s\n", path);
+	while ((dent = readdir(dir))) {
+		uint64_t oid;
+
+		if (!strcmp(dent->d_name, "."))
+			continue;
+
+		oid = strtoull(dent->d_name, NULL, 16);
+		if (oid == 0 || oid == ULLONG_MAX)
+			continue;
+
+		if (!is_vdi_obj(oid))
+			continue;
+
+		vprintf(SDOG_DEBUG, "found the VDI object %" PRIx64 "\n", oid);
+
+		set_bit(oid_to_vid(oid), sys->vdi_inuse);
+	}
+	closedir(dir);
+
+	return 0;
+}
+
 static int farm_init(char *p)
 {
 	dprintf("use farm store driver\n");
@@ -197,6 +231,9 @@ static int farm_init(char *p)
 	if (snap_init() < 0)
 		goto err;
 
+	if (init_sys_vdi_bitmap(p) < 0)
+		goto err;
+
 	return SD_RES_SUCCESS;
 err:
 	return SD_RES_EIO;
diff --git a/sheep/simple_store.c b/sheep/simple_store.c
index 224bcd1..2edc6d6 100644
--- a/sheep/simple_store.c
+++ b/sheep/simple_store.c
@@ -36,8 +36,47 @@ struct store_driver store;
 
 static int simple_store_init(char *path)
 {
-	eprintf("Use simple store driver\n");
-	return 0;
+	int epoch, latest_epoch;
+	DIR *dir;
+	struct dirent *dent;
+	char p[PATH_MAX];
+
+	eprintf("use simple store driver\n");
+	strcpy(p, path);
+	latest_epoch = get_latest_epoch();
+	for (epoch = 1; epoch <= latest_epoch; epoch++) {
+		snprintf(p, PATH_MAX, "%s/%08u", path, epoch);
+		dir = opendir(p);
+		if (!dir) {
+			if (errno == ENOENT)
+				continue;
+
+			vprintf(SDOG_ERR, "failed to open the epoch directory: %m\n");
+			return SD_RES_EIO;
+		}
+
+		vprintf(SDOG_INFO, "found the object directory %s\n", path);
+		while ((dent = readdir(dir))) {
+			uint64_t oid;
+
+			if (!strcmp(dent->d_name, ".") ||
+					!strcmp(dent->d_name, ".."))
+				continue;
+
+			oid = strtoull(dent->d_name, NULL, 16);
+			if (oid == 0 || oid == ULLONG_MAX)
+				continue;
+			
+			if (!is_vdi_obj(oid))
+				continue;
+
+			vprintf(SDOG_DEBUG, "found the VDI object %" PRIx64 "\n", oid);
+
+			set_bit(oid_to_vid(oid), sys->vdi_inuse);
+		}
+		closedir(dir);
+	}
+	return SD_RES_SUCCESS;
 }
 
 static int store_write_last_sector(uint64_t oid, struct siocb *iocb)
diff --git a/sheep/store.c b/sheep/store.c
index 7c46f9d..c00cce6 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -1886,54 +1886,12 @@ static int init_obj_path(const char *base_path)
 
 static int init_epoch_path(const char *base_path)
 {
-	int new, ret;
-	uint32_t epoch, latest_epoch;
-	DIR *dir;
-	char path[1024];
-	struct dirent *dent;
-	uint64_t oid;
+	int new;
 
 	epoch_path = zalloc(strlen(base_path) + strlen(EPOCH_PATH) + 1);
 	sprintf(epoch_path, "%s" EPOCH_PATH, base_path);
 
-	ret = init_path(epoch_path, &new);
-	if (new || ret)
-		return ret;
-
-	latest_epoch = get_latest_epoch();
-
-	for (epoch = 1; epoch <= latest_epoch; epoch++) {
-		snprintf(path, sizeof(path), "%s/%08u", obj_path, epoch);
-
-		vprintf(SDOG_INFO, "found the object directory %s\n", path);
-
-		dir = opendir(path);
-		if (!dir) {
-			if (errno == ENOENT)
-				continue;
-
-			vprintf(SDOG_ERR, "failed to open the epoch directory: %m\n");
-			return SD_RES_EIO;
-		}
-
-		while ((dent = readdir(dir))) {
-			if (!strcmp(dent->d_name, ".") ||
-			    !strcmp(dent->d_name, ".."))
-				continue;
-
-			oid = strtoull(dent->d_name, NULL, 16);
-
-			if (!is_vdi_obj(oid))
-				continue;
-
-			vprintf(SDOG_DEBUG, "found the VDI object %" PRIx64 "\n", oid);
-
-			set_bit(oid_to_vid(oid), sys->vdi_inuse);
-		}
-		closedir(dir);
-	}
-
-	return 0;
+	return init_path(epoch_path, &new);
 }
 
 static int init_mnt_path(const char *base_path)
-- 
1.7.8.rc3




More information about the sheepdog mailing list