diff options
author | Pranith K <pranithk@gluster.com> | 2011-07-07 05:04:29 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@gluster.com> | 2011-07-07 05:45:25 -0700 |
commit | e730d7fd8d1fff6d8350173d178761edc460f02d (patch) | |
tree | f84623c07bd9baf5d4df90bcd1b80623febda15f /xlators/cluster/afr/src | |
parent | d53b07fef8be65763b5b03ecd99ac36c86f3a277 (diff) |
cluster/afr: previous read_child should take precedence over priv->read_child
Lookup uses the sources array to decide if a child is read_child or not.
So if afr_mark_sources returns 0 i.e. all children are sources,
explicitly mark them as sources.
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@gluster.com>
BUG: 3138 ([release-3.2]: ls shows 2 entries)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3138
Diffstat (limited to 'xlators/cluster/afr/src')
-rw-r--r-- | xlators/cluster/afr/src/afr-common.c | 4 | ||||
-rw-r--r-- | xlators/cluster/afr/src/afr-self-heal-data.c | 7 |
2 files changed, 9 insertions, 2 deletions
diff --git a/xlators/cluster/afr/src/afr-common.c b/xlators/cluster/afr/src/afr-common.c index aa88d609837..30986b589c8 100644 --- a/xlators/cluster/afr/src/afr-common.c +++ b/xlators/cluster/afr/src/afr-common.c @@ -700,7 +700,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; @@ -931,6 +931,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 7da6d828e2d..f6def0afab9 100644 --- a/xlators/cluster/afr/src/afr-self-heal-data.c +++ b/xlators/cluster/afr/src/afr-self-heal-data.c @@ -701,6 +701,7 @@ afr_self_heal_find_sources (xlator_t *this, afr_local_t *local, dict_t **xattr, afr_private_t *priv = NULL; int i = 0; afr_self_heal_type sh_type = AFR_SELF_HEAL_DATA; + int nsources = 0; sh = &local->self_heal; priv = this->private; @@ -733,7 +734,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; + } } |