diff options
author | Ravishankar N <root@ravi2.(none)> | 2015-12-02 08:20:46 +0000 |
---|---|---|
committer | Atin Mukherjee <amukherj@redhat.com> | 2015-12-09 22:44:04 -0800 |
commit | e8d15e3be48dc53256fcc71277f8d81bbaa23d21 (patch) | |
tree | c5947097354ff45ba839bc5dc63408a00c516349 | |
parent | a97ea63aaf4ee79bd6bb9759840fdaa43f37534c (diff) |
glusterd: add pending_node only if hxlator_count is valid
Backport of http://review.gluster.org/#/c/12843/
Fixes a regression introduced by commit
0ef62933649392051e73fe01c028e41baddec489 . See BZ for bug
description.
Problem:
To perform GLUSTERD_BRICK_XLATOR_OP, the rpc requires number of xlators (n) the
op needs to be performed on and the xlator names are populated in dictionary
with xl-0, xl-1... xl-n-1 as keys. When Volume heal full is executed, for each
replica group, glustershd on the local node may or may not be selected to
perform heal by glusterd. XLATOR_OP rpc should be sent to the shd running on
the same node by glusterd only when glustershd on that node is selected at
least once. This bug occurs when glusterd sends the rpc to local glustershd
even when it is not selected for any of the replica groups.
Fix:
Don't send the rpc to local glustershd when it is not selected even once.
Change-Id: I2c8217a8f00f6ad5d0c6a67fa56e476457803e08
BUG: 1284863
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/12905
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-op-sm.c | 24 |
1 files changed, 11 insertions, 13 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index 7bd3e0051fd..801384e8e3d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -6498,18 +6498,6 @@ glusterd_bricks_select_heal_volume (dict_t *dict, char **op_errstr, goto out; } - pending_node = GF_CALLOC (1, sizeof (*pending_node), - gf_gld_mt_pending_node_t); - if (!pending_node) { - ret = -1; - goto out; - } else { - pending_node->node = &(priv->shd_svc); - pending_node->type = GD_NODE_SHD; - cds_list_add_tail (&pending_node->list, selected); - pending_node = NULL; - } - if (!hxlator_count) goto out; if (hxlator_count == -1) { @@ -6523,7 +6511,17 @@ glusterd_bricks_select_heal_volume (dict_t *dict, char **op_errstr, ret = dict_set_int32 (dict, "count", hxlator_count); if (ret) goto out; - + pending_node = GF_CALLOC (1, sizeof (*pending_node), + gf_gld_mt_pending_node_t); + if (!pending_node) { + ret = -1; + goto out; + } else { + pending_node->node = &(priv->shd_svc); + pending_node->type = GD_NODE_SHD; + cds_list_add_tail (&pending_node->list, selected); + pending_node = NULL; + } out: gf_msg_debug (THIS->name, 0, "Returning ret %d", ret); |