diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index 2b502fe794ca..e9acd0481919 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -900,6 +900,10 @@ static class MoveCostFunction extends CostFunction { this.conf = conf; // What percent of the number of regions a single run of the balancer can move. maxMovesPercent = conf.getFloat(MAX_MOVES_PERCENT_KEY, DEFAULT_MAX_MOVE_PERCENT); + + // Initialize the multiplier so that addCostFunction will add this cost function. + // It may change during later evaluations, due to OffPeakHours. + this.setMultiplier(conf.getFloat(MOVE_COST_KEY, DEFAULT_MOVE_COST)); } @Override diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java index b1e81c482002..eead4695c012 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java @@ -54,6 +54,7 @@ import org.apache.hadoop.hbase.testclassification.MediumTests; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.EnvironmentEdgeManager; +import org.apache.hbase.thirdparty.org.apache.commons.collections4.CollectionUtils; import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -506,13 +507,40 @@ public void testLosingRs() throws Exception { @Test public void testAdditionalCostFunction() { - conf.set(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY, - DummyCostFunction.class.getName()); + try { + conf.set(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY, + DummyCostFunction.class.getName()); - loadBalancer.setConf(conf); - assertTrue(Arrays. - asList(loadBalancer.getCostFunctionNames()). - contains(DummyCostFunction.class.getSimpleName())); + loadBalancer.setConf(conf); + assertTrue(Arrays. + asList(loadBalancer.getCostFunctionNames()). + contains(DummyCostFunction.class.getSimpleName())); + } finally { + conf.unset(StochasticLoadBalancer.COST_FUNCTIONS_COST_FUNCTIONS_KEY); + loadBalancer.setConf(conf); + } + } + + @Test + public void testDefaultCostFunctionList() { + List expected = Arrays.asList( + StochasticLoadBalancer.RegionCountSkewCostFunction.class.getSimpleName(), + StochasticLoadBalancer.PrimaryRegionCountSkewCostFunction.class.getSimpleName(), + StochasticLoadBalancer.MoveCostFunction.class.getSimpleName(), + StochasticLoadBalancer.RackLocalityCostFunction.class.getSimpleName(), + StochasticLoadBalancer.TableSkewCostFunction.class.getSimpleName(), + StochasticLoadBalancer.RegionReplicaHostCostFunction.class.getSimpleName(), + StochasticLoadBalancer.RegionReplicaRackCostFunction.class.getSimpleName(), + StochasticLoadBalancer.ReadRequestCostFunction.class.getSimpleName(), + StochasticLoadBalancer.CPRequestCostFunction.class.getSimpleName(), + StochasticLoadBalancer.WriteRequestCostFunction.class.getSimpleName(), + StochasticLoadBalancer.MemStoreSizeCostFunction.class.getSimpleName(), + StochasticLoadBalancer.StoreFileCostFunction.class.getSimpleName() + ); + + List actual = Arrays.asList(loadBalancer.getCostFunctionNames()); + assertTrue("ExpectedCostFunctions: " + expected + " ActualCostFunctions: " + actual, + CollectionUtils.isEqualCollection(expected, actual)); } private boolean needsBalanceIdleRegion(int[] cluster){