diff options
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 28 |
1 files changed, 11 insertions, 17 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index de92affc6d3..99ecd734c69 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -3886,7 +3886,6 @@ afr_notify (xlator_t *this, int32_t event, int idx = -1; int ret = -1; int call_psh = 0; - int up_child = -1; dict_t *input = NULL; dict_t *output = NULL; gf_boolean_t had_quorum = _gf_false; @@ -3947,7 +3946,6 @@ afr_notify (xlator_t *this, int32_t event, priv->child_up[idx] = 1; call_psh = 1; - up_child = idx; for (i = 0; i < priv->child_count; i++) if (priv->child_up[i] == 1) up_children++; @@ -4083,22 +4081,18 @@ afr_notify (xlator_t *this, int32_t event, if (propagate) ret = default_notify (this, event, data); - if (!had_heard_from_all && have_heard_from_all && priv->shd.iamshd) { - /* - * Since self-heal is supposed to be launched only after - * the responses from all the bricks are collected, - * launch self-heals now on all up subvols. - */ - for (i = 0; i < priv->child_count; i++) - if (priv->child_up[i]) - afr_selfheal_childup (this, i); - } else if (have_heard_from_all && call_psh && priv->shd.iamshd) { - /* - * Already heard from everyone. Just launch heal on now up - * subvolume. + if ((!had_heard_from_all) || call_psh) { + /* Launch self-heal on all local subvolumes if: + * a) We have_heard_from_all for the first time + * b) Already heard from everyone, but we now got a child-up + * event. */ - afr_selfheal_childup (this, up_child); - } + if (have_heard_from_all && priv->shd.iamshd) { + for (i = 0; i < priv->child_count; i++) + if (priv->child_up[i]) + afr_selfheal_childup (this, i); + } + } out: return ret; } |