diff options
| author | Sakshi <sabansal@redhat.com> | 2015-09-23 15:16:34 +0530 | 
|---|---|---|
| committer | Atin Mukherjee <amukherj@redhat.com> | 2015-10-01 07:12:10 -0700 | 
| commit | ba150681993b9d69b65976eca806bae2807dfcb3 (patch) | |
| tree | 9f02a5ae00656c596b2f1af0aac2799125104a68 | |
| parent | 7e396d836de8a411213eefc6024a33d89bc560d0 (diff) | |
glusterd: validate function for replica volume options
Change-Id: I5b4a28db101e9f7e07f4b388c7a2594051c9e8dd
BUG: 1265479
Signed-off-by: Sakshi <sabansal@redhat.com>
Reviewed-on: http://review.gluster.org/12215
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>
| -rw-r--r-- | tests/bugs/glusterd/bug-1265479-validate-replica-volume-options.t | 67 | ||||
| -rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-volume-set.c | 54 | 
2 files changed, 109 insertions, 12 deletions
diff --git a/tests/bugs/glusterd/bug-1265479-validate-replica-volume-options.t b/tests/bugs/glusterd/bug-1265479-validate-replica-volume-options.t new file mode 100644 index 00000000000..e2d43ca817b --- /dev/null +++ b/tests/bugs/glusterd/bug-1265479-validate-replica-volume-options.t @@ -0,0 +1,67 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; + +#Basic checks +TEST glusterd +TEST pidof glusterd +TEST $CLI volume info + +#Create a distributed volume +TEST $CLI volume create $V0 $H0:$B0/${V00}{1..2}; +TEST $CLI volume start $V0 + +#Setting data-self-heal option on for distribute volume +TEST ! $CLI volume set $V0 data-self-heal on +EXPECT '' volinfo_field $V0 'cluster.data-self-heal'; +TEST ! $CLI volume set $V0 cluster.data-self-heal on +EXPECT '' volinfo_field $V0 'cluster.data-self-heal'; + +#Setting metadata-self-heal option on for distribute volume +TEST ! $CLI volume set $V0 metadata-self-heal on +EXPECT '' volinfo_field $V0 'cluster.metadata-self-heal'; +TEST ! $CLI volume set $V0 cluster.metadata-self-heal on +EXPECT '' volinfo_field $V0 'cluster.metadata-self-heal'; + +#Setting entry-self-heal option on for distribute volume +TEST ! $CLI volume set $V0 entry-self-heal on +EXPECT '' volinfo_field $V0 'cluster.entrydata-self-heal'; +TEST ! $CLI volume set $V0 cluster.entry-self-heal on +EXPECT '' volinfo_field $V0 'cluster.entrydata-self-heal'; + +#Delete the volume +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0; + + +#Create a distribute-replicate volume +TEST $CLI volume create $V0 replica 2 $H0:$B0/${V0}{1,2,3,4}; +TEST $CLI volume start $V0 + +#Setting data-self-heal option on for distribute-replicate volume +TEST $CLI volume set $V0 data-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.data-self-heal'; +TEST $CLI volume set $V0 cluster.data-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.data-self-heal'; + +#Setting metadata-self-heal option on for distribute-replicate volume +TEST $CLI volume set $V0 metadata-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.metadata-self-heal'; +TEST $CLI volume set $V0 cluster.metadata-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.metadata-self-heal'; + +#Setting entry-self-heal option on for distribute-replicate volume +TEST $CLI volume set $V0 entry-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.entry-self-heal'; +TEST $CLI volume set $V0 cluster.entry-self-heal on +EXPECT 'on' volinfo_field $V0 'cluster.entry-self-heal'; + +#Delete the volume +TEST $CLI volume stop $V0 +TEST $CLI volume delete $V0; + + +cleanup; diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index a643083df05..5b347eace9f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -271,6 +271,33 @@ out:  }  static int +validate_replica (glusterd_volinfo_t *volinfo, dict_t *dict, char *key, +                 char *value, char **op_errstr) +{ +        char                 errstr[2048]  = ""; +        int                  ret           = 0; +        xlator_t            *this          = NULL; + +        this = THIS; +        GF_ASSERT (this); + +        if (volinfo->replica_count == 1) { +                snprintf (errstr, sizeof (errstr), +                          "Cannot set %s for a non-replicate volume.", key); +                gf_msg (this->name, GF_LOG_ERROR, 0, +                        GD_MSG_VOL_NOT_REPLICA, "%s", errstr); +                *op_errstr = gf_strdup (errstr); +                ret = -1; +                goto out; +        } + +out: +        gf_msg_debug (this->name, 0, "Returning %d", ret); + +        return ret; +} + +static int  validate_subvols_per_directory (glusterd_volinfo_t *volinfo, dict_t *dict,                                  char *key, char *value, char **op_errstr)  { @@ -536,20 +563,23 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .op_version = 1,            .flags      = OPT_FLAG_CLIENT_OPT          }, -        { .key        = "cluster.metadata-self-heal", -          .voltype    = "cluster/replicate", -          .op_version = 1, -          .flags      = OPT_FLAG_CLIENT_OPT +        { .key         = "cluster.metadata-self-heal", +          .voltype     = "cluster/replicate", +          .op_version  = 1, +          .validate_fn = validate_replica, +          .flags       = OPT_FLAG_CLIENT_OPT          }, -        { .key        = "cluster.data-self-heal", -          .voltype    = "cluster/replicate", -          .op_version = 1, -          .flags      = OPT_FLAG_CLIENT_OPT +        { .key         = "cluster.data-self-heal", +          .voltype     = "cluster/replicate", +          .op_version  = 1, +          .validate_fn = validate_replica, +          .flags       = OPT_FLAG_CLIENT_OPT          }, -        { .key        = "cluster.entry-self-heal", -          .voltype    = "cluster/replicate", -          .op_version = 1, -          .flags      = OPT_FLAG_CLIENT_OPT +        { .key         = "cluster.entry-self-heal", +          .voltype     = "cluster/replicate", +          .op_version  = 1, +          .validate_fn = validate_replica, +          .flags       = OPT_FLAG_CLIENT_OPT          },          { .key           = "cluster.self-heal-daemon",            .voltype       = "cluster/replicate",  | 
