[Sheepdog] [RFC PATCH] sheep: add nohalt to sheepdog_config

MORITA Kazutaka morita.kazutaka at lab.ntt.co.jp
Wed Oct 19 08:25:00 CEST 2011


Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp>
---
Hi Yuan,

Isn't it better to add a nohalt field instead of a generic name
"flags"?  This would be the most intuitive way.  The size of config
file wouldn't become a problem, so we don't need to save bits, I
think.

How do you think?

Thanks,

Kazutaka


 sheep/sheep_priv.h |    2 ++
 sheep/store.c      |   48 +++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index cccb986..e087558 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -210,6 +210,8 @@ int update_epoch_store(uint32_t epoch);
 
 int set_global_nr_copies(uint32_t copies);
 int get_global_nr_copies(uint32_t *copies);
+int set_cluster_nohalt(int on);
+int is_cluster_nohalt(void);
 
 #define NR_GW_WORKER_THREAD 4
 #define NR_IO_WORKER_THREAD 4
diff --git a/sheep/store.c b/sheep/store.c
index 3da5713..addc41a 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -27,7 +27,7 @@
 struct sheepdog_config {
 	uint64_t ctime;
 	uint32_t copies;
-	uint32_t flags;
+	uint32_t nohalt;
 };
 
 static char *obj_path;
@@ -2054,3 +2054,49 @@ int get_global_nr_copies(uint32_t *copies)
 
 	return SD_RES_SUCCESS;
 }
+
+int set_cluster_nohalt(int on)
+{
+	int fd, ret;
+	struct sheepdog_config config = {
+		.nohalt = on,
+	};
+
+	fd = open(config_path, O_SYNC | O_WRONLY);
+	if (fd < 0)
+		return SD_RES_EIO;
+
+	ret = jrnl_perform(fd, &config.nohalt, sizeof(config.nohalt),
+			   offsetof(struct sheepdog_config, nohalt),
+			   config_path, jrnl_path);
+	close(fd);
+
+	if (ret != 0)
+		return SD_RES_EIO;
+
+	return SD_RES_SUCCESS;
+}
+
+/*
+ * Returns 1 if the cluster serves the IO requests even if there
+ * aren't enough redundant nodes.  Otherwise, returns 0.  On error,
+ * returns a negative value
+ */
+int is_cluster_nohalt(void)
+{
+	int fd, ret;
+	struct sheepdog_config config;
+
+	fd = open(config_path, O_RDONLY);
+	if (fd < 0)
+		return SD_RES_EIO;
+
+	ret = pread64(fd, &config.nohalt, sizeof(config.nohalt),
+		      offsetof(struct sheepdog_config, nohalt));
+	close(fd);
+
+	if (ret != sizeof(config.nohalt))
+		return -SD_RES_EIO;
+
+	return !!config.nohalt;
+}
-- 
1.7.2.5




More information about the sheepdog mailing list