diff options
| author | Kaushal M <kaushal@redhat.com> | 2012-05-13 09:32:56 +0530 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2012-05-21 18:34:55 -0700 | 
| commit | afc623f85e766a9006d7ba7cb81123ca3e10a719 (patch) | |
| tree | 9759f799c4b2c5b5d8c61580277ad10f28db267e /cli | |
| parent | 25ee4c27d9beaac0bdbf640851639e12e8f625b2 (diff) | |
cli,glusterd,debug/io-stats: Clear top stats
Introduces a cli command to clear "volume top" stats. The syntax for clearing
stats is
 # gluster volume top <VOLNAME> clear [nfs]
This patch also fixes io-stats xlator, to create ios_stat struct for open fop as
well, along with create and mkdir fops. This allows stats to be recorded for
files that exist already after clearing stats or restarting brick process, which
would not occur otherwise.
Change-Id: I1b87e192025be7bb8a51eaff3d09c747d05d7def
BUG: 771709
Signed-off-by: Kaushal M <kaushal@redhat.com>
Reviewed-on: http://review.gluster.com/3334
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Amar Tumballi <amarts@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'cli')
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 9 | ||||
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 4 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 30 | 
3 files changed, 35 insertions, 8 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 2dde16744..6c8d374eb 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -1672,7 +1672,7 @@ cli_cmd_volume_top_parse (const char **words, int wordcount,          char    *delimiter      = NULL;          char    *opwords[]      = { "open", "read", "write", "opendir",                                      "readdir", "read-perf", "write-perf", -                                    NULL }; +                                    "clear", NULL };          char    *w = NULL;          GF_ASSERT (words); @@ -1717,6 +1717,13 @@ cli_cmd_volume_top_parse (const char **words, int wordcount,          } else if (strcmp (w, "write-perf") == 0) {                  top_op = GF_CLI_TOP_WRITE_PERF;                  perf = 1; +        } else if (strcmp (w, "clear") == 0) { +                ret = dict_set_int32 (dict, "clear-stats", 1); +                if (ret) { +                        gf_log ("cli", GF_LOG_ERROR, +                                "Could not set clear-stats in dict"); +                        goto out; +                }          } else                  GF_ASSERT (!"opword mismatch");          ret = dict_set_int32 (dict, "top-op", (int32_t)top_op); diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index bad9351fd..704f9dddb 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -1890,8 +1890,8 @@ struct cli_cmd volume_cmds[] = {            "quota translator specific operations"},           { "volume top <VOLNAME> {[open|read|write|opendir|readdir [nfs]] " -           "|[read-perf|write-perf [nfs|{bs <size> count <count>}]]} " -           " [brick <brick>] [list-cnt <count>]", +           "|[read-perf|write-perf [nfs|{bs <size> count <count>}]]" +           "|[clear [nfs]]} [brick <brick>] [list-cnt <count>]",             cli_cmd_volume_top_cbk,             "volume top operations"}, diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index e54d4d219..9737e13f9 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -4048,7 +4048,7 @@ gf_cli3_1_top_volume_cbk (struct rpc_req *req, struct iovec *iov,          gf_cli_rsp                        rsp   = {0,};          int                               ret   = -1;          dict_t                            *dict = NULL; -        gf1_cli_stats_op                op = GF_CLI_STATS_NONE; +        gf1_cli_stats_op                  op = GF_CLI_STATS_NONE;          char                              key[256] = {0};          int                               i = 0;          int32_t                           brick_count = 0; @@ -4056,7 +4056,7 @@ gf_cli3_1_top_volume_cbk (struct rpc_req *req, struct iovec *iov,          int32_t                           members = 0;          char                              *filename;          char                              *bricks; -        uint64_t                           value = 0; +        uint64_t                          value = 0;          int32_t                           j = 0;          gf1_cli_top_op                    top_op = GF_CLI_TOP_NONE;          uint64_t                          nr_open = 0; @@ -4064,10 +4064,13 @@ gf_cli3_1_top_volume_cbk (struct rpc_req *req, struct iovec *iov,          double                            throughput = 0;          double                            time = 0;          long int                          time_sec = 0; -        long int                           time_usec = 0; +        long int                          time_usec = 0;          struct tm                         *tm = NULL;          char                              timestr[256] = {0, };          char                              *openfd_str = NULL; +        gf_boolean_t                      nfs = _gf_false; +        gf_boolean_t                      clear_stats = _gf_false; +        int                               stats_cleared = 0;          if (-1 == req->rpc_status) {                  goto out; @@ -4132,14 +4135,31 @@ gf_cli3_1_top_volume_cbk (struct rpc_req *req, struct iovec *iov,          ret = dict_get_int32 (dict, key, (int32_t*)&top_op);          if (ret)                  goto out; + +        clear_stats = dict_get_str_boolean (dict, "clear-stats", _gf_false); +          while (i < brick_count) {                  i++;                  snprintf (brick, sizeof (brick), "%d-brick", i);                  ret = dict_get_str (dict, brick, &bricks);                  if (ret)                          goto out; -                ret = dict_get_str_boolean (dict, "nfs", _gf_false); -                if (ret) + +                nfs = dict_get_str_boolean (dict, "nfs", _gf_false); + +                if (clear_stats) { +                        memset (key, 0, sizeof (key)); +                        snprintf (key, sizeof (key), "%d-stats-cleared", i); +                        ret = dict_get_int32 (dict, key, &stats_cleared); +                        if (ret) +                                goto out; +                        cli_out (stats_cleared ? "Cleared stats for %s %s" : +                                 "Failed to clear stats for %s %s", +                                 nfs ? "NFS server on" : "brick", bricks); +                        continue; +                } + +                if (nfs)                          cli_out ("NFS Server : %s", bricks);                  else                          cli_out ("Brick: %s", bricks);  | 
