diff options
author | Gaurav Kumar Garg <garg.gaurav52@gmail.com> | 2015-11-20 14:00:38 +0530 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2015-11-22 19:53:58 -0800 |
commit | 164a8dda2cbf10862483e0333ebf7e727fc87f07 (patch) | |
tree | e4f5fa14ac5f99261094bf91d701d2adc1d3d4da /cli | |
parent | 9e096b42d9e6448175eecf0e9b979a644c6104b0 (diff) |
glusterd: cli command implementation for bitrot scrub status
This patch is backport of: http://review.gluster.org/10231
CLI command for bitrot scrub status will be :
gluster volume bitrot <volname> scrub status
Above command will show the statistics of bitrot scrubber.
Upon execution of this command it will show some common
scrubber tunable value of volume <VOLNAME> followed by
statistics of scrubber statistics of individual nodes.
sample ouput for single node:
Volume name : <VOLNAME>
State of scrub: Active
Scrub frequency: biweekly
Bitrot error log location: /var/log/glusterfs/bitd.log
Scrubber error log location: /var/log/glusterfs/scrub.log
=========================================================
Node name:
Number of Scrubbed files:
Number of Unsigned files:
Last completed scrub time:
Duration of last scrub:
Error count:
=========================================================
This is just infrastructure. list of bad file, last scrub
time, error count value will be taken care by
http://review.gluster.org/#/c/12503/ and
http://review.gluster.org/#/c/12654/ patches.
>> Change-Id: I3ed3c7057c9d0c894233f4079a7f185d90c202d1
>> BUG: 1207627
>> Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
>> Reviewed-on: http://review.gluster.org/10231
>> Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
>> Tested-by: NetBSD Build System <jenkins@build.gluster.org>
>> Tested-by: Gluster Build System <jenkins@build.gluster.com>
Change-Id: I45ed94e5e0e78a1e007c30eb0b252f74cf3c9187
BUG: 1283881
Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
Reviewed-on: http://review.gluster.org/12704
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Diffstat (limited to 'cli')
-rw-r--r-- | cli/src/cli-cmd-parser.c | 19 | ||||
-rw-r--r-- | cli/src/cli-cmd-volume.c | 2 | ||||
-rw-r--r-- | cli/src/cli-rpc-ops.c | 163 |
3 files changed, 181 insertions, 3 deletions
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index ab18aa1ae6d..cc0a9aba96c 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -5094,7 +5094,7 @@ cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options) "biweekly", "monthly", NULL}; char *scrub_values[] = {"pause", "resume", - NULL}; + "status", NULL}; dict_t *dict = NULL; gf_bitrot_type type = GF_BITROT_OPTION_TYPE_NONE; int32_t expiry_time = 0; @@ -5158,6 +5158,23 @@ cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options) } } + if ((strcmp (words[3], "scrub") == 0) && + (strcmp (words[4], "status") == 0)) { + if (wordcount == 5) { + type = GF_BITROT_CMD_SCRUB_STATUS; + ret = dict_set_str (dict, "scrub-value", + (char *) words[4]); + if (ret) { + cli_out ("Failed to set dict for scrub status"); + goto out; + } + goto set_type; + } else { + ret = -1; + goto out; + } + } + if (!strcmp (w, "scrub-throttle")) { if (!words[4]) { cli_err ("Missing scrub-throttle value for bitrot " diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 64f1d9d1b38..48ac4201ac9 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -2788,7 +2788,7 @@ struct cli_cmd volume_cmds[] = { "volume bitrot <volname> scrub-throttle {lazy|normal|aggressive} |\n" "volume bitrot <volname> scrub-frequency {hourly|daily|weekly|biweekly" "|monthly} |\n" - "volume bitrot <volname> scrub {pause|resume}", + "volume bitrot <volname> scrub {pause|resume|status}", cli_cmd_bitrot_cbk, "Bitrot translator specific operation. For more information about " "bitrot command type 'man gluster'" diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index 75e5ad49640..24ca507c904 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -10672,10 +10672,156 @@ out: } int +gf_cli_print_bitrot_scrub_status (dict_t *dict) +{ + int i = 1; + int ret = -1; + int count = 0; + char key[256] = {0,}; + char *volname = NULL; + char *node_name = NULL; + char *scrub_freq = NULL; + char *state_scrub = NULL; + char *scrub_impact = NULL; + char *scrub_log_file = NULL; + char *bitrot_log_file = NULL; + uint64_t scrub_files = 0; + uint64_t unsigned_files = 0; + uint64_t scrub_time = 0; + uint64_t last_scrub = 0; + uint64_t error_count = 0; + + + ret = dict_get_str (dict, "volname", &volname); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get volume name"); + + ret = dict_get_str (dict, "features.scrub", &state_scrub); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get scrub state value"); + + ret = dict_get_str (dict, "features.scrub-throttle", &scrub_impact); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get scrub impact " + "value"); + + ret = dict_get_str (dict, "features.scrub-freq", &scrub_freq); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get scrub -freq value"); + + ret = dict_get_str (dict, "bitrot_log_file", &bitrot_log_file); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get bitrot log file " + "location"); + + ret = dict_get_str (dict, "scrub_log_file", &scrub_log_file); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get scrubber log file " + "location"); + + ret = dict_get_int32 (dict, "count", &count); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "count not get count value from" + " dictionary"); + goto out; + } + + cli_out ("\n%s: %s\n", "Volume name ", volname); + + cli_out ("%s: %s\n", "State of scrub", state_scrub); + + cli_out ("%s: %s\n", "Scrub impact", scrub_impact); + + cli_out ("%s: %s\n", "Scrub frequency", scrub_freq); + + cli_out ("%s: %s\n", "Bitrot error log location", bitrot_log_file); + + cli_out ("%s: %s\n", "Scrubber error log location", scrub_log_file); + + + for (i = 1; i <= count; i++) { + /* Reset the variables to prevent carryover of values */ + node_name = NULL; + last_scrub = 0; + scrub_time = 0; + error_count = 0; + scrub_files = 0; + unsigned_files = 0; + + memset (key, 0, 256); + snprintf (key, 256, "node-name-%d", i); + ret = dict_get_str (dict, key, &node_name); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get node-name"); + + memset (key, 0, 256); + snprintf (key, 256, "scrubbed-files-%d", i); + ret = dict_get_uint64 (dict, key, &scrub_files); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get scrubbed " + "files"); + + memset (key, 0, 256); + snprintf (key, 256, "unsigned-files-%d", i); + ret = dict_get_uint64 (dict, key, &unsigned_files); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get unsigned " + "files"); + + memset (key, 0, 256); + snprintf (key, 256, "scrub-duration-%d", i); + ret = dict_get_uint64 (dict, key, &scrub_time); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get last scrub " + "duration"); + + memset (key, 0, 256); + snprintf (key, 256, "last-scrub-time-%d", i); + ret = dict_get_uint64 (dict, key, &last_scrub); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get last scrub" + " time"); + + memset (key, 0, 256); + snprintf (key, 256, "error-count-%d", i); + ret = dict_get_uint64 (dict, key, &error_count); + if (ret) + gf_log ("cli", GF_LOG_TRACE, "failed to get error " + "count"); + + cli_out ("\n%s\n", "==========================================" + "==============="); + + cli_out ("%s: %s\n", "Node name", node_name); + + cli_out ("%s: %"PRIu64 "\n", "Number of Scrubbed files", + scrub_files); + + cli_out ("%s: %"PRIu64 "\n", "Number of Unsigned files", + unsigned_files); + + cli_out ("%s: %"PRIu64 "\n", "Last completed scrub time", + scrub_time); + + cli_out ("%s: %"PRIu64 "\n", "Duration of last scrub", + last_scrub); + + cli_out ("%s: %"PRIu64 "\n", "Error count", error_count); + + } + cli_out ("%s\n", "==========================================" + "==============="); + +out: + return 0; +} + +int gf_cli_bitrot_cbk (struct rpc_req *req, struct iovec *iov, int count, void *myframe) { int ret = -1; + int type = 0; gf_cli_rsp rsp = {0, }; dict_t *dict = NULL; call_frame_t *frame = NULL; @@ -10729,6 +10875,22 @@ gf_cli_bitrot_cbk (struct rpc_req *req, struct iovec *iov, gf_log ("cli", GF_LOG_DEBUG, "Received resp to bit rot command"); + ret = dict_get_int32 (dict, "type", &type); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "Failed to get command type"); + goto out; + } + + if ((type == GF_BITROT_CMD_SCRUB_STATUS) && + !(global_state->mode & GLUSTER_MODE_XML)) { + ret = gf_cli_print_bitrot_scrub_status (dict); + if (ret) { + gf_log ("cli", GF_LOG_ERROR, "Failed to print bitrot " + "scrub status"); + } + goto out; + } + xml_output: if (global_state->mode & GLUSTER_MODE_XML) { ret = cli_xml_output_vol_profile (dict, rsp.op_ret, @@ -10755,7 +10917,6 @@ out: cli_cmd_broadcast_response (ret); return ret; - } int32_t |