diff options
| -rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot-scrub.c | 65 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot.c | 1 | ||||
| -rw-r--r-- | xlators/features/bit-rot/src/bitd/bit-rot.h | 1 | 
3 files changed, 58 insertions, 9 deletions
diff --git a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c index 8a80052f250..e96d82d6282 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot-scrub.c @@ -555,6 +555,7 @@ br_scrubber_calc_scale (xlator_t *this,          switch (throttle) {          case BR_SCRUB_THROTTLE_VOID: +        case BR_SCRUB_THROTTLE_STALLED:                  scale = 0;                  break;          case BR_SCRUB_THROTTLE_LAZY: @@ -839,10 +840,28 @@ br_scrubber_configure (xlator_t *this, br_private_t *priv,          return ret;  } +static inline int32_t +br_scrubber_fetch_option (xlator_t *this, +                          char *opt, dict_t *options, char **value) +{ +        if (options) +                GF_OPTION_RECONF (opt, *value, options, str, error_return); +        else +                GF_OPTION_INIT (opt, *value, str, error_return); + +        return 0; + + error_return: +        return -1; +} + +/* internal "throttle" override */ +#define BR_SCRUB_STALLED  "STALLED" +  /* TODO: token buket spec */  static int32_t -br_scrubber_handle_throttle (xlator_t *this, -                             br_private_t *priv, dict_t *options) +br_scrubber_handle_throttle (xlator_t *this, br_private_t *priv, +                             dict_t *options, gf_boolean_t scrubstall)  {          int32_t ret = 0;          char *tmp = NULL; @@ -851,11 +870,12 @@ br_scrubber_handle_throttle (xlator_t *this,          fsscrub = &priv->fsscrub; -        if (options) -                GF_OPTION_RECONF ("scrub-throttle", -                                  tmp, options, str, error_return); -        else -                GF_OPTION_INIT ("scrub-throttle", tmp, str, error_return); +        ret = br_scrubber_fetch_option (this, "scrub-throttle", options, &tmp); +        if (ret) +                goto error_return; + +        if (scrubstall) +                tmp = BR_SCRUB_STALLED;          if (strcasecmp (tmp, "lazy") == 0)                  nthrottle = BR_SCRUB_THROTTLE_LAZY; @@ -863,6 +883,8 @@ br_scrubber_handle_throttle (xlator_t *this,                  nthrottle = BR_SCRUB_THROTTLE_NORMAL;          else if (strcasecmp (tmp, "aggressive") == 0)                  nthrottle = BR_SCRUB_THROTTLE_AGGRESSIVE; +        else if (strcasecmp (tmp, BR_SCRUB_STALLED) == 0) +                nthrottle = BR_SCRUB_THROTTLE_STALLED;          else                  goto error_return; @@ -878,13 +900,38 @@ br_scrubber_handle_throttle (xlator_t *this,          return -1;  } -/* TODO: pause/resume, frequency */ +static int32_t +br_scrubber_handle_stall (xlator_t *this, br_private_t *priv, +                          dict_t *options, gf_boolean_t *scrubstall) +{ +        int32_t ret = 0; +        char *tmp = NULL; + +        ret = br_scrubber_fetch_option (this, "scrub-state", options, &tmp); +        if (ret) +                goto error_return; + +        if (strcasecmp (tmp, "pause") == 0) /* anything else is active */ +                *scrubstall = _gf_true; + +        return 0; + + error_return: +        return -1; +} + +/* TODO: frequency */  int32_t  br_scrubber_handle_options (xlator_t *this, br_private_t *priv, dict_t *options)  {          int32_t ret = 0; +        gf_boolean_t scrubstall = _gf_false; /* not as dangerous as it sounds */ + +        ret = br_scrubber_handle_stall (this, priv, options, &scrubstall); +        if (ret) +                goto error_return; -        ret = br_scrubber_handle_throttle (this, priv, options); +        ret = br_scrubber_handle_throttle (this, priv, options, scrubstall);          if (ret)                  goto error_return; diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.c b/xlators/features/bit-rot/src/bitd/bit-rot.c index eea81aec53a..5638b0f348b 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot.c +++ b/xlators/features/bit-rot/src/bitd/bit-rot.c @@ -1626,6 +1626,7 @@ struct volume_options options[] = {          },          { .key = {"scrub-state"},            .type = GF_OPTION_TYPE_STR, +          .default_value = "active",            .description = "Pause/Resume scrub. Upon resume, scrubber "                           "continues from where it left off.",          }, diff --git a/xlators/features/bit-rot/src/bitd/bit-rot.h b/xlators/features/bit-rot/src/bitd/bit-rot.h index 6f21a6985ba..66515e3213c 100644 --- a/xlators/features/bit-rot/src/bitd/bit-rot.h +++ b/xlators/features/bit-rot/src/bitd/bit-rot.h @@ -43,6 +43,7 @@ typedef enum scrub_throttle {          BR_SCRUB_THROTTLE_LAZY       = 0,          BR_SCRUB_THROTTLE_NORMAL     = 1,          BR_SCRUB_THROTTLE_AGGRESSIVE = 2, +        BR_SCRUB_THROTTLE_STALLED    = 3,  } scrub_throttle_t;  #define signature_size(hl) (sizeof (br_isignature_t) + hl + 1)  | 
