summaryrefslogtreecommitdiffstats
path: root/cli
diff options
context:
space:
mode:
authorGaurav Kumar Garg <garg.gaurav52@gmail.com>2015-11-20 14:00:38 +0530
committerAtin Mukherjee <amukherj@redhat.com>2015-11-22 19:53:58 -0800
commit164a8dda2cbf10862483e0333ebf7e727fc87f07 (patch)
treee4f5fa14ac5f99261094bf91d701d2adc1d3d4da /cli
parent9e096b42d9e6448175eecf0e9b979a644c6104b0 (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.c19
-rw-r--r--cli/src/cli-cmd-volume.c2
-rw-r--r--cli/src/cli-rpc-ops.c163
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