summaryrefslogtreecommitdiffstats
path: root/xlators/cluster
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/cluster')
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-entry.c20
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 ab210b37bef..e64b6e45069 100644
--- a/xlators/cluster/afr/src/afr-self-heal-entry.c
+++ b/xlators/cluster/afr/src/afr-self-heal-entry.c
@@ -508,6 +508,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];
@@ -537,6 +538,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;
}
@@ -547,6 +553,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;
}
@@ -557,6 +566,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;
@@ -568,14 +578,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)