[sheepdog] [PATCH 1/2] sheep: pass epoch number to for_each_object_in_path() callback

MORITA Kazutaka morita.kazutaka at gmail.com
Mon May 27 18:43:04 CEST 2013


From: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>

This prepares the next patch.

Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
 sheep/md.c          |   19 ++++++++++++++-----
 sheep/plain_store.c |   14 +++++++++-----
 sheep/sheep_priv.h  |    6 ++++--
 3 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/sheep/md.c b/sheep/md.c
index 4302b80..a0fbe8c 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -181,7 +181,8 @@ static inline void calculate_vdisks(struct disk *disks, int nr_disks,
 #define MDNAME	"user.md.size"
 #define MDSIZE	sizeof(uint64_t)
 
-static int get_total_object_size(uint64_t oid, char *wd, void *total)
+static int get_total_object_size(uint64_t oid, char *wd, uint32_t epoch,
+				 void *total)
 {
 	uint64_t *t = total;
 	struct stat s;
@@ -198,7 +199,8 @@ static int get_total_object_size(uint64_t oid, char *wd, void *total)
 
 /* If cleanup is true, temporary objects will be removed */
 static int for_each_object_in_path(char *path,
-				   int (*func)(uint64_t, char *, void *),
+				   int (*func)(uint64_t, char *, uint32_t,
+					       void *),
 				   bool cleanup, void *arg)
 {
 	DIR *dir;
@@ -214,6 +216,8 @@ static int for_each_object_in_path(char *path,
 	}
 
 	while ((d = readdir(dir))) {
+		uint32_t epoch = 0;
+
 		if (!strncmp(d->d_name, ".", 1))
 			continue;
 
@@ -233,7 +237,10 @@ static int for_each_object_in_path(char *path,
 			continue;
 		}
 
-		ret = func(oid, path, arg);
+		if (strlen(d->d_name) > 17 && d->d_name[16] == '.')
+			epoch = strtoul(d->d_name + 17, NULL, 10);
+
+		ret = func(oid, path, epoch, arg);
 		if (ret != SD_RES_SUCCESS)
 			break;
 	}
@@ -366,7 +373,8 @@ static char *md_get_object_path_nolock(uint64_t oid)
 	return md_disks[vd->idx].path;
 }
 
-int for_each_object_in_wd(int (*func)(uint64_t oid, char *path, void *arg),
+int for_each_object_in_wd(int (*func)(uint64_t oid, char *path, uint32_t epoch,
+				      void *arg),
 			  bool cleanup, void *arg)
 {
 	int i, ret = SD_RES_SUCCESS;
@@ -382,7 +390,8 @@ int for_each_object_in_wd(int (*func)(uint64_t oid, char *path, void *arg),
 	return ret;
 }
 
-int for_each_object_in_stale(int (*func)(uint64_t oid, char *path, void *arg),
+int for_each_object_in_stale(int (*func)(uint64_t oid, char *path,
+					 uint32_t epoch, void *arg),
 			     void *arg)
 {
 	int i, ret = SD_RES_SUCCESS;
diff --git a/sheep/plain_store.c b/sheep/plain_store.c
index 086e18e..c372238 100644
--- a/sheep/plain_store.c
+++ b/sheep/plain_store.c
@@ -209,7 +209,8 @@ out:
 	return SD_RES_SUCCESS;
 }
 
-static int init_objlist_and_vdi_bitmap(uint64_t oid, char *wd, void *arg)
+static int init_objlist_and_vdi_bitmap(uint64_t oid, char *wd, uint32_t epoch,
+				       void *arg)
 {
 	int ret;
 	objlist_cache_insert(oid);
@@ -413,7 +414,8 @@ out:
 	return ret;
 }
 
-static int move_object_to_stale_dir(uint64_t oid, char *wd, void *arg)
+static int move_object_to_stale_dir(uint64_t oid, char *wd, uint32_t epoch,
+				    void *arg)
 {
 	char path[PATH_MAX], stale_path[PATH_MAX];
 	uint32_t tgt_epoch = *(int *)arg;
@@ -432,10 +434,11 @@ static int move_object_to_stale_dir(uint64_t oid, char *wd, void *arg)
 	return SD_RES_SUCCESS;
 }
 
-static int check_stale_objects(uint64_t oid, char *wd, void *arg)
+static int check_stale_objects(uint64_t oid, char *wd, uint32_t epoch,
+			       void *arg)
 {
 	if (oid_stale(oid))
-		return move_object_to_stale_dir(oid, wd, arg);
+		return move_object_to_stale_dir(oid, wd, 0, arg);
 
 	return SD_RES_SUCCESS;
 }
@@ -581,7 +584,8 @@ int default_purge_obj(void)
 {
 	uint32_t tgt_epoch = get_latest_epoch();
 
-	return for_each_object_in_wd(move_object_to_stale_dir, true, &tgt_epoch);
+	return for_each_object_in_wd(move_object_to_stale_dir, true,
+				     &tgt_epoch);
 }
 
 static struct store_driver plain_store = {
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 00459db..dddec70 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -175,8 +175,10 @@ int default_format(void);
 int default_remove_object(uint64_t oid);
 int default_get_hash(uint64_t oid, uint32_t epoch, uint8_t *sha1);
 int default_purge_obj(void);
-int for_each_object_in_wd(int (*func)(uint64_t, char *, void *), bool, void *);
-int for_each_object_in_stale(int (*func)(uint64_t oid, char *path, void *arg),
+int for_each_object_in_wd(int (*func)(uint64_t, char *, uint32_t, void *), bool,
+			  void *);
+int for_each_object_in_stale(int (*func)(uint64_t oid, char *path,
+					 uint32_t epoch, void *arg),
 			     void *arg);
 int for_each_obj_path(int (*func)(char *path));
 
-- 
1.7.9.5




More information about the sheepdog mailing list