summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--xlators/cluster/afr/src/afr-common.c4
-rw-r--r--xlators/cluster/afr/src/afr-self-heal-data.c8
2 files changed, 10 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c
index 6733cb314c4..83f6e530ec0 100644
--- a/xlators/cluster/afr/src/afr-common.c
+++ b/xlators/cluster/afr/src/afr-common.c
@@ -679,7 +679,7 @@ afr_lookup_set_read_child (xlator_t *this, afr_local_t *local)
if (!sh->sources)
goto out;
- read_child = priv->read_child;
+ read_child = local->read_child_index;
if (afr_is_valid_read_child (sh->sources, priv->child_count,
read_child))
goto out;
@@ -912,6 +912,8 @@ afr_fresh_lookup_cbk (call_frame_t *frame, void *cookie,
afr_set_read_child (this,
local->cont.lookup.inode,
child_index);
+ //prefer fast child
+ local->read_child_index = child_index;
}
} else {
diff --git a/xlators/cluster/afr/src/afr-self-heal-data.c b/xlators/cluster/afr/src/afr-self-heal-data.c
index d4516c4ce1e..f58a03d8485 100644
--- a/xlators/cluster/afr/src/afr-self-heal-data.c
+++ b/xlators/cluster/afr/src/afr-self-heal-data.c
@@ -705,6 +705,8 @@ afr_self_heal_find_sources (xlator_t *this, afr_local_t *local, dict_t **xattr,
afr_private_t *priv = NULL;
int i = 0;
+ int nsources = 0;
+
afr_self_heal_type sh_type = AFR_SELF_HEAL_DATA;
sh = &local->self_heal;
@@ -738,7 +740,11 @@ afr_self_heal_find_sources (xlator_t *this, afr_local_t *local, dict_t **xattr,
sh_type = AFR_SELF_HEAL_METADATA;
break;
}
- (void)afr_sh_mark_sources (sh, priv->child_count, sh_type);
+ nsources = afr_sh_mark_sources (sh, priv->child_count, sh_type);
+ if (nsources == 0) {
+ for (i = 0; i < priv->child_count; i++)
+ sh->sources[i] = 1;
+ }
}