diff options
| -rwxr-xr-x | tests/bugs/bug-765230.t | 60 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 52 | 
2 files changed, 110 insertions, 2 deletions
diff --git a/tests/bugs/bug-765230.t b/tests/bugs/bug-765230.t new file mode 100755 index 00000000000..2012be5ad07 --- /dev/null +++ b/tests/bugs/bug-765230.t @@ -0,0 +1,60 @@ +#!/bin/bash + +. $(dirname $0)/../include.rc +. $(dirname $0)/../volume.rc + +cleanup; + +## Start and create a volume +TEST glusterd; +TEST pidof glusterd; +TEST $CLI volume create $V0 replica 2 stripe 2 $H0:$B0/${V0}{1,2,3,4,5,6,7,8}; + +## Verify volume is created +EXPECT "$V0" volinfo_field $V0 'Volume Name'; +EXPECT 'Created' volinfo_field $V0 'Status'; + +## Start volume and verify +TEST $CLI volume start $V0; +EXPECT 'Started' volinfo_field $V0 'Status'; + +## Setting quota-timeout as 20 +TEST ! $CLI volume set $V0 features.quota-timeout 20 +EXPECT '' volinfo_field $V0 'features.quota-timeout'; + +## Enabling features.quota-deem-statfs +TEST ! $CLI volume set $V0 features.quota-deem-statfs on +EXPECT '' volinfo_field $V0 'features.quota-deem-statfs' + +## Enabling quota +TEST $CLI volume quota $V0 enable +EXPECT 'on' volinfo_field $V0 'features.quota' + +## Setting quota-timeout as 20 +TEST $CLI volume set $V0 features.quota-timeout 20 +EXPECT '20' volinfo_field $V0 'features.quota-timeout'; + +## Enabling features.quota-deem-statfs +TEST $CLI volume set $V0 features.quota-deem-statfs on +EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs' + +## Disabling quota +TEST $CLI volume quota $V0 disable +EXPECT 'off' volinfo_field $V0 'features.quota' + +## Setting quota-timeout as 30 +TEST ! $CLI volume set $V0 features.quota-timeout 30 +EXPECT '20' volinfo_field $V0 'features.quota-timeout'; + +## Disabling features.quota-deem-statfs +TEST ! $CLI volume set $V0 features.quota-deem-statfs off +EXPECT 'on' volinfo_field $V0 'features.quota-deem-statfs' + +## Finish up +TEST $CLI volume stop $V0; +EXPECT 'Stopped' volinfo_field $V0 'Status'; + +TEST $CLI volume delete $V0; +TEST ! $CLI volume info $V0; + +cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index e66c1f9bbea..721f88cde73 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -161,6 +161,52 @@ out:          return ret;  } +static int +validate_quota (dict_t *dict, char *key, char *value, +                char **op_errstr) +{ +        char                 errstr[2048] = ""; +        char                *volname      = NULL; +        glusterd_conf_t     *priv         = NULL; +        glusterd_volinfo_t  *volinfo      = NULL; +        int                  ret          = 0; +        xlator_t            *this         = NULL; + +        this = THIS; +        GF_ASSERT (this); +        priv = this->private; +        GF_ASSERT (priv); + +        ret = check_dict_key_value (dict, key, value); +        if (ret) +                goto out; + +        ret = get_volname_volinfo (dict, &volname, &volinfo); +        if (ret) +                goto out; + +        ret = glusterd_volinfo_get_boolean (volinfo, VKEY_FEATURES_QUOTA); +        if (ret == -1) { +                gf_log (this->name, GF_LOG_ERROR, +                        "failed to get the quota status"); +                goto out; +        } + +        if (ret == _gf_false) { +                snprintf (errstr, sizeof (errstr), +                          "Cannot set %s. Enable quota first.", key); +                gf_log (this->name, GF_LOG_ERROR, "%s", errstr); +                *op_errstr = gf_strdup (errstr); +                ret = -1; +                goto out; +        } + +        ret = 0; +out: +        gf_log (this->name, GF_LOG_DEBUG, "Returning %d", ret); + +        return ret; +}  /* dispatch table for VOLUME SET   * ----------------------------- @@ -729,7 +775,8 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .voltype     = "features/quota",            .option      = "timeout",            .value       = "0", -          .op_version  = 1 +          .op_version  = 1, +          .validate_fn = validate_quota          },          { .key         = "features.quota-deem-statfs",            .voltype     = "features/quota", @@ -737,7 +784,8 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .value       = "off",            .type        = DOC,            .flags       = 0, -          .op_version  = 2 +          .op_version  = 2, +          .validate_fn = validate_quota          },          /* Marker xlator options */  | 
