[sheepdog] Preview - patch convertconfig part 1
Jens WEBER
jweber at tek2b.org
Fri Aug 10 08:09:10 CEST 2012
Patch preview - what do you think?
This patch add a version number to the config file and can convert the config file if it structure has changed. Part 2 does converting.
Thanks, Jens
--- sheepdog-0.4.0-0+tek2b.orig/sheep/store.c
+++ sheepdog-0.4.0-0+tek2b/sheep/store.c
@@ -28,13 +28,34 @@
#include "util.h"
#include "farm/farm.h"
+#define CONFIGFILE_SIGNATURE 0x0000aaaa00000000
+#define CONFIGFILE_VERSION 3
+/* configfile version 3 */
struct sheepdog_config {
+ uint64_t configversion;
uint64_t ctime;
uint64_t space;
uint16_t flags;
uint8_t copies;
uint8_t store[STORE_LEN];
};
+/***** remove in > v0.5.0 *****/
+/* configfile version 2 */
+struct sheepdog_config_2 {
+ uint64_t ctime;
+ uint64_t space;
+ uint16_t flags;
+ uint8_t copies;
+ uint8_t store[STORE_LEN];
+};
+/***** remove in > v0.5.0 *****/
+/* configfile version 1 */
+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,12 +422,55 @@ static int init_jrnl_path(const char *ba
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;
+
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 */
+ mknod(config_path, def_fmode, S_IFREG);
+ fd = open(config_path, O_DSYNC | O_WRONLY);
+ if (fd < 0)
+ return 1;
- return 0;
+ 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;
+ }
+
+ 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 & 0x0000000011111111;
+ if (version == CONFIGFILE_VERSION)
+ return 0;
+ /* convert config file with version number */
+ /* unknown version */
+ return 1;
+ }
+ /***** remove in > v0.5.0 *****/
+ /* convert config files without version number */
+ return 1;
}
static int init_store_driver(void)
More information about the sheepdog
mailing list