diff options
| -rwxr-xr-x | tests/bugs/distribute/bug-853258.t | 1 | ||||
| -rw-r--r-- | 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 2f0e1b8b9b7..e39f507baf9 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 520a3f3e88c..85fd93f9348 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  | 
