From bf4003ca869d951ff173d908885be89ef63ba28e Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Thu, 8 Sep 2016 09:34:46 +0530 Subject: [PATCH 74/86] cluster/dht: Skip layout overlap maximization on weighted rebalance During a fix-layout, dht_selfheal_layout_maximize_overlap () does not consider chunk sizes while calculating layout overlaps, causing smaller bricks to sometimes get larger ranges than larger bricks. Temporarily enabling this operation if only if weighted rebalance is disabled or all bricks are the same size. > Change-Id: I5ed16cdff2551b826a1759ca8338921640bfc7b3 > BUG: 1366494 > Signed-off-by: N Balachandran > Reviewed-on: http://review.gluster.org/15403 > Smoke: Gluster Build System > CentOS-regression: Gluster Build System > Reviewed-by: Raghavendra G > NetBSD-regression: NetBSD Build System >Reviewed-on: http://review.gluster.org/15422 >NetBSD-regression: NetBSD Build System >CentOS-regression: Gluster Build System >Smoke: Gluster Build System >Reviewed-by: Niels de Vos Change-Id: Icf0dd83f36912e721982bcf818a06c4b339dc974 BUG: 1257182 Signed-off-by: N Balachandran Reviewed-on: https://code.engineering.redhat.com/gerrit/84881 Reviewed-by: Atin Mukherjee Tested-by: Atin Mukherjee --- tests/bugs/distribute/bug-853258.t | 1 + xlators/cluster/dht/src/dht-selfheal.c | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/tests/bugs/distribute/bug-853258.t b/tests/bugs/distribute/bug-853258.t index 2f0e1b8..e39f507 100755 --- a/tests/bugs/distribute/bug-853258.t +++ b/tests/bugs/distribute/bug-853258.t @@ -17,6 +17,7 @@ mkdir -p $H0:$B0/${V0}3 TEST $CLI volume create $V0 $H0:$B0/${V0}0 $H0:$B0/${V0}1 $H0:$B0/${V0}2 TEST $CLI volume start $V0 EXPECT_WITHIN $PROCESS_UP_TIMEOUT 'Started' volinfo_field $V0 'Status'; +TEST $CLI volume set $V0 cluster.weighted-rebalance off # Force assignment of initial ranges. TEST $CLI volume rebalance $V0 fix-layout start diff --git a/xlators/cluster/dht/src/dht-selfheal.c b/xlators/cluster/dht/src/dht-selfheal.c index f43a235..fd90e54 100644 --- a/xlators/cluster/dht/src/dht-selfheal.c +++ b/xlators/cluster/dht/src/dht-selfheal.c @@ -1706,6 +1706,7 @@ dht_fix_layout_of_directory (call_frame_t *frame, loc_t *loc, dht_local_t *local = NULL; uint32_t subvol_down = 0; int ret = 0; + gf_boolean_t maximize_overlap = _gf_true; this = frame->this; priv = this->private; @@ -1752,9 +1753,18 @@ dht_fix_layout_of_directory (call_frame_t *frame, loc_t *loc, "subvolume %d (%s): %u chunks", i, priv->subvolumes[i]->name, priv->du_stats[i].chunks); + + /* Maximize overlap if the bricks are all the same + * size. + * This is probably not going to be very common on + * live setups but will benefit our regression tests + */ + if (i && (priv->du_stats[i].chunks + != priv->du_stats[0].chunks)) { + maximize_overlap = _gf_false; + } } - } - else { + } else { gf_msg (this->name, GF_LOG_WARNING, 0, DHT_MSG_NO_DISK_USAGE_STATUS, "no du stats ?!?"); } @@ -1764,9 +1774,16 @@ dht_fix_layout_of_directory (call_frame_t *frame, loc_t *loc, dht_layout_sort_volname (new_layout); dht_selfheal_layout_new_directory (frame, loc, new_layout); - /* Now selectively re-assign ranges only when it helps */ - dht_selfheal_layout_maximize_overlap (frame, loc, new_layout, layout); + /* Maximize overlap if weighted-rebalance is disabled */ + if (!priv->do_weighting) + maximize_overlap = _gf_true; + + /* Now selectively re-assign ranges only when it helps */ + if (maximize_overlap) { + dht_selfheal_layout_maximize_overlap (frame, loc, new_layout, + layout); + } done: if (new_layout) { /* Now that the new layout has all the proper layout, change the -- 1.7.1