diff options
| -rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-metadata.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c index d5d95ef8852..44374d5c0ad 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -216,6 +216,23 @@ __afr_selfheal_metadata_finalize_source (call_frame_t *frame, xlator_t *this, sources_count = AFR_COUNT (sources, priv->child_count); + if (sources_count == 0) { + afr_sh_get_source_by_policy (this, sources, healed_sinks, + locked_on, replies, inode); + sources_count = AFR_COUNT (sources, priv->child_count); + /* __afr_selfheal_metadata_prepare tinkers with the state + * of healed_sinks pre-maturely (the source hasn't + * actually been finalized yet!), so reset the children + * which aren't our source to sinks so we can heal. + * I'll leave it to the AFR2 maintainer to fix that code + * in the future as they may have had a good reason. + */ + for (i = 0; i < priv->child_count; i++) { + if (!sources[i] && locked_on[i]) + healed_sinks[i] = 1; + } + } + if ((AFR_CMP (locked_on, healed_sinks, priv->child_count) == 0) || !sources_count) { |
