To be compatible with OpenStack glance and cinder driver, we cannot
show elapsed time by default. Therefore, the new option -t (--time)
is added in dog command line to achieve it. For example:

dog cluster info -t
dog vdi check test -t

Signed-off-by: Ruoyu <lian...@ucweb.com>
---
 dog/alter.c    |  4 ++--
 dog/cluster.c  | 14 +++++++-------
 dog/dog.c      | 15 +++++++++++++++
 dog/node.c     | 14 +++++++-------
 dog/vdi.c      | 44 +++++++++++++++++++++++++-------------------
 include/util.h |  4 ++++
 lib/util.c     | 25 +++++++++++++++++++++++++
 7 files changed, 85 insertions(+), 35 deletions(-)

diff --git a/dog/alter.c b/dog/alter.c
index 7af7f9f..432f01b 100644
--- a/dog/alter.c
+++ b/dog/alter.c
@@ -223,9 +223,9 @@ static int alter_vdi_copy(int argc, char **argv)
 }
 
 static struct subcommand alter_cmd[] = {
-       {"cluster-copy", NULL, "caph", "set the cluster's redundancy level",
+       {"cluster-copy", NULL, "capht", "set the cluster's redundancy level",
         NULL, CMD_NEED_NODELIST, alter_cluster_copy, alter_options},
-       {"vdi-copy", "<vdiname>", "caph", "set the vdi's redundancy level",
+       {"vdi-copy", "<vdiname>", "capht", "set the vdi's redundancy level",
         NULL, CMD_NEED_ARG|CMD_NEED_NODELIST, alter_vdi_copy, alter_options},
        {NULL,},
 };
diff --git a/dog/cluster.c b/dog/cluster.c
index 69ec07c..fa62366 100644
--- a/dog/cluster.c
+++ b/dog/cluster.c
@@ -572,22 +572,22 @@ static int cluster_check(int argc, char **argv)
 }
 
 static struct subcommand cluster_cmd[] = {
-       {"info", NULL, "aprhv", "show cluster information",
+       {"info", NULL, "aprhvt", "show cluster information",
         NULL, CMD_NEED_NODELIST, cluster_info, cluster_options},
-       {"format", NULL, "bctaph", "create a Sheepdog store",
+       {"format", NULL, "bctapht", "create a Sheepdog store",
         NULL, CMD_NEED_NODELIST, cluster_format, cluster_options},
-       {"shutdown", NULL, "aph", "stop Sheepdog",
+       {"shutdown", NULL, "apht", "stop Sheepdog",
         NULL, 0, cluster_shutdown, cluster_options},
-       {"snapshot", "<tag|idx> <path>", "aph", "snapshot/restore the cluster",
+       {"snapshot", "<tag|idx> <path>", "apht", "snapshot/restore the cluster",
         cluster_snapshot_cmd, CMD_NEED_ARG,
         cluster_snapshot, cluster_options},
-       {"recover", NULL, "afph",
+       {"recover", NULL, "afpht",
         "See 'dog cluster recover' for more information",
         cluster_recover_cmd, CMD_NEED_ARG,
         cluster_recover, cluster_options},
-       {"reweight", NULL, "aph", "reweight the cluster", NULL, 0,
+       {"reweight", NULL, "apht", "reweight the cluster", NULL, 0,
         cluster_reweight, cluster_options},
-       {"check", NULL, "aph", "check and repair cluster", NULL,
+       {"check", NULL, "apht", "check and repair cluster", NULL,
         CMD_NEED_NODELIST, cluster_check, cluster_options},
        {NULL,},
 };
diff --git a/dog/dog.c b/dog/dog.c
index 7d1153d..4eb4ad8 100644
--- a/dog/dog.c
+++ b/dog/dog.c
@@ -32,6 +32,7 @@ struct node_id sd_nid = {
 bool highlight = true;
 bool raw_output;
 bool verbose;
+bool elapsed_time;
 
 static const struct sd_option dog_options[] = {
 
@@ -42,6 +43,7 @@ static const struct sd_option dog_options[] = {
         "                          single spaces and print all sizes in 
decimal bytes"},
        {'v', "verbose", false, "print more information than default"},
        {'h', "help", false, "display this help and exit"},
+       {'t', "time", false, "show elapsed time"},
 
        { 0, NULL, false, NULL },
 };
@@ -453,6 +455,9 @@ int main(int argc, char **argv)
        const struct sd_option *sd_opts;
        uint8_t sdhost[16];
        int sdport;
+       struct timespec start, end;
+
+       start = get_time_tick();
 
        log_dog_operation(argc, argv);
 
@@ -520,6 +525,9 @@ int main(int argc, char **argv)
                case 'h':
                        subcommand_usage(argv[1], argv[2], EXIT_SUCCESS);
                        break;
+               case 't':
+                       elapsed_time = true;
+                       break;
                case '?':
                        usage(commands, EXIT_USAGE);
                        break;
@@ -565,5 +573,12 @@ int main(int argc, char **argv)
        ret = command_fn(argc, argv);
        if (ret == EXIT_USAGE)
                subcommand_usage(argv[1], argv[2], EXIT_USAGE);
+
+       if (elapsed_time) {
+               end = get_time_tick();
+               printf("\nElapsed time: %.3lf seconds\n",
+                               get_time_interval(&start, &end));
+       }
+
        return ret;
 }
diff --git a/dog/node.c b/dog/node.c
index a9799ff..83ff541 100644
--- a/dog/node.c
+++ b/dog/node.c
@@ -609,19 +609,19 @@ static int node_log(int argc, char **argv)
 }
 
 static struct subcommand node_cmd[] = {
-       {"kill", "<node id>", "aprhl", "kill node", NULL,
+       {"kill", "<node id>", "aprhlt", "kill node", NULL,
         CMD_NEED_NODELIST, node_kill, node_options},
-       {"list", NULL, "aprh", "list nodes", NULL,
+       {"list", NULL, "aprht", "list nodes", NULL,
         CMD_NEED_NODELIST, node_list},
-       {"info", NULL, "aprh", "show information about each node", NULL,
+       {"info", NULL, "aprht", "show information about each node", NULL,
         CMD_NEED_NODELIST, node_info},
-       {"recovery", NULL, "aphPr", "show recovery information of nodes", NULL,
+       {"recovery", NULL, "aphPrt", "show recovery information of nodes", NULL,
         CMD_NEED_NODELIST, node_recovery, node_options},
-       {"md", "[disks]", "aprAh", "See 'dog node md' for more information",
+       {"md", "[disks]", "aprAht", "See 'dog node md' for more information",
         node_md_cmd, CMD_NEED_ARG, node_md, node_options},
-       {"stat", NULL, "aprwh", "show stat information about the node", NULL,
+       {"stat", NULL, "aprwht", "show stat information about the node", NULL,
         0, node_stat, node_options},
-       {"log", NULL, "aph", "show or set log level of the node", node_log_cmd,
+       {"log", NULL, "apht", "show or set log level of the node", node_log_cmd,
         CMD_NEED_ARG, node_log},
        {NULL,},
 };
diff --git a/dog/vdi.c b/dog/vdi.c
index 49a2139..1443cf4 100644
--- a/dog/vdi.c
+++ b/dog/vdi.c
@@ -2458,59 +2458,65 @@ static int vdi_cache(int argc, char **argv)
 }
 
 static struct subcommand vdi_cmd[] = {
-       {"check", "<vdiname>", "saph", "check and repair image's consistency",
+       {"check", "<vdiname>", "sapht", "check and repair image's consistency",
         NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
         vdi_check, vdi_options},
-       {"create", "<vdiname> <size>", "Pycaphrv", "create an image",
+       {"create", "<vdiname> <size>", "Pycaphrvt", "create an image",
         NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
         vdi_create, vdi_options},
-       {"snapshot", "<vdiname>", "saphrv", "create a snapshot",
+       {"snapshot", "<vdiname>", "saphrvt", "create a snapshot",
         NULL, CMD_NEED_ARG,
         vdi_snapshot, vdi_options},
-       {"clone", "<src vdi> <dst vdi>", "sPnaphrv", "clone an image",
+       {"clone", "<src vdi> <dst vdi>", "sPnaphrvt", "clone an image",
         NULL, CMD_NEED_ARG,
         vdi_clone, vdi_options},
-       {"delete", "<vdiname>", "saph", "delete an image",
+       {"delete", "<vdiname>", "sapht", "delete an image",
         NULL, CMD_NEED_ARG,
         vdi_delete, vdi_options},
-       {"rollback", "<vdiname>", "saphfrv", "rollback to a snapshot",
+       {"rollback", "<vdiname>", "saphfrvt", "rollback to a snapshot",
         NULL, CMD_NEED_ARG,
         vdi_rollback, vdi_options},
-       {"list", "[vdiname]", "aprh", "list images",
+       {"list", "[vdiname]", "aprht", "list images",
         NULL, 0, vdi_list, vdi_options},
-       {"tree", NULL, "aph", "show images in tree view format",
+       {"tree", NULL, "apht", "show images in tree view format",
         NULL, 0, vdi_tree, vdi_options},
-       {"graph", NULL, "aph", "show images in Graphviz dot format",
+       {"graph", NULL, "apht", "show images in Graphviz dot format",
         NULL, 0, vdi_graph, vdi_options},
-       {"object", "<vdiname>", "isaph", "show object information in the image",
+       {"object", "<vdiname>", "isapht",
+        "show object information in the image",
         vdi_object_cmd, CMD_NEED_ARG,
         vdi_object, vdi_options},
-       {"track", "<vdiname>", "isapho",
+       {"track", "<vdiname>", "isaphot",
         "show the object epoch trace in the image",
         NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
         vdi_track, vdi_options},
-       {"setattr", "<vdiname> <key> [value]", "dxaph", "set a VDI attribute",
+       {"setattr", "<vdiname> <key> [value]", "dxapht", "set a VDI attribute",
         NULL, CMD_NEED_ARG,
         vdi_setattr, vdi_options},
-       {"getattr", "<vdiname> <key>", "aph", "get a VDI attribute",
+       {"getattr", "<vdiname> <key>", "apht", "get a VDI attribute",
         NULL, CMD_NEED_ARG,
         vdi_getattr, vdi_options},
-       {"resize", "<vdiname> <new size>", "aph", "resize an image",
+       {"resize", "<vdiname> <new size>", "apht", "resize an image",
         NULL, CMD_NEED_ARG,
         vdi_resize, vdi_options},
-       {"read", "<vdiname> [<offset> [<len>]]", "saph", "read data from an 
image",
+       {"read", "<vdiname> [<offset> [<len>]]", "sapht",
+        "read data from an image",
         NULL, CMD_NEED_ARG,
         vdi_read, vdi_options},
-       {"write", "<vdiname> [<offset> [<len>]]", "apwh", "write data to an 
image",
+       {"write", "<vdiname> [<offset> [<len>]]", "apwht",
+        "write data to an image",
         NULL, CMD_NEED_ARG,
         vdi_write, vdi_options},
-       {"backup", "<vdiname> <backup>", "sFaph", "create an incremental backup 
between two snapshots",
+       {"backup", "<vdiname> <backup>", "sFapht",
+        "create an incremental backup between two snapshots",
         NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
         vdi_backup, vdi_options},
-       {"restore", "<vdiname> <backup>", "saph", "restore snapshot images from 
a backup",
+       {"restore", "<vdiname> <backup>", "sapht",
+        "restore snapshot images from a backup",
         NULL, CMD_NEED_NODELIST|CMD_NEED_ARG,
         vdi_restore, vdi_options},
-       {"cache", "<vdiname>", "saph", "Run 'dog vdi cache' for more 
information",
+       {"cache", "<vdiname>", "sapht",
+        "Run 'dog vdi cache' for more information",
         vdi_cache_cmd, CMD_NEED_ARG,
         vdi_cache, vdi_options},
        {NULL,},
diff --git a/include/util.h b/include/util.h
index c7a1921..d230f7f 100644
--- a/include/util.h
+++ b/include/util.h
@@ -125,6 +125,10 @@ int atomic_create_and_write(const char *path, const char 
*buf, size_t len,
 void find_zero_blocks(const void *buf, uint64_t *poffset, uint32_t *plen);
 void trim_zero_blocks(void *buf, uint64_t *poffset, uint32_t *plen);
 
+struct timespec get_time_tick(void);
+double get_time_interval(const struct timespec *start,
+                                                const struct timespec *end);
+
 /* a type safe version of qsort() */
 #define xqsort(base, nmemb, compar)                                    \
 ({                                                                     \
diff --git a/lib/util.c b/lib/util.c
index 408fc19..9a3adcd 100644
--- a/lib/util.c
+++ b/lib/util.c
@@ -806,3 +806,28 @@ void trim_zero_blocks(void *buf, uint64_t *poffset, 
uint32_t *plen)
        if (orig_offset < *poffset)
                memmove(p, p + *poffset - orig_offset, *plen);
 }
+
+struct timespec get_time_tick(void)
+{
+       struct timespec ts;
+       int ret;
+
+       ts.tv_sec = 0;
+       ts.tv_nsec = 0;
+
+       ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+       if (ret < 0)
+               sd_err("clock_gettime failure: %m");
+
+       return ts;
+}
+
+double get_time_interval(const struct timespec *start,
+                                                const struct timespec *end)
+{
+       assert(start);
+       assert(end);
+
+       return ((end->tv_nsec - start->tv_nsec) * 0.000000001)
+                       + end->tv_sec - start->tv_sec;
+}
-- 
1.8.3.2


-- 
sheepdog mailing list
sheepdog@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to