diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java index 5cc98478f9b9..91e1ec61552c 100644 --- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java +++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java @@ -25,7 +25,9 @@ @InterfaceAudience.Private abstract class CostFunction { - public static final double COST_EPSILON = 0.0001; + public static double getCostEpsilon(double cost) { + return Math.ulp(cost); + } private float multiplier = 0; @@ -101,13 +103,14 @@ public void updateWeight(double[] weights) { * @return The scaled value. */ protected static double scale(double min, double max, double value) { + double costEpsilon = getCostEpsilon(max); if ( - max <= min || value <= min || Math.abs(max - min) <= COST_EPSILON - || Math.abs(value - min) <= COST_EPSILON + max <= min || value <= min || Math.abs(max - min) <= costEpsilon + || Math.abs(value - min) <= costEpsilon ) { return 0; } - if (max <= min || Math.abs(max - min) <= COST_EPSILON) { + if (max <= min || Math.abs(max - min) <= costEpsilon) { return 0; } diff --git a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java index e5cd5446c5c8..8405130c1c4c 100644 --- a/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java +++ b/hbase-balancer/src/main/java/org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java @@ -333,7 +333,8 @@ void updateMetricsSize(int size) { private boolean areSomeRegionReplicasColocated(BalancerClusterState c) { regionReplicaHostCostFunction.prepare(c); - return (Math.abs(regionReplicaHostCostFunction.cost()) > CostFunction.COST_EPSILON); + double cost = Math.abs(regionReplicaHostCostFunction.cost()); + return cost > CostFunction.getCostEpsilon(cost); } private String getBalanceReason(double total, double sumMultiplier) { diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java index 4a996e7796f5..54729f88b70e 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java @@ -285,6 +285,9 @@ protected List convertToList(final Map balancedCluster) { + if (balancedCluster == null) { + return "null"; + } NavigableSet sorted = new TreeSet<>(balancedCluster); ServerAndLoad[] arr = sorted.toArray(new ServerAndLoad[sorted.size()]); StringBuilder sb = new StringBuilder(sorted.size() * 4 + 4); diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java index e45ac5a69321..9578f212efb1 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/StochasticBalancerTestBase.java @@ -17,9 +17,10 @@ */ package org.apache.hadoop.hbase.master.balancer; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import java.time.Duration; import java.util.List; import java.util.Map; import org.apache.hadoop.hbase.HBaseConfiguration; @@ -36,6 +37,7 @@ public class StochasticBalancerTestBase extends BalancerTestBase { private static final Logger LOG = LoggerFactory.getLogger(StochasticBalancerTestBase.class); + private static final Duration MAX_MAX_RUN_TIME = Duration.ofSeconds(60); protected static StochasticLoadBalancer loadBalancer; @@ -48,17 +50,15 @@ public static void beforeAllTests() throws Exception { conf.setClass("hbase.util.ip.to.rack.determiner", MockMapping.class, DNSToSwitchMapping.class); conf.setFloat("hbase.master.balancer.stochastic.localityCost", 0); conf.setBoolean("hbase.master.balancer.stochastic.runMaxSteps", true); + conf.setLong(StochasticLoadBalancer.MAX_RUNNING_TIME_KEY, 250); loadBalancer = new StochasticLoadBalancer(dummyMetricsStochasticBalancer); loadBalancer.setClusterInfoProvider(new DummyClusterInfoProvider(conf)); loadBalancer.initialize(); } - protected void testWithCluster(int numNodes, int numRegions, int numRegionsPerServer, - int replication, int numTables, boolean assertFullyBalanced, - boolean assertFullyBalancedForReplicas) { - Map> serverMap = - createServerMap(numNodes, numRegions, numRegionsPerServer, replication, numTables); - testWithCluster(serverMap, null, assertFullyBalanced, assertFullyBalancedForReplicas); + protected void setMaxRunTime(Duration maxRunTime) { + conf.setLong(StochasticLoadBalancer.MAX_RUNNING_TIME_KEY, maxRunTime.toMillis()); + loadBalancer.loadConf(conf); } protected void testWithClusterWithIteration(int numNodes, int numRegions, int numRegionsPerServer, @@ -70,37 +70,14 @@ protected void testWithClusterWithIteration(int numNodes, int numRegions, int nu assertFullyBalancedForReplicas); } - protected void testWithCluster(Map> serverMap, - RackManager rackManager, boolean assertFullyBalanced, boolean assertFullyBalancedForReplicas) { - List list = convertToList(serverMap); - LOG.info("Mock Cluster : " + printMock(list) + " " + printStats(list)); - - loadBalancer.setRackManager(rackManager); - // Run the balancer. - Map>> LoadOfAllTable = - (Map) mockClusterServersWithTables(serverMap); - List plans = loadBalancer.balanceCluster(LoadOfAllTable); - assertNotNull("Initial cluster balance should produce plans.", plans); - - // Check to see that this actually got to a stable place. - if (assertFullyBalanced || assertFullyBalancedForReplicas) { - // Apply the plan to the mock cluster. - List balancedCluster = reconcile(list, plans, serverMap); - - // Print out the cluster loads to make debugging easier. - LOG.info("Mock after Balance : " + printMock(balancedCluster)); - - if (assertFullyBalanced) { - assertClusterAsBalanced(balancedCluster); - LoadOfAllTable = (Map) mockClusterServersWithTables(serverMap); - List secondPlans = loadBalancer.balanceCluster(LoadOfAllTable); - assertNull("Given a requirement to be fully balanced, second attempt at plans should " - + "produce none.", secondPlans); - } - - if (assertFullyBalancedForReplicas) { - assertRegionReplicaPlacement(serverMap, rackManager); - } + protected void increaseMaxRunTimeOrFail() { + Duration current = getCurrentMaxRunTime(); + assertTrue(current.toMillis() < MAX_MAX_RUN_TIME.toMillis()); + Duration newMax = Duration.ofMillis(current.toMillis() * 2); + if (newMax.toMillis() > MAX_MAX_RUN_TIME.toMillis()) { + setMaxRunTime(MAX_MAX_RUN_TIME); + } else { + setMaxRunTime(newMax); } } @@ -114,7 +91,13 @@ protected void testWithClusterWithIteration(Map> se Map>> LoadOfAllTable = (Map) mockClusterServersWithTables(serverMap); List plans = loadBalancer.balanceCluster(LoadOfAllTable); - assertNotNull("Initial cluster balance should produce plans.", plans); + if (plans == null) { + LOG.debug("First plans are null. Trying more balancer time, or will fail"); + increaseMaxRunTimeOrFail(); + testWithClusterWithIteration(serverMap, rackManager, assertFullyBalanced, + assertFullyBalancedForReplicas); + return; + } List balancedCluster = null; // Run through iteration until done. Otherwise will be killed as test time out @@ -140,4 +123,9 @@ protected void testWithClusterWithIteration(Map> se assertRegionReplicaPlacement(serverMap, rackManager); } } + + private Duration getCurrentMaxRunTime() { + return Duration.ofMillis(conf.getLong(StochasticLoadBalancer.MAX_RUNNING_TIME_KEY, + StochasticLoadBalancer.DEFAULT_MAX_RUNNING_TIME)); + } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java index 2a7b8afccc38..2b2c56aa99ae 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertNull; +import java.time.Duration; import java.util.List; import java.util.Map; import org.apache.hadoop.hbase.HBaseClassTestRule; @@ -51,6 +52,7 @@ public class TestStochasticLoadBalancerBalanceCluster extends StochasticBalancer */ @Test public void testBalanceCluster() throws Exception { + setMaxRunTime(Duration.ofMillis(1500)); loadBalancer.onConfigurationChange(conf); for (int[] mockCluster : clusterStateMocks) { Map> servers = mockClusterServers(mockCluster); diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java index 8691cff733f5..a565c14f0fda 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java @@ -19,7 +19,6 @@ import static org.apache.hadoop.hbase.master.balancer.HeterogeneousCostRulesTestHelper.DEFAULT_RULES_FILE_NAME; import static org.apache.hadoop.hbase.master.balancer.HeterogeneousCostRulesTestHelper.createRulesFile; -import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -40,7 +39,6 @@ import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.RegionReplicaUtil; -import org.apache.hadoop.hbase.master.RackManager; import org.apache.hadoop.hbase.master.RegionPlan; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; @@ -48,8 +46,6 @@ import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Category({ MasterTests.class, MediumTests.class }) public class TestStochasticLoadBalancerHeterogeneousCost extends StochasticBalancerTestBase { @@ -58,9 +54,6 @@ public class TestStochasticLoadBalancerHeterogeneousCost extends StochasticBalan public static final HBaseClassTestRule CLASS_RULE = HBaseClassTestRule.forClass(TestStochasticLoadBalancerHeterogeneousCost.class); - private static final Logger LOG = - LoggerFactory.getLogger(TestStochasticLoadBalancerHeterogeneousCost.class); - private static final double ALLOWED_WINDOW = 1.20; private static final HBaseCommonTestingUtil HTU = new HBaseCommonTestingUtil(); private static String RULES_FILE; @@ -164,66 +157,7 @@ private void testHeterogeneousWithCluster(final int numNodes, final int numRegio createRulesFile(RULES_FILE, rules); final Map> serverMap = this.createServerMap(numNodes, numRegions, numRegionsPerServer, 1, 1); - this.testWithCluster(serverMap, null, true, false); - } - - @Override - protected void testWithCluster(final Map> serverMap, - final RackManager rackManager, final boolean assertFullyBalanced, - final boolean assertFullyBalancedForReplicas) { - final List list = this.convertToList(serverMap); - LOG.info("Mock Cluster : " + this.printMock(list) + " " + this.printStats(list)); - - loadBalancer.setRackManager(rackManager); - - // Run the balancer. - final List plans = - loadBalancer.balanceTable(HConstants.ENSEMBLE_TABLE_NAME, serverMap); - assertNotNull(plans); - - // Check to see that this actually got to a stable place. - if (assertFullyBalanced || assertFullyBalancedForReplicas) { - // Apply the plan to the mock cluster. - final List balancedCluster = this.reconcile(list, plans, serverMap); - - // Print out the cluster loads to make debugging easier. - LOG.info("Mock Balanced cluster : " + this.printMock(balancedCluster)); - - if (assertFullyBalanced) { - final List secondPlans = - loadBalancer.balanceTable(HConstants.ENSEMBLE_TABLE_NAME, serverMap); - assertNull(secondPlans); - - // create external cost function to retrieve limit - // for each RS - final HeterogeneousRegionCountCostFunction cf = - new HeterogeneousRegionCountCostFunction(conf); - assertNotNull(cf); - BalancerClusterState cluster = new BalancerClusterState(serverMap, null, null, null); - cf.prepare(cluster); - - // checking that we all hosts have a number of regions below their limit - for (final ServerAndLoad serverAndLoad : balancedCluster) { - final ServerName sn = serverAndLoad.getServerName(); - final int numberRegions = serverAndLoad.getLoad(); - final int limit = cf.findLimitForRS(sn); - - double usage = (double) numberRegions / (double) limit; - LOG.debug( - sn.getHostname() + ":" + numberRegions + "/" + limit + "(" + (usage * 100) + "%)"); - - // as the balancer is stochastic, we cannot check exactly the result of the balancing, - // hence the allowedWindow parameter - assertTrue("Host " + sn.getHostname() + " should be below " - + cf.overallUsage * ALLOWED_WINDOW * 100 + "%; " + cf.overallUsage + ", " + usage + ", " - + numberRegions + ", " + limit, usage <= cf.overallUsage * ALLOWED_WINDOW); - } - } - - if (assertFullyBalancedForReplicas) { - this.assertRegionReplicaPlacement(serverMap, rackManager); - } - } + this.testWithClusterWithIteration(serverMap, null, true, false); } @Override @@ -306,6 +240,10 @@ static class StochasticLoadTestBalancer extends StochasticLoadBalancer { private FairRandomCandidateGenerator fairRandomCandidateGenerator = new FairRandomCandidateGenerator(); + StochasticLoadTestBalancer() { + super(new DummyMetricsStochasticBalancer()); + } + @Override protected CandidateGenerator getRandomGenerator() { return fairRandomCandidateGenerator; diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java index 620d610288f7..e6dfc912005d 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; @@ -38,7 +39,7 @@ public void testLargeCluster() { int numRegionsPerServer = 80; // all servers except one int numTables = 100; int replication = 1; - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 6 * 60 * 1000); + setMaxRunTime(Duration.ofSeconds(30)); loadBalancer.onConfigurationChange(conf); testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java index 80adea40fd77..e7b3dd3fd8a5 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.MasterTests; @@ -38,7 +39,8 @@ public void testMidCluster() { int numRegionsPerServer = 60; // all servers except one int replication = 1; int numTables = 40; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } @Test @@ -50,7 +52,8 @@ public void testMidCluster2() { int numTables = 400; // num large num regions means may not always get to best balance with one run boolean assertFullyBalanced = false; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, + setMaxRunTime(Duration.ofMillis(2500)); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, assertFullyBalanced, false); } @@ -61,7 +64,8 @@ public void testMidCluster3() { int numRegionsPerServer = 9; // all servers except one int replication = 1; int numTables = 110; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); // TODO(eclark): Make sure that the tables are well distributed. } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java index bd437425f213..9d873070a600 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java @@ -171,7 +171,8 @@ public void testRegionReplicasOnSmallCluster() { int replication = 3; // 3 replicas per region int numRegionsPerServer = 80; // all regions are mostly balanced int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } private static class ForTestRackManagerOne extends RackManager { diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java index a58b8e162968..448609bc9818 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.MasterTests; import org.apache.hadoop.hbase.testclassification.MediumTests; @@ -35,13 +36,14 @@ public class TestStochasticLoadBalancerRegionReplicaHighReplication @Test public void testRegionReplicasOnMidClusterHighReplication() { conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 4000000L); - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec + setMaxRunTime(Duration.ofSeconds(5)); loadBalancer.onConfigurationChange(conf); int numNodes = 40; int numRegions = 6 * numNodes; int replication = 40; // 40 replicas per region, one for each server int numRegionsPerServer = 5; int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, false, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + false, true); } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java index af010033ae55..fe2236e170b4 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.MasterTests; @@ -39,12 +40,15 @@ public void testRegionReplicasOnLargeCluster() { // ignore these two cost functions to allow us to make any move that helps other functions. conf.setFloat("hbase.master.balancer.stochastic.moveCost", 0f); conf.setFloat("hbase.master.balancer.stochastic.tableSkewCost", 0f); + conf.setBoolean("hbase.master.balancer.stochastic.runMaxSteps", true); + setMaxRunTime(Duration.ofSeconds(15)); loadBalancer.onConfigurationChange(conf); int numNodes = 1000; int numRegions = 20 * numNodes; // 20 * replication regions per RS int numRegionsPerServer = 19; // all servers except one int numTables = 100; int replication = 3; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java index e668b20c1cb3..44e5d983aaab 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java @@ -38,6 +38,8 @@ public void testRegionReplicasOnMidCluster() { int replication = 3; // 3 replicas per region int numRegionsPerServer = 30; // all regions are mostly balanced int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + conf.setLong(StochasticLoadBalancer.MAX_RUNNING_TIME_KEY, 10_000); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java index 6ee9682e8d66..b37349e8add3 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.testclassification.MasterTests; @@ -34,13 +35,14 @@ public class TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNod @Test public void testRegionReplicationOnMidClusterReplicationGreaterThanNumNodes() { - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec loadBalancer.onConfigurationChange(conf); + setMaxRunTime(Duration.ofSeconds(5)); int numNodes = 40; int numRegions = 6 * 50; int replication = 50; // 50 replicas per region, more than numNodes int numRegionsPerServer = 6; int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, false); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, false); } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java index c8e7a83c9bd4..3ddb0943527d 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java @@ -40,7 +40,6 @@ public class TestStochasticLoadBalancerRegionReplicaSameHosts extends Stochastic @Test public void testRegionReplicationOnMidClusterSameHosts() { conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 2000000L); - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 90 * 1000); // 90 sec loadBalancer.onConfigurationChange(conf); int numHosts = 30; int numRegions = 30 * 30; @@ -62,6 +61,6 @@ public void testRegionReplicationOnMidClusterSameHosts() { } } - testWithCluster(newServerMap, null, true, true); + testWithClusterWithIteration(newServerMap, null, true, true); } } diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java index ad60aadc1c17..f57c4264adb6 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java @@ -17,6 +17,7 @@ */ package org.apache.hadoop.hbase.master.balancer; +import java.time.Duration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -61,7 +62,7 @@ public String getRack(ServerName server) { public void testRegionReplicationOnMidClusterWithRacks() { conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 100000000L); conf.setBoolean("hbase.master.balancer.stochastic.runMaxSteps", true); - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 120 sec + setMaxRunTime(Duration.ofSeconds(5)); loadBalancer.onConfigurationChange(conf); int numNodes = 5; int numRegions = numNodes * 1; @@ -79,7 +80,7 @@ public void testRegionReplicationOnMidClusterWithRacks() { public void testRegionReplicationOnLargeClusterWithRacks() { conf.setBoolean("hbase.master.balancer.stochastic.runMaxSteps", true); conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 100000000L); - conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 120 * 1000); // 10 sec + setMaxRunTime(Duration.ofSeconds(5)); loadBalancer.onConfigurationChange(conf); int numNodes = 100; int numRegions = numNodes * 30; diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java index 831c9e932727..bd934db759b5 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java @@ -38,7 +38,8 @@ public void testSmallCluster() { int numRegionsPerServer = 40; // all servers except one int replication = 1; int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } @Test @@ -48,7 +49,8 @@ public void testSmallCluster2() { int numRegionsPerServer = 40; // all servers except one int replication = 1; int numTables = 10; - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, true, true); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + true, true); } @Test @@ -59,7 +61,7 @@ public void testSmallCluster3() { int replication = 1; int numTables = 10; // fails because of max moves - testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, numTables, false, - false); + testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, replication, numTables, + false, false); } }