[sheepdog] [PATCH] PATCH[2/2] sheep: converting config file and set version number
Jens Weber
jweber at tek2b.org
Sat Aug 11 15:32:19 CEST 2012
This patch "sheep: converting config file and set version number" converts config version 1 and 2 to version 3.
Signed-off-by: Jens Weber <jweber at tek2b.org>
---
sheep/store.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 159 insertions(+), 2 deletions(-)
diff --git a/sheep/store.c b/sheep/store.c
index 0a68d1e..39b1781 100644
--- a/sheep/store.c
+++ b/sheep/store.c
@@ -28,13 +28,52 @@
#include "util.h"
#include "farm/farm.h"
+#define CONFIGFILE_SIGNATURE 0x0000aaaa00000000
+#define CONFIGFILE_VERSION 3
+#define CONFIGFILE_SIZE 32
+/*
+ * configfile version 3
+ * store is 'farm'
+ * size 32 bytes
+ */
struct sheepdog_config {
+ uint64_t configversion;
uint64_t ctime;
uint64_t space;
uint16_t flags;
uint8_t copies;
uint8_t store[STORE_LEN];
};
+/*
+ * configfile version 2
+ * since v0.4.0 - sheep: get the free disk space and store it in the config file (commit 5e39f98abf32faa340afc9b535a56391359b5234)
+ * store is 'farm'
+ * size 24 bytes or 19 bytes if gateway_only
+ *
+ * we keep this for converting config till version <= v0.5.0
+ */
+struct sheepdog_config_2 {
+ uint64_t ctime;
+ uint64_t space;
+ uint16_t flags;
+ uint8_t copies;
+ uint8_t store[STORE_LEN];
+};
+/*
+ * configfile version 1
+ * since v0.4.0
+ * store is 'farm'
+ * size 16 bytes or 11 bytes if gateway_only
+ * sheep: don't call farm_init() for gateway-only node (commit 23168926dc519982992cc6b8f7b5244f7ed15cb2)
+ *
+ * we keep this for converting config till version <= v0.5.0
+ */
+struct sheepdog_config_1 {
+ uint64_t ctime;
+ uint16_t flags;
+ uint8_t copies;
+ uint8_t store[STORE_LEN];
+};
char *obj_path;
char *mnt_path;
@@ -401,11 +440,130 @@ static int init_jrnl_path(const char *base_path)
static int init_config_path(const char *base_path)
{
+ /*
+ * read and convert config
+ * new config has a version in the first 8 bytes
+ * 4 bytes version number
+ * 4 bytes fix version signature
+ */
+ int fd, ret;
+ uint64_t version;
+ uint64_t ctime;
+ uint64_t space;
+ uint16_t flags;
+ uint8_t copies;
+ uint8_t filesize;
+ struct stat sb;
+
+ /*
+ * we keep this for converting config till version <= v0.5.0
+ */
+ const char name[] = "farm";
+
config_path = zalloc(strlen(base_path) + strlen(CONFIG_PATH) + 1);
sprintf(config_path, "%s" CONFIG_PATH, base_path);
- mknod(config_path, def_fmode, S_IFREG);
+ fd = open(config_path, O_RDONLY);
+ if (fd < 0)
+ {
+ /* new config file */
+ if (mknod(config_path, def_fmode, S_IFREG)) return 1;
+ fd = open(config_path, O_DSYNC | O_WRONLY);
+ if (fd < 0) return 1;
+
+ version = CONFIGFILE_SIGNATURE | CONFIGFILE_VERSION;
+ ret = xpwrite(fd, &version, sizeof(version), offsetof(struct sheepdog_config, configversion));
+
+ close(fd);
+ if (ret != sizeof(version)) return 1;
+
+ return 0;
+ }
+
+ if (fstat(fd,&sb) < 0) return 1;
+ filesize = sb.st_size;
+ ret = xpread(fd, &version, sizeof(version),
+ offsetof(struct sheepdog_config, configversion));
+ close(fd);
+
+ if (ret != sizeof(version)) return 1;
+ if ((version & CONFIGFILE_SIGNATURE) == CONFIGFILE_SIGNATURE)
+ {
+ version = version & 0x00000000ffffffff;
+ if ((version == CONFIGFILE_VERSION) && (filesize == CONFIGFILE_SIZE)) return 0;
+ /* convert config file with version number */
+ /* unknown version */
+ return 1;
+ }
+ /*
+ * convert config files without version number
+ *
+ * configfile version 2 - since v0.4.0 commit 5e39f98abf32faa340afc9b535a56391359b5234
+ * size 24 bytes or 19 bytes if gateway_only
+ *
+ * configfile version 1 - since v0.4.0
+ * size 16 bytes of 11 bytes if gateway_only since commit 23168926dc519982992cc6b8f7b5244f7ed15cb2
+ *
+ * we keep this for converting config till version <= v0.5.0
+ *
+ */
+ if ((filesize == 19) || (filesize == 24))
+ {
+ fd = open(config_path, O_RDONLY);
+ if (fd < 0) return 1;
+
+ ret = xpread(fd, &ctime, sizeof(ctime),
+ offsetof(struct sheepdog_config_2, ctime));
+ if (ret != sizeof(ctime)) return 1;
+ ret = xpread(fd, &space, sizeof(space),
+ offsetof(struct sheepdog_config_2, space));
+ if (ret != sizeof(space)) return 1;
+ ret = xpread(fd, &flags, sizeof(flags),
+ offsetof(struct sheepdog_config_2, flags));
+ if (ret != sizeof(flags)) return 1;
+ ret = xpread(fd, &copies, sizeof(copies),
+ offsetof(struct sheepdog_config_2, copies));
+ if (ret != sizeof(copies)) return 1;
+
+ close(fd);
+ }
+ else if ((filesize == 11) || (filesize == 16))
+ {
+ fd = open(config_path, O_RDONLY);
+ if (fd < 0) return 1;
+
+ ret = xpread(fd, &ctime, sizeof(ctime),
+ offsetof(struct sheepdog_config_1, ctime));
+ if (ret != sizeof(ctime)) return 1;
+ ret = xpread(fd, &flags, sizeof(flags),
+ offsetof(struct sheepdog_config_1, flags));
+ if (ret != sizeof(flags)) return 1;
+ ret = xpread(fd, &copies, sizeof(copies),
+ offsetof(struct sheepdog_config_1, copies));
+ if (ret != sizeof(copies)) return 1;
+
+ close(fd);
+ }
+ else return 1;
+ fd = open(config_path, O_DSYNC | O_WRONLY);
+ if (fd < 0) return 1;
+
+ version = CONFIGFILE_SIGNATURE | CONFIGFILE_VERSION;
+ ret = xpwrite(fd, &version, sizeof(version), offsetof(struct sheepdog_config, configversion));
+ if (ret != sizeof(version)) return 1;
+ ret = xpwrite(fd, &ctime, sizeof(ctime), offsetof(struct sheepdog_config, ctime));
+ if (ret != sizeof(ctime)) return 1;
+ ret = xpwrite(fd, &space, sizeof(space), offsetof(struct sheepdog_config, space));
+ if (ret != sizeof(space)) return 1;
+ ret = xpwrite(fd, &flags, sizeof(flags), offsetof(struct sheepdog_config, flags));
+ if (ret != sizeof(flags)) return 1;
+ ret = xpwrite(fd, &copies, sizeof(copies), offsetof(struct sheepdog_config, copies));
+ if (ret != sizeof(copies)) return 1;
+ ret = xpwrite(fd, name, strlen(name) + 1, offsetof(struct sheepdog_config, store));
+ if (ret != strlen(name) + 1) return 1;
+
+ close(fd);
return 0;
}
@@ -717,7 +875,6 @@ int set_cluster_store(const char *name, uint8_t gateway_only)
len = strlen(name) + 1;
if (len > STORE_LEN)
goto err;
-
/* We don't need this for gateway-only node */
if (!gateway_only) {
jd = jrnl_begin(name, len,
--
1.7.10.4
More information about the sheepdog
mailing list