From 05d3d95afa62ef3271f0fe3c7272e1e19638c448 Mon Sep 17 00:00:00 2001 From: Atin Mukherjee Date: Thu, 21 Jan 2016 14:48:34 +0530 Subject: glusterd: volume get should pick options from priv->opts too As of now volume get was not looking for all the global options maintained in option dictionary in glusterd_conf_t. This patch includes the same. Change-Id: Ib05259a2dcacc4a712cae4217fe4a6553b61da56 BUG: 1300596 Signed-off-by: Atin Mukherjee Reviewed-on: http://review.gluster.org/13272 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System Reviewed-by: Gaurav Kumar Garg CentOS-regression: Gluster Build System Reviewed-by: Jeff Darcy --- tests/bugs/cli/bug-983317-volume-get.t | 34 +++++++++++++++++++++++++ tests/bugs/cli/bug-983317.t | 25 ------------------ tests/volume.rc | 7 +++++ xlators/mgmt/glusterd/src/glusterd-handler.c | 38 +++++++++++++++++++++++----- xlators/mgmt/glusterd/src/glusterd-utils.c | 32 ++++++++++++++--------- 5 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 tests/bugs/cli/bug-983317-volume-get.t delete mode 100644 tests/bugs/cli/bug-983317.t diff --git a/tests/bugs/cli/bug-983317-volume-get.t b/tests/bugs/cli/bug-983317-volume-get.t new file mode 100644 index 00000000000..8f09d588565 --- /dev/null +++ b/tests/bugs/cli/bug-983317-volume-get.t @@ -0,0 +1,34 @@ +#!/bin/bash + +. $(dirname $0)/../../include.rc +. $(dirname $0)/../../volume.rc + +cleanup; +TEST glusterd +TEST pidof glusterd + +TEST $CLI volume create $V0 $H0:$B0/$V0 + +# Set a volume option +TEST $CLI volume set $V0 open-behind on +TEST $CLI volume start $V0 + +TEST $CLI volume set all server-quorum-ratio 80 + +TEST $CLI volume set $V0 user.metadata 'dummy' + +# Execute volume get without having an explicit option, this should fail +TEST ! $CLI volume get $V0 + +# Execute volume get with an explicit option +TEST $CLI volume get $V0 open-behind +EXPECT 'on' volume_get_field $V0 'open-behind' + +# Execute volume get with 'all" +TEST $CLI volume get $V0 all + +# Check if volume get can display correct global options values as well +EXPECT '80' volume_get_field $V0 'server-quorum-ratio' + +# Check user.* options can also be retrived using volume get +EXPECT 'dummy' volume_get_field $V0 'user.metadata' diff --git a/tests/bugs/cli/bug-983317.t b/tests/bugs/cli/bug-983317.t deleted file mode 100644 index 11590ac280f..00000000000 --- a/tests/bugs/cli/bug-983317.t +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -. $(dirname $0)/../../include.rc -. $(dirname $0)/../../volume.rc - -cleanup; -TEST glusterd -TEST pidof glusterd - -TEST $CLI volume create $V0 $H0:$B0/$V0 - -# Set a volume option -TEST $CLI volume set $V0 open-behind on -TEST $CLI volume start $V0 - -# Execute volume get without having an explicit option, this should fail -TEST ! $CLI volume get $V0 - -# Execute volume get with an explicit option -TEST $CLI volume get $V0 open-behind - -# Execute volume get with 'all" -TEST $CLI volume get $V0 all - -cleanup; diff --git a/tests/volume.rc b/tests/volume.rc index 3cfe7b3309b..69f701a93ec 100644 --- a/tests/volume.rc +++ b/tests/volume.rc @@ -6,6 +6,13 @@ function volinfo_field() $CLI volume info $vol | grep "^$field: " | sed 's/.*: //'; } +function volume_get_field() +{ + local vol=$1 + local field=$2 + $CLI volume get $vol $field | tail -1 | awk '{print $2}' +} + function brick_count() { diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index c5d486d00dd..9007843be4a 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -4778,17 +4778,43 @@ glusterd_get_volume_opts (rpcsvc_request_t *req, dict_t *dict) goto out; } } else { - ret = glusterd_get_default_val_for_volopt + sprintf (dict_key, "key%d", count); + ret = dict_set_str(dict, dict_key, key); + if (ret) { + gf_msg (this->name, GF_LOG_ERROR, 0, + GD_MSG_DICT_SET_FAILED, "Failed" + " to set %s in dictionary", + key); + goto out; + } + sprintf (dict_key, "value%d", count); + ret = dict_get_str (priv->opts, key, &value); + if (!ret) { + ret = dict_set_str(dict, dict_key, + value); + if (ret) { + gf_msg (this->name, + GF_LOG_ERROR, 0, + GD_MSG_DICT_SET_FAILED, + "Failed to set %s in " + " dictionary", key); + goto out; + } + } else { + ret = glusterd_get_default_val_for_volopt (dict, _gf_false, key, orig_key, volinfo->dict, &rsp.op_errstr); - if (ret && !rsp.op_errstr) { - snprintf (err_str, sizeof(err_str), - "Failed to fetch the value of" - " %s, check log file for more" - " details", key); + if (ret && !rsp.op_errstr) { + snprintf (err_str, + sizeof(err_str), + "Failed to fetch the " + "value of %s, check " + "log file for more" + " details", key); + } } } } diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index f5206cd3e63..27425042a01 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -10657,10 +10657,14 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts, char *def_val = NULL; char dict_key[50] = {0,}; gf_boolean_t key_found = _gf_false; + glusterd_conf_t *priv = NULL; this = THIS; GF_ASSERT (this); + priv = this->private; + GF_VALIDATE_OR_GOTO (this->name, priv, out); + GF_VALIDATE_OR_GOTO (this->name, vol_dict, out); /* Check whether key is passed for a single option */ @@ -10675,19 +10679,23 @@ glusterd_get_default_val_for_volopt (dict_t *ctx, gf_boolean_t all_opts, if (!all_opts && strcmp (vme->key, input_key)) continue; key_found = _gf_true; - /* First look for the key in the vol_dict, if its not - * present then look for translator default value */ - ret = dict_get_str (vol_dict, vme->key, &def_val); + /* First look for the key in the priv->opts for global option + * and then into vol_dict, if its not present then look for + * translator default value */ + ret = dict_get_str (priv->opts, vme->key, &def_val); if (!def_val) { - if (vme->value) { - def_val = vme->value; - } else { - ret = glusterd_get_value_for_vme_entry - (vme, &def_val); - if (!all_opts && ret) - goto out; - else if (ret == -2) - continue; + ret = dict_get_str (vol_dict, vme->key, &def_val); + if (!def_val) { + if (vme->value) { + def_val = vme->value; + } else { + ret = glusterd_get_value_for_vme_entry + (vme, &def_val); + if (!all_opts && ret) + goto out; + else if (ret == -2) + continue; + } } } count++; -- cgit