diff options
| -rw-r--r-- | cli/src/cli-cmd-parser.c | 37 | ||||
| -rw-r--r-- | cli/src/cli-cmd-volume.c | 2 | ||||
| -rw-r--r-- | cli/src/cli-rpc-ops.c | 39 | ||||
| -rw-r--r-- | cli/src/cli-xml-output.c | 46 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.c | 11 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.h | 15 | ||||
| -rw-r--r-- | rpc/xdr/src/cli1-xdr.x | 8 | ||||
| -rw-r--r-- | tests/bugs/bug-1030580.t | 8 | ||||
| -rw-r--r-- | tests/bugs/bug-1047416.t | 66 | ||||
| -rw-r--r-- | tests/volume.rc | 23 | ||||
| -rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 105 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 10 | 
12 files changed, 294 insertions, 76 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index dd9398184aa..7a2ff026d88 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -1972,10 +1972,13 @@ int32_t  cli_cmd_volume_profile_parse (const char **words, int wordcount,                                dict_t **options)  { -        dict_t    *dict       = NULL; -        char      *volname    = NULL; -        int       ret         = -1; -        gf1_cli_stats_op op = GF_CLI_STATS_NONE; +        dict_t              *dict       = NULL; +        char                *volname    = NULL; +        int                 ret         = -1; +        gf1_cli_stats_op    op          = GF_CLI_STATS_NONE; +        gf1_cli_info_op     info_op     = GF_CLI_INFO_NONE; +        gf_boolean_t        is_peek     = _gf_false; +          char      *opwords[] = { "start", "stop", "info", NULL };          char      *w = NULL; @@ -2005,7 +2008,7 @@ cli_cmd_volume_profile_parse (const char **words, int wordcount,              wordcount > 5)                  goto out; -        if (strcmp (w, "info") == 0 && wordcount > 6) +        if (strcmp (w, "info") == 0 && wordcount > 7)                  goto out;          if (strcmp (w, "start") == 0) { @@ -2014,16 +2017,22 @@ cli_cmd_volume_profile_parse (const char **words, int wordcount,                  op = GF_CLI_STATS_STOP;          } else if (strcmp (w, "info") == 0) {                  op = GF_CLI_STATS_INFO; +                info_op = GF_CLI_INFO_ALL;                  if (wordcount > 4) {                          if (strcmp (words[4], "incremental") == 0) { -                                op = GF_CLI_STATS_INFO_INCREMENTAL; +                                info_op = GF_CLI_INFO_INCREMENTAL; +                                if (wordcount > 5 && +                                    strcmp (words[5], "peek") == 0) { +                                        is_peek = _gf_true; +                                }                          } else if (strcmp (words[4], "cumulative") == 0) { -                                op = GF_CLI_STATS_INFO_CUMULATIVE; +                                info_op = GF_CLI_INFO_CUMULATIVE; +                        } else if (strcmp (words[4], "clear") == 0) { +                                info_op = GF_CLI_INFO_CLEAR; +                        } else if (strcmp (words[4], "peek") == 0) { +                                is_peek = _gf_true;                          }                  } -                ret = dict_set_int32 (dict, "info-op", op); -                if (ret) -                        goto out;          } else                  GF_ASSERT (!"opword mismatch"); @@ -2031,6 +2040,14 @@ cli_cmd_volume_profile_parse (const char **words, int wordcount,          if (ret)                  goto out; +        ret = dict_set_int32 (dict, "info-op", (int32_t)info_op); +        if (ret) +                goto out; + +        ret = dict_set_int32 (dict, "peek", is_peek); +        if (ret) +                goto out; +          if (!strcmp (words[wordcount - 1], "nfs")) {                  ret = dict_set_int32 (dict, "nfs", _gf_true);                  if (ret) diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index a7e72dabdf8..9c29b7f3b79 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -2334,7 +2334,7 @@ struct cli_cmd volume_cmds[] = {           cli_cmd_check_gsync_exists_cbk},  #endif -         { "volume profile <VOLNAME> {start | info [incremental | cumulative] | stop} [nfs]", +         { "volume profile <VOLNAME> {start|info [peek|incremental [peek]|cumulative|clear]|stop} [nfs]",             cli_cmd_volume_profile_cbk,             "volume profile operations"}, diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index d1b39014dc9..0b6bcb54b81 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -4775,6 +4775,8 @@ gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,          char                              *volname = NULL;          char                              *brick = NULL;          char                              str[1024] = {0,}; +        int                               stats_cleared = 0; +        gf1_cli_info_op                   info_op = GF_CLI_INFO_NONE;          if (-1 == req->rpc_status) {                  goto out; @@ -4840,8 +4842,6 @@ gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,                                   (rsp.op_ret) ? "unsuccessful": "successful");                          break;                  case GF_CLI_STATS_INFO: -                case GF_CLI_STATS_INFO_INCREMENTAL: -                case GF_CLI_STATS_INFO_CUMULATIVE:                          break;                  default:                          cli_out ("volume profile on %s has been %s ", @@ -4856,11 +4856,15 @@ gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,                  goto out;          } -        if (op < GF_CLI_STATS_INFO || GF_CLI_STATS_INFO_CUMULATIVE < op) { +        if (GF_CLI_STATS_INFO != op) {                  ret = 0;                  goto out;          } +        ret = dict_get_int32 (dict, "info-op", (int32_t*)&info_op); +        if (ret) +                goto out; +          ret = dict_get_int32 (dict, "count", &brick_count);          if (ret)                  goto out; @@ -4880,6 +4884,7 @@ gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,                  }                  ret = dict_get_str_boolean (dict, "nfs", _gf_false); +                  if (ret)                          snprintf (str, sizeof (str), "NFS Server : %s", brick);                  else @@ -4888,15 +4893,25 @@ gf_cli_profile_volume_cbk (struct rpc_req *req, struct iovec *iov,                  memset (str, '-', strlen (str));                  cli_out ("%s", str); -                snprintf (key, sizeof (key), "%d-cumulative", i); -                ret = dict_get_int32 (dict, key, &interval); -                if (ret == 0) { -                        cmd_profile_volume_brick_out (dict, i, interval); -                } -                snprintf (key, sizeof (key), "%d-interval", i); -                ret = dict_get_int32 (dict, key, &interval); -                if (ret == 0) { -                        cmd_profile_volume_brick_out (dict, i, interval); +                if (GF_CLI_INFO_CLEAR == info_op) { +                        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." : +                                                 "Failed to clear stats."); +                } else { +                        snprintf (key, sizeof (key), "%d-cumulative", i); +                        ret = dict_get_int32 (dict, key, &interval); +                        if (ret == 0) +                                cmd_profile_volume_brick_out (dict, i, +                                                              interval); + +                        snprintf (key, sizeof (key), "%d-interval", i); +                        ret = dict_get_int32 (dict, key, &interval); +                        if (ret == 0) +                                cmd_profile_volume_brick_out (dict, i, +                                                              interval);                  }                  i++;          } diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 886c372dc3e..822b98df5d1 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2229,11 +2229,13 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,          xmlDocPtr               doc = NULL;          char                    *volname = NULL;          int                     op = GF_CLI_STATS_NONE; +        int                     info_op = GF_CLI_INFO_NONE;          int                     brick_count = 0;          char                    *brick_name = NULL;          int                     interval = 0;          char                    key[1024] = {0,};          int                     i = 0; +        int                     stats_cleared = 0;          ret = cli_begin_xml_output (&writer, &doc);          if (ret) @@ -2261,7 +2263,7 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,                                                 "%d", op);          XML_RET_CHECK_AND_GOTO (ret, out); -        if (op < GF_CLI_STATS_INFO || GF_CLI_STATS_INFO_CUMULATIVE < op) +        if (GF_CLI_STATS_INFO != op)                  goto cont;          ret = dict_get_int32 (dict, "count", &brick_count); @@ -2271,6 +2273,10 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,                                                 "%d", brick_count);          XML_RET_CHECK_AND_GOTO (ret, out); +        ret = dict_get_int32 (dict, "info-op", &info_op); +        if (ret) +                goto out; +          while (i < brick_count) {                  i++; @@ -2286,23 +2292,37 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,                          (writer, (xmlChar *)"brickName", "%s", brick_name);                  XML_RET_CHECK_AND_GOTO (ret, out); -                snprintf (key, sizeof (key), "%d-cumulative", i); -                ret = dict_get_int32 (dict, key, &interval); -                if (ret == 0) { -                        ret = cli_xml_output_vol_profile_stats -                                (writer, dict, i, interval); +                if (GF_CLI_INFO_CLEAR == info_op) { +                        snprintf (key, sizeof (key), "%d-stats-cleared", i); +                        ret = dict_get_int32 (dict, key, &stats_cleared);                          if (ret)                                  goto out; -                } -                memset (key, 0, sizeof (key)); -                snprintf (key, sizeof (key), "%d-interval", i); -                ret = dict_get_int32 (dict, key, &interval); -                if (ret == 0) { -                        ret = cli_xml_output_vol_profile_stats -                                (writer, dict, i, interval); +                        ret = xmlTextWriterWriteFormatElement +                                (writer, (xmlChar *)"clearStats", "%s",  +                                stats_cleared ? "Cleared stats." : +                                                 "Failed to clear stats.");                          if (ret)                                  goto out; +                } else { +                        snprintf (key, sizeof (key), "%d-cumulative", i); +                        ret = dict_get_int32 (dict, key, &interval); +                        if (ret == 0) { +                                ret = cli_xml_output_vol_profile_stats +                                        (writer, dict, i, interval); +                                if (ret) +                                        goto out; +                        } + +                        memset (key, 0, sizeof (key)); +                        snprintf (key, sizeof (key), "%d-interval", i); +                        ret = dict_get_int32 (dict, key, &interval); +                        if (ret == 0) { +                                ret = cli_xml_output_vol_profile_stats +                                        (writer, dict, i, interval); +                                if (ret) +                                        goto out; +                        }                  }                  /* </brick> */ diff --git a/rpc/xdr/src/cli1-xdr.c b/rpc/xdr/src/cli1-xdr.c index 7d85b43c196..bf58e990456 100644 --- a/rpc/xdr/src/cli1-xdr.c +++ b/rpc/xdr/src/cli1-xdr.c @@ -157,6 +157,17 @@ xdr_gf1_cli_stats_op (XDR *xdrs, gf1_cli_stats_op *objp)  }  bool_t +xdr_gf1_cli_info_op (XDR *xdrs, gf1_cli_info_op *objp) +{ +	register int32_t *buf; +        buf = NULL; + +	 if (!xdr_enum (xdrs, (enum_t *) objp)) +		 return FALSE; +	return TRUE; +} + +bool_t  xdr_gf1_cli_top_op (XDR *xdrs, gf1_cli_top_op *objp)  {  	register int32_t *buf; diff --git a/rpc/xdr/src/cli1-xdr.h b/rpc/xdr/src/cli1-xdr.h index 815384e808d..11297cc25f9 100644 --- a/rpc/xdr/src/cli1-xdr.h +++ b/rpc/xdr/src/cli1-xdr.h @@ -140,12 +140,19 @@ enum gf1_cli_stats_op {  	GF_CLI_STATS_START = 1,  	GF_CLI_STATS_STOP = 2,  	GF_CLI_STATS_INFO = 3, -	GF_CLI_STATS_INFO_INCREMENTAL = 4, -	GF_CLI_STATS_INFO_CUMULATIVE = 5, -	GF_CLI_STATS_TOP = 6 +	GF_CLI_STATS_TOP = 4,  };  typedef enum gf1_cli_stats_op gf1_cli_stats_op; +enum gf1_cli_info_op { +	GF_CLI_INFO_NONE = 0, +	GF_CLI_INFO_ALL = 1, +	GF_CLI_INFO_INCREMENTAL = 2, +	GF_CLI_INFO_CUMULATIVE = 3, +	GF_CLI_INFO_CLEAR = 4, +}; +typedef enum gf1_cli_info_op gf1_cli_info_op; +  enum gf1_cli_top_op {  	GF_CLI_TOP_NONE = 0,  	GF_CLI_TOP_OPEN = 0 + 1, @@ -286,6 +293,7 @@ extern  bool_t xdr_gf1_cli_sync_volume (XDR *, gf1_cli_sync_volume*);  extern  bool_t xdr_gf1_cli_op_flags (XDR *, gf1_cli_op_flags*);  extern  bool_t xdr_gf1_cli_gsync_set (XDR *, gf1_cli_gsync_set*);  extern  bool_t xdr_gf1_cli_stats_op (XDR *, gf1_cli_stats_op*); +extern  bool_t xdr_gf1_cli_info_op (XDR *, gf1_cli_info_op*);  extern  bool_t xdr_gf1_cli_top_op (XDR *, gf1_cli_top_op*);  extern  bool_t xdr_gf_cli_status_type (XDR *, gf_cli_status_type*);  extern  bool_t xdr_gf_cli_req (XDR *, gf_cli_req*); @@ -314,6 +322,7 @@ extern bool_t xdr_gf1_cli_sync_volume ();  extern bool_t xdr_gf1_cli_op_flags ();  extern bool_t xdr_gf1_cli_gsync_set ();  extern bool_t xdr_gf1_cli_stats_op (); +extern bool_t xdr_gf1_cli_info_op ();  extern bool_t xdr_gf1_cli_top_op ();  extern bool_t xdr_gf_cli_status_type ();  extern bool_t xdr_gf_cli_req (); diff --git a/rpc/xdr/src/cli1-xdr.x b/rpc/xdr/src/cli1-xdr.x index 46f4581eeae..a283006b0bf 100644 --- a/rpc/xdr/src/cli1-xdr.x +++ b/rpc/xdr/src/cli1-xdr.x @@ -97,6 +97,14 @@ enum gf1_cli_stats_op {          GF_CLI_STATS_TOP = 4  }; +enum gf1_cli_info_op { +	    GF_CLI_INFO_NONE = 0, +	    GF_CLI_INFO_ALL = 1, +	    GF_CLI_INFO_INCREMENTAL = 2, +	    GF_CLI_INFO_CUMULATIVE = 3, +	    GF_CLI_INFO_CLEAR = 4 +}; +  enum gf1_cli_top_op {          GF_CLI_TOP_NONE = 0,          GF_CLI_TOP_OPEN, diff --git a/tests/bugs/bug-1030580.t b/tests/bugs/bug-1030580.t index ed1cdb864c8..642c6dc4460 100644 --- a/tests/bugs/bug-1030580.t +++ b/tests/bugs/bug-1030580.t @@ -9,14 +9,6 @@ function write_to_file {      dd of=$M0/1 if=/dev/zero bs=1M count=128 oflag=append 2>&1 >/dev/null  } -function cumulative_stat_count { -    echo "$1" | grep "Cumulative Stats:" | wc -l -} - -function incremental_stat_count { -    echo "$1" | grep "Interval$2Stats:" | wc -l -} -  TEST glusterd  TEST pidof glusterd  TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 diff --git a/tests/bugs/bug-1047416.t b/tests/bugs/bug-1047416.t new file mode 100644 index 00000000000..53c7f861462 --- /dev/null +++ b/tests/bugs/bug-1047416.t @@ -0,0 +1,66 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +function write_to_file { +    dd of=$M0/1 if=/dev/zero bs=1M count=128 oflag=append 2>&1 >/dev/null +} + +TEST glusterd +TEST pidof glusterd +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}0 $H0:$B0/${V0}1 +TEST $CLI volume start $V0 +TEST $CLI volume profile $V0 start +TEST glusterfs --volfile-id=/$V0 --volfile-server=$H0 $M0 --attribute-timeout=0 --entry-timeout=0 + +# Verify 'volume profile info' prints both cumulative and incremental stats +write_to_file & +wait +output=$($CLI volume profile $V0 info) +EXPECT 2 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 0 ' + +# Verify 'volume profile info peek' prints both cumulative and incremental stats +# without clearing incremental stats +write_to_file & +wait +output=$($CLI volume profile $V0 info peek) +EXPECT 2 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 1 ' + +write_to_file & +wait +output=$($CLI volume profile $V0 info peek) +EXPECT 2 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 1 ' + +# Verify 'volume profile info incremental peek' prints incremental stats only  +# without clearing incremental stats +write_to_file & +wait +output=$($CLI volume profile $V0 info incremental peek) +EXPECT 0 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 1 ' + +write_to_file & +wait +output=$($CLI volume profile $V0 info incremental peek) +EXPECT 0 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 1 ' + +# Verify 'volume profile info clear' clears both incremental and cumulative stats +write_to_file & +wait +output=$($CLI volume profile $V0 info clear) +EXPECT 2 cleared_stat_count "$output" + +output=$($CLI volume profile $V0 info) +EXPECT 2 cumulative_stat_count "$output" +EXPECT 2 incremental_stat_count "$output" ' 0 ' +EXPECT 4 data_read_count "$output" ' 0 ' +EXPECT 4 data_written_count "$output" ' 0 ' + +cleanup; diff --git a/tests/volume.rc b/tests/volume.rc index b1aa904fb27..5e2f95e766d 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -279,3 +279,26 @@ function get_hex_xattr {          local path=$2          getfattr -d -m. -e hex $2 2>/dev/null | grep $1 | cut -f2 -d'=' | cut -f2 -d'x'  } + +function cumulative_stat_count { +    echo "$1" | grep "Cumulative Stats:" | wc -l +} + +function incremental_stat_count { +    echo "$1" | grep "Interval$2Stats:" | wc -l +} + +function cleared_stat_count { +    echo "$1" | grep "Cleared stats." | wc -l +} + +function data_read_count { +    echo "$1" | grep "Data Read:$2bytes" | wc -l +} + +function data_written_count { +    echo "$1" | grep "Data Written:$2bytes" | wc -l +} + + + diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index 65aeee52bfb..fa0dd395ceb 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -917,9 +917,19 @@ ios_dump_args_init (struct ios_dump_args *args, ios_dump_type_t type,          return ret;  } +static void +ios_global_stats_clear (struct ios_global_stats *stats, struct timeval *now) +{ +        GF_ASSERT (stats); +        GF_ASSERT (now); + +        memset (stats, 0, sizeof (*stats)); +        stats->started_at = *now; +} +  int  io_stats_dump (xlator_t *this, struct ios_dump_args *args, -               gf1_cli_stats_op op) +               gf1_cli_stats_op op, gf_boolean_t is_peek)  {          struct ios_conf         *conf = NULL;          struct ios_global_stats  cumulative = {0, }; @@ -937,29 +947,31 @@ io_stats_dump (xlator_t *this, struct ios_dump_args *args,          gettimeofday (&now, NULL);          LOCK (&conf->lock);          { -                if (op == GF_CLI_STATS_INFO || -                    op == GF_CLI_STATS_INFO_CUMULATIVE) +                if (op == GF_CLI_INFO_ALL || +                    op == GF_CLI_INFO_CUMULATIVE)                          cumulative  = conf->cumulative; -                if (op == GF_CLI_STATS_INFO || -                    op == GF_CLI_STATS_INFO_INCREMENTAL) { +                if (op == GF_CLI_INFO_ALL || +                    op == GF_CLI_INFO_INCREMENTAL) {                          incremental = conf->incremental; +                        increment = conf->increment; -                        increment = conf->increment++; +                        if (!is_peek) { +                                increment = conf->increment++; -                        memset (&conf->incremental, 0, -                                sizeof (conf->incremental)); -                        conf->incremental.started_at = now; +                                ios_global_stats_clear (&conf->incremental, +                                                        &now); +                        }                  }          }          UNLOCK (&conf->lock); -        if (op == GF_CLI_STATS_INFO || -            op == GF_CLI_STATS_INFO_CUMULATIVE) +        if (op == GF_CLI_INFO_ALL || +            op == GF_CLI_INFO_CUMULATIVE)                  io_stats_dump_global (this, &cumulative, &now, -1, args); -        if (op == GF_CLI_STATS_INFO || -            op == GF_CLI_STATS_INFO_INCREMENTAL) +        if (op == GF_CLI_INFO_ALL || +            op == GF_CLI_INFO_INCREMENTAL)                  io_stats_dump_global (this, &incremental, &now, increment, args);          return 0; @@ -2218,10 +2230,10 @@ conditional_dump (dict_t *dict, char *key, data_t *value, void *data)                          gf_log (this->name, GF_LOG_ERROR, "failed to open %s "                                  "for writing", filename);                          return -1; -                } +                    }                  (void) ios_dump_args_init (&args, IOS_DUMP_TYPE_FILE,                                             logfp); -                io_stats_dump (this, &args, GF_CLI_STATS_INFO); +                io_stats_dump (this, &args, GF_CLI_INFO_ALL, _gf_false);                  fclose (logfp);          }          return 0; @@ -2625,6 +2637,29 @@ ios_destroy_top_stats (struct ios_conf *conf)          return;  } +static int +io_stats_clear (struct ios_conf *conf) +{ +        struct timeval      now; +        int                 ret = -1; + +        GF_ASSERT (conf); + +        if (!gettimeofday (&now, NULL)) +        { +            LOCK (&conf->lock); +            { +                    ios_global_stats_clear (&conf->cumulative, &now); +                    ios_global_stats_clear (&conf->incremental, &now); +                    conf->increment = 0; +            } +            UNLOCK (&conf->lock); +            ret = 0; +        } + +        return ret; +} +  int  reconfigure (xlator_t *this, dict_t *options)  { @@ -2791,6 +2826,7 @@ notify (xlator_t *this, int32_t event, void *data, ...)          int32_t       list_cnt = 0;          double        throughput = 0;          double        time = 0; +        gf_boolean_t  is_peek = _gf_false;          va_list ap;          dict = data; @@ -2851,13 +2887,40 @@ notify (xlator_t *this, int32_t event, void *data, ...)                          }                  } else {                          ret = dict_get_int32 (dict, "info-op", &op); -                        if (ret || op < GF_CLI_STATS_INFO || -                            GF_CLI_STATS_INFO_CUMULATIVE < op) -                            op = GF_CLI_STATS_INFO; +                        if (ret || op < GF_CLI_INFO_ALL || +                            GF_CLI_INFO_CLEAR < op) +                            op = GF_CLI_INFO_ALL; + +                        ret = dict_set_int32 (output, "info-op", op); +                        if (ret) { +                                gf_log (this->name, GF_LOG_ERROR, +                                        "Failed to set info-op in dict"); +                                goto out; +                        } + +                        if (GF_CLI_INFO_CLEAR == op) { +                                ret = io_stats_clear (this->private); +                                if (ret) +                                        gf_log (this->name, GF_LOG_ERROR, +                                                "Failed to clear info stats"); -                        (void) ios_dump_args_init (&args, IOS_DUMP_TYPE_DICT, -                                           output); -                        ret = io_stats_dump (this, &args, op); +                                ret = dict_set_int32 (output, "stats-cleared", +                                              ret ? 0 : 1); +                                if (ret) +                                        gf_log (this->name, GF_LOG_ERROR, +                                                "Failed to set stats-cleared" +                                                " in dict"); +                        } +                        else { +                                ret = dict_get_str_boolean (dict, "peek", +                                                            _gf_false); +                                if (-1 != ret) +                                        is_peek = ret; + +                                (void) ios_dump_args_init (&args, +                                                IOS_DUMP_TYPE_DICT, output); +                                ret = io_stats_dump (this, &args, op, is_peek); +                        }                  }                  break;          default: diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 06ee849f53d..0ddb52b3a1d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -1094,8 +1094,7 @@ glusterd_op_stage_stats_volume (dict_t *dict, char **op_errstr)          }          if ((GF_CLI_STATS_STOP == stats_op) || -            (GF_CLI_STATS_INFO <= stats_op && -             stats_op <= GF_CLI_STATS_INFO_CUMULATIVE)) { +            (GF_CLI_STATS_INFO == stats_op)) {                  if (_gf_false == glusterd_is_profile_on (volinfo)) {                          snprintf (msg, sizeof (msg), "Profile on Volume %s is"                                    " not started", volinfo->volname); @@ -1105,8 +1104,7 @@ glusterd_op_stage_stats_volume (dict_t *dict, char **op_errstr)                  }          }          if ((GF_CLI_STATS_TOP == stats_op) || -            (GF_CLI_STATS_INFO <= stats_op && -             stats_op <= GF_CLI_STATS_INFO_CUMULATIVE)) { +            (GF_CLI_STATS_INFO == stats_op)) {                  if (_gf_false == glusterd_is_volume_started (volinfo)) {                          snprintf (msg, sizeof (msg), "Volume %s is not started.",                                    volinfo->volname); @@ -1908,8 +1906,6 @@ glusterd_op_stats_volume (dict_t *dict, char **op_errstr,                  glusterd_remove_profile_volume_options (volinfo);                  break;          case GF_CLI_STATS_INFO: -        case GF_CLI_STATS_INFO_INCREMENTAL: -        case GF_CLI_STATS_INFO_CUMULATIVE:          case GF_CLI_STATS_TOP:                  //info is already collected in brick op.                  //just goto out; @@ -4480,8 +4476,6 @@ glusterd_bricks_select_profile_volume (dict_t *dict, char **op_errstr,                  goto out;                  break;          case GF_CLI_STATS_INFO: -        case GF_CLI_STATS_INFO_INCREMENTAL: -        case GF_CLI_STATS_INFO_CUMULATIVE:                  ret = dict_get_str_boolean (dict, "nfs", _gf_false);                  if (ret) {                          if (!glusterd_is_nodesvc_online ("nfs")) {  | 
