$ dog node stat # show the stat once
$ dog node stat -w # watch the stat every one second

Signed-off-by: Liu Yuan <[email protected]>
---
 dog/node.c               |   48 +++++++++++++++++++++++++++++++++++++++++++++-
 include/internal_proto.h |    1 +
 sheep/ops.c              |   14 ++++++++++++++
 3 files changed, 62 insertions(+), 1 deletion(-)

diff --git a/dog/node.c b/dog/node.c
index cb4725d..886c012 100644
--- a/dog/node.c
+++ b/dog/node.c
@@ -14,6 +14,7 @@
 static struct node_cmd_data {
        bool all_nodes;
        bool recovery_progress;
+       bool watch;
 } node_cmd_data;
 
 static void cal_total_vdi_size(uint32_t vid, const char *name, const char *tag,
@@ -262,6 +263,47 @@ static int node_kill(int argc, char **argv)
        return EXIT_SUCCESS;
 }
 
+static int node_stat(int argc, char **argv)
+{
+       struct sd_req hdr;
+       struct sd_rsp *rsp = (struct sd_rsp *)&hdr;
+       struct sd_stat stat;
+       int ret;
+       uint32_t i = node_cmd_data.watch ? UINT32_MAX : 0;
+
+again:
+       sd_init_req(&hdr, SD_OP_STAT);
+       hdr.data_length = sizeof(stat);
+       ret = dog_exec_req(sdhost, sdport, &hdr, &stat);
+       if (ret < 0)
+               return EXIT_SYSFAIL;
+
+       if (rsp->result != SD_RES_SUCCESS) {
+               sd_err("failed to get stat information: %s",
+                      sd_strerror(rsp->result));
+               return EXIT_FAILURE;
+       }
+
+       printf("%s%"PRIu64"\t%"PRIu64"\t%s\t%s\n",
+              raw_output ? "" :
+              "Request\tActive\tTotal\tIn\tOut\nClient\t",
+              stat.r.gway_active_nr, stat.r.gway_total_nr,
+              strnumber(stat.r.gway_total_rx),
+              strnumber(stat.r.gway_total_tx));
+       printf("%s%"PRIu64"\t%"PRIu64"\t%s\t%s\n",
+              raw_output ? "" : "Peer\t",
+              stat.r.peer_active_nr, stat.r.peer_total_nr,
+              strnumber(stat.r.peer_total_rx),
+              strnumber(stat.r.peer_total_tx));
+       if (i > 0) {
+               clear_screen();
+               sleep(1);
+               goto again;
+       }
+
+       return EXIT_SUCCESS;
+}
+
 static int node_md_info(struct node_id *nid)
 {
        struct sd_md_info info = {};
@@ -384,6 +426,8 @@ static int node_parser(int ch, char *opt)
        case 'P':
                node_cmd_data.recovery_progress = true;
                break;
+       case 'w':
+               node_cmd_data.watch = true;
        }
 
        return 0;
@@ -392,7 +436,7 @@ static int node_parser(int ch, char *opt)
 static struct sd_option node_options[] = {
        {'A', "all", false, "show md information of all the nodes"},
        {'P', "progress", false, "show progress of recovery in the node"},
-
+       {'w', "watch", false, "watch the stat every second"},
        { 0, NULL, false, NULL },
 };
 
@@ -407,6 +451,8 @@ static struct subcommand node_cmd[] = {
         CMD_NEED_NODELIST, node_recovery, node_options},
        {"md", "[disks]", "apAh", "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,
+        0, node_stat, node_options},
        {NULL,},
 };
 
diff --git a/include/internal_proto.h b/include/internal_proto.h
index adb9646..b9ff7ec 100644
--- a/include/internal_proto.h
+++ b/include/internal_proto.h
@@ -80,6 +80,7 @@
 #define SD_OP_REWEIGHT       0xB5
 #define SD_OP_GET_CACHE_INFO 0xB6
 #define SD_OP_CACHE_PURGE    0xB7
+#define SD_OP_STAT     0xB8
 
 /* internal flags for hdr.flags, must be above 0x80 */
 #define SD_FLAG_CMD_RECOVERY 0x0080
diff --git a/sheep/ops.c b/sheep/ops.c
index 4c0f975..b180425 100644
--- a/sheep/ops.c
+++ b/sheep/ops.c
@@ -758,6 +758,14 @@ out:
        return SD_RES_SUCCESS;
 }
 
+static int local_sd_stat(const struct sd_req *req, struct sd_rsp *rsp,
+                        void *data)
+{
+       memcpy(data, &sys->stat, sizeof(struct sd_stat));
+       rsp->data_length = sizeof(struct sd_stat);
+       return SD_RES_SUCCESS;
+}
+
 /* Return SD_RES_INVALID_PARMS to ask client not to send flush req again */
 static int local_flush_vdi(struct request *req)
 {
@@ -1246,6 +1254,12 @@ static struct sd_op_template sd_ops[] = {
                .process_work = local_cache_purge,
        },
 
+       [SD_OP_STAT] = {
+               .name = "STAT",
+               .type = SD_OP_TYPE_LOCAL,
+               .process_main = local_sd_stat,
+       },
+
        /* gateway I/O operations */
        [SD_OP_CREATE_AND_WRITE_OBJ] = {
                .name = "CREATE_AND_WRITE_OBJ",
-- 
1.7.9.5

-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to