diff options
author | Dawit Alemu <dalemu@redhat.com> | 2013-12-30 22:59:39 -0500 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-01-24 02:05:35 -0800 |
commit | 48b8186bdc2f5e45b58aadf849b2bd60c9a77330 (patch) | |
tree | b6c3c49cb40bf14572da45b346a54ab175739859 /xlators/debug/io-stats | |
parent | bb63256b7ea1f186bbe3fae9040a6c191c9d6544 (diff) |
cli: Add options to the CLI that let the user control the reset of
stats
"volume profile info" automatically clears incremental stats. There
isn't a command to:
- fetch stats without clearing incremental stats and
- clear cumulative and incremental stats
This change introduces two arguments (i.e. peek and clear). 'clear'
will wipe both incremental and cumulative stats. 'peek' fetches stats
without wiping incremental stats.
'volume profile info peek' - fetches incremental and cumulative stats
without wiping incremental stats
'volume profile info incremental peek' - fetches incremental stats
without wiping incremental stats
'volume profile info clear' - clears both incremental and cumultiave
stats
Change-Id: I91834515ad672eca5f882809941147d7d997c4c9
BUG: 1047416
Signed-off-by: Dawit Alemu <dalemu@redhat.com>
Reviewed-on: http://review.gluster.org/6620
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/debug/io-stats')
-rw-r--r-- | xlators/debug/io-stats/src/io-stats.c | 105 |
1 files changed, 84 insertions, 21 deletions
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: |