From: Robin Dong <sanbai at taobao.com> 'dog cluster info' does not show backend store information, so we add argument '-s' to display it. Now, when using 'dog cluster info -s', it will display: Cluster status: running, auto-recovery enabled Cluster store: plain with 8:15 redundancy policy Cluster created at Wed Dec 4 16:39:21 2013 Epoch Time Version ...... Signed-off-by: Robin Dong <sanbai at taobao.com> --- dog/cluster.c | 28 ++++++++++++++++++++++++++-- include/internal_proto.h | 5 ++++- sheep/ops.c | 13 +++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/dog/cluster.c b/dog/cluster.c index f44791c..05e98d2 100644 --- a/dog/cluster.c +++ b/dog/cluster.c @@ -21,7 +21,7 @@ static struct sd_option cluster_options[] = { {'b', "store", true, "specify backend store"}, {'c', "copies", true, "specify the default data redundancy (number of copies)"}, {'f', "force", false, "do not prompt for confirmation"}, - + {'s', "backend", false, "show backend store information"}, { 0, NULL, false, NULL }, }; @@ -29,6 +29,7 @@ static struct cluster_cmd_data { uint8_t copies; uint8_t copy_policy; bool force; + bool show_store; char name[STORE_LEN]; } cluster_cmd_data; @@ -145,6 +146,7 @@ static int cluster_info(int argc, char **argv) if (ret < 0) goto error; + /* show cluster status */ if (!raw_output) printf("Cluster status: "); if (rsp->result == SD_RES_SUCCESS) @@ -153,6 +155,25 @@ static int cluster_info(int argc, char **argv) else printf("%s\n", sd_strerror(rsp->result)); + /* show cluster backend store */ + if (cluster_cmd_data.show_store) { + if (!raw_output) + printf("Cluster store: "); + if (rsp->result == SD_RES_SUCCESS) { + char copy[10]; + if (!logs->copy_policy) + snprintf(copy, sizeof(copy), "%d", + logs->nr_copies); + else + snprintf(copy, sizeof(copy), "%d:%d", + (logs->copy_policy >> 4) * 2, + logs->copy_policy & 0x0f); + printf("%s with %s redundancy policy\n", + logs->drv_name, copy); + } else + printf("%s\n", sd_strerror(rsp->result)); + } + if (!raw_output && rsp->data_length > 0) { ct = logs[0].ctime >> 32; printf("\nCluster created at %s\n", ctime(&ct)); @@ -517,7 +538,7 @@ static int cluster_check(int argc, char **argv) } static struct subcommand cluster_cmd[] = { - {"info", NULL, "aprh", "show cluster information", + {"info", NULL, "aprhs", "show cluster information", NULL, CMD_NEED_NODELIST, cluster_info, cluster_options}, {"format", NULL, "bcaph", "create a Sheepdog store", NULL, 0, cluster_format, cluster_options}, @@ -561,6 +582,9 @@ static int cluster_parser(int ch, const char *opt) case 'f': cluster_cmd_data.force = true; break; + case 's': + cluster_cmd_data.show_store = true; + break; } return 0; diff --git a/include/internal_proto.h b/include/internal_proto.h index 70a7b5d..b224c49 100644 --- a/include/internal_proto.h +++ b/include/internal_proto.h @@ -178,7 +178,10 @@ struct epoch_log { uint32_t epoch; uint32_t nr_nodes; uint8_t disable_recovery; - uint8_t __pad[3]; + uint8_t nr_copies; + uint8_t copy_policy; + uint8_t __pad[1]; + char drv_name[STORE_LEN]; struct sd_node nodes[SD_MAX_NODES]; }; diff --git a/sheep/ops.c b/sheep/ops.c index 4dffa86..75a2565 100644 --- a/sheep/ops.c +++ b/sheep/ops.c @@ -445,8 +445,18 @@ static int local_stat_cluster(struct request *req) elog = (struct epoch_log *)req->data + i; memset(elog, 0, sizeof(*elog)); + + /* some filed only need to store in first elog */ + if (i == 0) { + elog->ctime = sys->cinfo.ctime; + elog->disable_recovery = sys->cinfo.disable_recovery; + elog->nr_copies = sys->cinfo.nr_copies; + elog->copy_policy = sys->cinfo.copy_policy; + strncpy(elog->drv_name, (char *)sys->cinfo.store, + STORE_LEN); + } + elog->epoch = epoch; - elog->ctime = sys->cinfo.ctime; nr_nodes = epoch_log_read_with_timestamp(epoch, elog->nodes, sizeof(elog->nodes), (time_t *)&elog->time); @@ -459,7 +469,6 @@ static int local_stat_cluster(struct request *req) assert(nr_nodes <= SD_MAX_NODES); elog->nr_nodes = nr_nodes; - elog->disable_recovery = sys->cinfo.disable_recovery; rsp->data_length += sizeof(*elog); epoch--; -- 1.7.12.4 |