diff options
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-common.c | 2 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 17 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-metadata.c | 17 |
3 files changed, 26 insertions, 10 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index 04530ccb0a0..518907ac78a 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -446,6 +446,8 @@ afr_sh_mark_sources (int32_t *pending_matrix[], int sources[], int child_count) if (afr_sh_wise_nodes_conflict (characters, child_count)) { /* split-brain */ + + nsources = -1; goto out; } else { diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c index 775845fe6be..bc13a43aba9 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -778,8 +778,8 @@ afr_sh_data_fix (call_frame_t *frame, xlator_t *this) afr_sh_print_pending_matrix (sh->pending_matrix, this); - afr_sh_mark_sources (sh->pending_matrix, sh->sources, - priv->child_count); + nsources = afr_sh_mark_sources (sh->pending_matrix, sh->sources, + priv->child_count); afr_sh_supress_empty_children (sh->sources, sh->xattr, sh->buf, priv->child_count, AFR_DATA_PENDING); @@ -787,9 +787,16 @@ afr_sh_data_fix (call_frame_t *frame, xlator_t *this) afr_sh_supress_errenous_children (sh->sources, sh->child_errno, priv->child_count); - nsources = afr_sh_source_count (sh->sources, priv->child_count); + if (nsources == 0) { + gf_log (this->name, GF_LOG_DEBUG, + "No self-heal needed for %s", + local->loc.path); - if ((nsources == 0) + afr_sh_data_finish (frame, this); + return 0; + } + + if ((nsources == -1) && (priv->favorite_child != -1) && (sh->child_errno[priv->favorite_child] == 0)) { @@ -804,7 +811,7 @@ afr_sh_data_fix (call_frame_t *frame, xlator_t *this) priv->child_count); } - if (nsources == 0) { + if (nsources == -1) { gf_log (this->name, GF_LOG_ERROR, "Unable to resolve conflicting data of %s. " "Please resolve manually by deleting the file %s " diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c index de8fa1a3914..4e58c54404d 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -519,15 +519,22 @@ afr_sh_metadata_fix (call_frame_t *frame, xlator_t *this) afr_sh_print_pending_matrix (sh->pending_matrix, this); - afr_sh_mark_sources (sh->pending_matrix, sh->sources, - priv->child_count); + nsources = afr_sh_mark_sources (sh->pending_matrix, sh->sources, + priv->child_count); afr_sh_supress_errenous_children (sh->sources, sh->child_errno, priv->child_count); - nsources = afr_sh_source_count (sh->sources, priv->child_count); + if (nsources == 0) { + gf_log (this->name, GF_LOG_DEBUG, + "No self-heal needed for %s", + local->loc.path); - if ((nsources == 0) + afr_sh_metadata_finish (frame, this); + return 0; + } + + if ((nsources == -1) && (priv->favorite_child != -1) && (sh->child_errno[priv->favorite_child] == 0)) { @@ -542,7 +549,7 @@ afr_sh_metadata_fix (call_frame_t *frame, xlator_t *this) priv->child_count); } - if (nsources == 0) { + if (nsources == -1) { gf_log (this->name, GF_LOG_ERROR, "Unable to resolve conflicting metadata of %s. " "Please resolve manually by fixing the " |