From: HaiTing Yao <wujue.yht at taobao.com> Usage: collie cluster format [-t templeave] Options: -t, --templeave specify the time(in seconds) node can leave then join again Without this parameter, there is no transient failure detection and sheepdog works as before. Signed-off-by: HaiTing Yao <wujue.yht at taobao.com> --- collie/cluster.c | 24 +++++++++++++++++------- collie/collie.c | 2 ++ include/sheepdog_proto.h | 1 + sheep/ops.c | 5 +++++ 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/collie/cluster.c b/collie/cluster.c index 293664f..fe40467 100644 --- a/collie/cluster.c +++ b/collie/cluster.c @@ -23,6 +23,7 @@ struct cluster_cmd_data { int nohalt; int force; char name[STORE_LEN]; + char leavetime[LEAVE_TIME_LEN]; } cluster_cmd_data; #define DEFAULT_STORE "simple" @@ -79,7 +80,7 @@ static int cluster_format(int argc, char **argv) struct sd_so_rsp *rsp = (struct sd_so_rsp *)&hdr; unsigned rlen, wlen; struct timeval tv; - char store_name[STORE_LEN]; + char data[STORE_LEN + LEAVE_TIME_LEN]; fd = connect_to(sdhost, sdport); if (fd < 0) @@ -97,14 +98,20 @@ static int cluster_format(int argc, char **argv) hdr.ctime = (uint64_t) tv.tv_sec << 32 | tv.tv_usec * 1000; if (strlen(cluster_cmd_data.name)) - strncpy(store_name, cluster_cmd_data.name, STORE_LEN); + strncpy(data, cluster_cmd_data.name, STORE_LEN); else - strcpy(store_name, DEFAULT_STORE); - hdr.data_length = wlen = strlen(store_name) + 1; + strcpy(data, DEFAULT_STORE); + hdr.data_length = wlen = strlen(data) + 1; + printf("using backend %s store\n", data); + + if (strlen(cluster_cmd_data.leavetime)) { + strncpy(data + STORE_LEN, cluster_cmd_data.leavetime, LEAVE_TIME_LEN); + hdr.data_length = wlen = STORE_LEN + LEAVE_TIME_LEN; + } + hdr.flags |= SD_FLAG_CMD_WRITE; - printf("using backend %s store\n", store_name); - ret = exec_req(fd, (struct sd_req *)&hdr, store_name, &wlen, &rlen); + ret = exec_req(fd, (struct sd_req *)&hdr, data, &wlen, &rlen); close(fd); if (ret) { @@ -461,7 +468,7 @@ static int cluster_recover(int argc, char **argv) static struct subcommand cluster_cmd[] = { {"info", NULL, "aprh", "show cluster information", 0, cluster_info}, - {"format", NULL, "bcHaph", "create a Sheepdog store", + {"format", NULL, "btcHaph", "create a Sheepdog store", 0, cluster_format}, {"shutdown", NULL, "aph", "stop Sheepdog", SUBCMD_FLAG_NEED_NODELIST, cluster_shutdown}, @@ -515,6 +522,9 @@ static int cluster_parser(int ch, char *opt) case 'l': cluster_cmd_data.list = 1; break; + case 't': + strncpy(cluster_cmd_data.leavetime, opt, LEAVE_TIME_LEN - 1); + break; } return 0; diff --git a/collie/collie.c b/collie/collie.c index 5a2dc82..3f14002 100644 --- a/collie/collie.c +++ b/collie/collie.c @@ -41,6 +41,8 @@ static const struct sd_option collie_options[] = { /* cluster options */ {'b', "store", 1, "specify backend store"}, + {'t', "templeave", 1, "specify the time(in seconds) node can leave \ +then join again"}, {'c', "copies", 1, "specify the data redundancy (number of copies)"}, {'H', "nohalt", 0, "serve IO requests even if there are too few\n\ nodes for the configured redundancy"}, diff --git a/include/sheepdog_proto.h b/include/sheepdog_proto.h index 11c2c7c..23beada 100644 --- a/include/sheepdog_proto.h +++ b/include/sheepdog_proto.h @@ -98,6 +98,7 @@ #define CURRENT_VDI_ID 0 #define STORE_LEN 16 +#define LEAVE_TIME_LEN 8 struct sd_req { uint8_t proto_ver; diff --git a/sheep/ops.c b/sheep/ops.c index ee6dee1..6c83d26 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -161,6 +161,11 @@ static int cluster_make_fs(const struct sd_req *req, struct sd_rsp *rsp, ctime = hdr->ctime; set_cluster_ctime(ctime); + if (hdr->data_length > STORE_LEN) + sys->templeft_time = atoi((char *)data + STORE_LEN); + else + sys->templeft_time = 0; + for (i = 1; i <= latest_epoch; i++) remove_epoch(i); -- 1.7.1 |