All nodes need to know when make fs is invoked to support safe start up. Signed-off-by: MORITA Kazutaka <morita.kazutaka at lab.ntt.co.jp> --- collie/collie.h | 2 ++ collie/store.c | 42 +++++++++++++++++++++++++++++++++++++++++- shepherd/shepherd.c | 8 ++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/collie/collie.h b/collie/collie.h index d24a6c4..89eb8f8 100644 --- a/collie/collie.h +++ b/collie/collie.h @@ -107,6 +107,8 @@ extern struct work_queue *dobj_queue; int epoch_log_write(uint32_t epoch, char *buf, int len); int epoch_log_read(uint32_t epoch, char *buf, int len); +int set_cluster_ctime(uint64_t ctime); +uint64_t get_cluster_ctime(void); int start_recovery(uint32_t epoch, int add); diff --git a/collie/store.c b/collie/store.c index 1c416d2..e46ca46 100644 --- a/collie/store.c +++ b/collie/store.c @@ -22,6 +22,7 @@ #include "meta.h" #define ANAME_LAST_OID "user.sheepdog.last_oid" +#define ANAME_CTIME "user.sheepdog.ctime" #define ANAME_COPIES "user.sheepdog.copies" static char *vdi_path; @@ -829,7 +830,13 @@ void so_queue_request(struct work *work, int idx) ret = fsetxattr(fd, ANAME_LAST_OID, &last_oid, sizeof(last_oid), 0); if (ret) { - close(fd); + result = SD_RES_EIO; + goto out; + } + + ret = fsetxattr(fd, ANAME_CTIME, &hdr->ctime, + sizeof(hdr->ctime), 0); + if (ret) { result = SD_RES_EIO; goto out; } @@ -1034,6 +1041,39 @@ int epoch_log_read(uint32_t epoch, char *buf, int len) return len; } +int set_cluster_ctime(uint64_t ctime) +{ + int fd, ret; + + fd = open(epoch_path, O_RDONLY); + if (fd < 0) + return -1; + + ret = fsetxattr(fd, ANAME_CTIME, &ctime, sizeof(ctime), 0); + close(fd); + + if (ret) + return -1; + return 0; +} + +uint64_t get_cluster_ctime(void) +{ + int fd, ret; + uint64_t ctime; + + fd = open(epoch_path, O_RDONLY); + if (fd < 0) + return 0; + + ret = fgetxattr(fd, ANAME_CTIME, &ctime, sizeof(ctime)); + close(fd); + + if (ret != sizeof(ctime)) + return 0; + return ctime; +} + static int node_distance(int my, int her, int nr) { return (my + nr - her) % nr; diff --git a/shepherd/shepherd.c b/shepherd/shepherd.c index f639fe2..52383bd 100644 --- a/shepherd/shepherd.c +++ b/shepherd/shepherd.c @@ -207,19 +207,23 @@ out: static int mkfs(int copies) { int fd, ret; - struct sd_obj_req hdr; - struct sd_obj_rsp *rsp = (struct sd_obj_rsp *)&hdr; + struct sd_so_req hdr; + struct sd_so_rsp *rsp = (struct sd_so_rsp *)&hdr; unsigned rlen, wlen; + struct timeval tv; fd = connect_to("localhost", sdport); if (fd < 0) return -1; + gettimeofday(&tv, NULL); + memset(&hdr, 0, sizeof(hdr)); hdr.opcode = SD_OP_MAKE_FS; hdr.copies = copies; hdr.epoch = node_list_version; + hdr.ctime = (uint64_t) tv.tv_sec << 32 | tv.tv_usec * 1000; rlen = 0; wlen = 0; -- 1.5.6.5 |