diff options
| -rw-r--r-- | tests/bugs/bitrot/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/1210684-scrub-pause-resume-error-handling.t b/tests/bugs/bitrot/1210684-scrub-pause-resume-error-handling.t new file mode 100644 index 00000000000..0a306df4698 --- /dev/null +++ b/tests/bugs/bitrot/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);  | 
