From 2c15621d26fda5ba21e375d803baa5d8e09e6260 Mon Sep 17 00:00:00 2001 From: Pranith Kumar K Date: Tue, 3 Sep 2013 13:30:13 +0530 Subject: cluster/afr: Set size based source only when sizes are unequal Change-Id: I18583f14edf1011401be15744371e2a6b79d75cc BUG: 1003842 Signed-off-by: Pranith Kumar K Reviewed-on: http://review.gluster.org/5763 Tested-by: Gluster Build System Reviewed-by: Anand Avati --- xlators/cluster/afr/src/afr-self-heal-common.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/xlators/cluster/afr/src/afr-self-heal-common.c b/xlators/cluster/afr/src/afr-self-heal-common.c index f82ce237..ef92b420 100644 --- a/xlators/cluster/afr/src/afr-self-heal-common.c +++ b/xlators/cluster/afr/src/afr-self-heal-common.c @@ -574,6 +574,8 @@ afr_find_largest_file_size (struct iatt *bufs, int32_t *success_children, int i = -1; int child = -1; uint64_t max_size = 0; + uint64_t min_size = 0; + int num_children = 0; for (i = 0; i < child_count; i++) { if (success_children[i] == -1) @@ -584,8 +586,19 @@ afr_find_largest_file_size (struct iatt *bufs, int32_t *success_children, max_size = bufs[child].ia_size; idx = child; } + + if ((num_children == 0) || (bufs[child].ia_size < min_size)) { + min_size = bufs[child].ia_size; + } + + num_children++; } + /* If sizes are same for all of them, finding sources will have to + * happen with pending changelog. So return -1 + */ + if ((num_children > 1) && (min_size == max_size)) + return -1; return idx; } -- cgit