diff options
author | Gaurav Kumar Garg <ggarg@redhat.com> | 2015-04-13 12:34:26 +0530 |
---|---|---|
committer | Kaushal M <kaushal@redhat.com> | 2015-05-07 00:27:05 -0700 |
commit | d68a2dbb3a4be89a4a45661310ae3f32542df20f (patch) | |
tree | 88cae982042346d0952b0411944d4667d4da1d18 | |
parent | 02583099a219ce327aac62af22b486c7b9fcb531 (diff) |
bitrot/glusterd: Bitrot scrub pause/resume should give proper error
bitrot scrubber paused/resume command should give proper error messages if
scrubber already pause/resume and user again try to perform same
operation on a volume.
Change-Id: I01ad69c80f03b177535a4e5f1c95ab7709a804b0
BUG: 1210684
Signed-off-by: Gaurav Kumar Garg <ggarg@redhat.com>
Reviewed-on: http://review.gluster.org/10209
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaushal M <kaushal@redhat.com>
-rw-r--r-- | tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t | 37 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-bitrot.c | 46 |
2 files changed, 77 insertions, 6 deletions
diff --git a/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t b/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t new file mode 100644 index 00000000000..0a306df4698 --- /dev/null +++ b/tests/bugs/bitrot/bug-1210684-scrub-pause-resume-error-handling.t @@ -0,0 +1,37 @@ +#!/bin/bash + +## Test case for bitrot BZ:1210684 +## Bitrot scrub pause/resume option should give proper error if scrubber is +## already pause/resume and admin try to perform same operation on a volume + + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc +. $(dirname $0)/../../cluster.rc + +cleanup; + +## Start glusterd +TEST glusterd; +TEST pidof glusterd; + +## Lets create and start the volume +TEST $CLI volume create $V0 $H0:$B0/${V0}{1..2} +TEST $CLI volume start $V0 + +## Enable bitrot for volume $V0 +TEST $CLI volume bitrot $V0 enable + +## Pause scrubber operation on volume $V0 +TEST $CLI volume bitrot $V0 scrub pause + +## Pausing scrubber again should not success and should give error +TEST ! $CLI volume bitrot $V0 scrub pause + +## Resume scrubber operation on volume $V0 +TEST $CLI volume bitrot $V0 scrub resume + +## Resuming scrubber again should not success and should give error +TEST ! $CLI volume bitrot $V0 scrub resume + +cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-bitrot.c b/xlators/mgmt/glusterd/src/glusterd-bitrot.c index 5474f30626a..456e5e788ab 100644 --- a/xlators/mgmt/glusterd/src/glusterd-bitrot.c +++ b/xlators/mgmt/glusterd/src/glusterd-bitrot.c @@ -507,12 +507,15 @@ out: int glusterd_op_stage_bitrot (dict_t *dict, char **op_errstr, dict_t *rsp_dict) { - int ret = 0; - char *volname = NULL; - int type = 0; - xlator_t *this = NULL; - glusterd_conf_t *priv = NULL; - glusterd_volinfo_t *volinfo = NULL; + int ret = 0; + char *volname = NULL; + char *scrub_cmd = NULL; + char *scrub_cmd_from_dict = NULL; + char msg[2048] = {0,}; + int type = 0; + xlator_t *this = NULL; + glusterd_conf_t *priv = NULL; + glusterd_volinfo_t *volinfo = NULL; this = THIS; GF_ASSERT (this); @@ -560,6 +563,37 @@ glusterd_op_stage_bitrot (dict_t *dict, char **op_errstr, dict_t *rsp_dict) goto out; } + if ((GF_BITROT_OPTION_TYPE_SCRUB == type)) { + ret = dict_get_str (volinfo->dict, "features.scrub", + &scrub_cmd_from_dict); + if (!ret) { + ret = dict_get_str (dict, "scrub-value", &scrub_cmd); + if (ret) { + gf_log (this->name, GF_LOG_ERROR, "Unable to " + "get scrub-value"); + *op_errstr = gf_strdup ("Staging failed for " + "bitrot operation. " + "Please check log file" + " for more details."); + goto out; + } + /* If scrubber is resume then value of scrubber will be + * "Active" in the dictionary. */ + if (!strcmp (scrub_cmd_from_dict, scrub_cmd) || + (!strncmp ("Active", scrub_cmd_from_dict, + strlen("Active")) && !strncmp ("resume", + scrub_cmd, strlen("resume")))) { + snprintf (msg, sizeof (msg), "Scrub is already" + " %sd for volume %s", scrub_cmd, + volinfo->volname); + *op_errstr = gf_strdup (msg); + ret = -1; + goto out; + } + } + ret = 0; + } + out: if (ret && op_errstr && *op_errstr) gf_log (this->name, GF_LOG_ERROR, "%s", *op_errstr); |