diff options
author | Ravishankar N <ravishankar@redhat.com> | 2015-01-09 08:17:19 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2015-06-22 01:42:10 -0700 |
commit | 41805d75e47f2ce9f71d99e556885db008948fb2 (patch) | |
tree | ef34f292f342397f001f7abf77cfcc9079ac8dc0 /xlators/cluster/afr/src/afr-self-heal-entry.c | |
parent | 79e4c7b2fad6db15863efb4e979525b1bd4862ea (diff) |
afr: complete conservative merge even in case of gfid split-brain.
Problem:
While performing conservative merge, we bail out of the merge if we encounter a
file with mismatching gfid or type. What this means is all entries that come
after the mismatching file (during the merge) never get healed, no matter how
many index heals are done.
Fix:
Continue with the merging of rest of the entries even if a gfid/type mismatch is
found, but ensure that post-op does not happen on the parent dir in such a case.
Change-Id: I9bbfccc8906007daa53a0750ddd401dcf83943f8
BUG: 1180545
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/9429
Reviewed-by: Anuradha Talur <atalur@redhat.com>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Diffstat (limited to 'xlators/cluster/afr/src/afr-self-heal-entry.c')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-entry.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index b78bfa99f20..28e332db740 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -503,6 +503,7 @@ afr_selfheal_entry_do_subvol (call_frame_t *frame, xlator_t *this, call_frame_t *iter_frame = NULL; xlator_t *subvol = NULL; afr_private_t *priv = NULL; + gf_boolean_t mismatch = _gf_false; priv = this->private; subvol = priv->children[child]; @@ -532,6 +533,11 @@ afr_selfheal_entry_do_subvol (call_frame_t *frame, xlator_t *this, entry->d_name); AFR_STACK_RESET (iter_frame); + if (ret == -1) { + /* gfid or type mismatch. */ + mismatch = _gf_true; + ret = 0; + } if (ret) break; } @@ -542,6 +548,9 @@ afr_selfheal_entry_do_subvol (call_frame_t *frame, xlator_t *this, } AFR_STACK_DESTROY (iter_frame); + if (mismatch == _gf_true) + /* undo pending will be skipped */ + ret = -1; return ret; } @@ -552,6 +561,7 @@ afr_selfheal_entry_do (call_frame_t *frame, xlator_t *this, fd_t *fd, { int i = 0; afr_private_t *priv = NULL; + gf_boolean_t mismatch = _gf_false; int ret = 0; priv = this->private; @@ -563,14 +573,20 @@ afr_selfheal_entry_do (call_frame_t *frame, xlator_t *this, fd_t *fd, if (i != source && !healed_sinks[i]) continue; ret = afr_selfheal_entry_do_subvol (frame, this, fd, i); + if (ret == -1) { + /* gfid or type mismatch. */ + mismatch = _gf_true; + continue; + } if (ret) break; } + if (mismatch == _gf_true) + /* undo pending will be skipped */ + ret = -1; return ret; } - - static int __afr_selfheal_entry (call_frame_t *frame, xlator_t *this, fd_t *fd, unsigned char *locked_on) |