This can be applied to the top of the patch "[PATCH] get ip address from corosync". = From: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Subject: [PATCH] store nodeid persistently collie calculates the nodeid every time from the ip address it boots up. This patch stores the nodeid persistently instead. Signed-off-by: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> --- collie/collie.h | 2 + collie/group.c | 21 +++++++++------ collie/store.c | 74 +++++++++++++++++++++++++++++++----------------------- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/collie/collie.h b/collie/collie.h index f3f3425..2b3420f 100644 --- a/collie/collie.h +++ b/collie/collie.h @@ -109,6 +109,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_nodeid(uint64_t nodeid); +int get_nodeid(uint64_t *nodeid); #define DATA_OBJ_NR_WORKER_THREAD 4 extern struct work_queue *dobj_queue; diff --git a/collie/group.c b/collie/group.c index e82a009..dfcde9a 100644 --- a/collie/group.c +++ b/collie/group.c @@ -670,6 +670,7 @@ static void vdi_op_done(struct vdi_op_message *msg) eprintf("can't write epoch %u\n", sys->epoch); update_epoch_store(sys->epoch); + set_nodeid(sys->this_node.id); set_global_nr_copies(sys->nr_sobjs); sys->status = SD_STATUS_OK; @@ -1036,8 +1037,6 @@ int create_cluster(int port) struct cpg_name group = { 8, "sheepdog" }; cpg_callbacks_t cb = { &sd_deliver, &sd_confch }; unsigned int nodeid = 0; - uint64_t hval; - int i; ret = cpg_initialize(&cpg_handle, &cb); if (ret != CS_OK) { @@ -1077,12 +1076,18 @@ join_retry: set_addr(nodeid); sys->this_node.port = port; - hval = fnv_64a_buf(&sys->this_node.port, sizeof(sys->this_node.port), - FNV1A_64_INIT); - for (i = ARRAY_SIZE(sys->this_node.addr) - 1; i >= 0; i--) - hval = fnv_64a_buf(&sys->this_node.addr[i], 1, hval); - - sys->this_node.id = hval; + ret = get_nodeid(&sys->this_node.id); + if (!sys->this_node.id) { + uint64_t hval; + int i; + + hval = fnv_64a_buf(&sys->this_node.port, + sizeof(sys->this_node.port), + FNV1A_64_INIT); + for (i = ARRAY_SIZE(sys->this_node.addr) - 1; i >= 0; i--) + hval = fnv_64a_buf(&sys->this_node.addr[i], 1, hval); + sys->this_node.id = hval; + } sys->synchronized = 0; sys->status = SD_STATUS_STARTUP; diff --git a/collie/store.c b/collie/store.c index 5c870b6..75ac12e 100644 --- a/collie/store.c +++ b/collie/store.c @@ -23,6 +23,7 @@ #define ANAME_CTIME "user.sheepdog.ctime" #define ANAME_COPIES "user.sheepdog.copies" +#define ANAME_NODEID "user.sheepdog.nodeid" static char *obj_path; static char *epoch_path; @@ -1101,6 +1102,45 @@ again: return 0; } + +static int attr(char *path, char *attr, void *var, int len, int set) +{ + int ret, fd; + + fd = open(path, O_RDONLY); + if (fd < 0) + return SD_RES_EIO; + + if (set) + ret = fsetxattr(fd, attr, var, len, 0); + else + ret = fgetxattr(fd, attr, var, len); + + close(fd); + + if (set) { + if (ret) { + eprintf("use 'user_xattr' option?, %s\n", attr); + return SD_RES_SYSTEM_ERROR; + } + } else { + if (ret != len) + return SD_RES_SYSTEM_ERROR; + } + + return SD_RES_SUCCESS; +} + +int set_nodeid(uint64_t nodeid) +{ + return attr(epoch_path, ANAME_NODEID, &nodeid, sizeof(nodeid), 1); +} + +int get_nodeid(uint64_t *nodeid) +{ + return attr(epoch_path, ANAME_NODEID, nodeid, sizeof(*nodeid), 0); +} + static int init_base_path(char *d, int *new) { return init_path(d, new); @@ -1269,42 +1309,12 @@ void epoch_queue_request(struct work *work, int idx) } } -static int global_nr_copies(uint32_t *copies, int set) -{ - int ret, fd; - - fd = open(epoch_path, O_RDONLY); - if (fd < 0) - return SD_RES_EIO; - - if (set) - ret = fsetxattr(fd, ANAME_COPIES, copies, sizeof(*copies), 0); - else - ret = fgetxattr(fd, ANAME_COPIES, copies, sizeof(*copies)); - - close(fd); - - if (set) { - if (ret) { - eprintf("use 'user_xattr' option?\n"); - return SD_RES_SYSTEM_ERROR; - } - } else { - if (ret != sizeof(*copies)) { - eprintf("use 'user_xattr' option?\n"); - return SD_RES_SYSTEM_ERROR; - } - } - - return SD_RES_SUCCESS; -} - int set_global_nr_copies(uint32_t copies) { - return global_nr_copies(&copies, 1); + return attr(epoch_path, ANAME_COPIES, &copies, sizeof(copies), 1); } int get_global_nr_copies(uint32_t *copies) { - return global_nr_copies(copies, 0); + return attr(epoch_path, ANAME_COPIES, copies, sizeof(*copies), 0); } -- 1.6.5 -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html