This is an automated email from the ASF dual-hosted git repository.

rmattingly pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 58b742bd74f HBASE-29070 Balancer cost function epsilon is imprecise 
(#6597)
58b742bd74f is described below

commit 58b742bd74f619c7d5aef3e53ac587668026c928
Author: Ray Mattingly <[email protected]>
AuthorDate: Mon Jan 13 09:46:55 2025 -0500

    HBASE-29070 Balancer cost function epsilon is imprecise (#6597)
    
    Co-authored-by: Ray Mattingly <[email protected]>
    Signed-off-by: Nick Dimiduk <[email protected]>
---
 .../hadoop/hbase/master/balancer/CostFunction.java | 11 ++--
 .../master/balancer/StochasticLoadBalancer.java    |  3 +-
 .../hbase/master/balancer/BalancerTestBase.java    |  3 +
 .../balancer/StochasticBalancerTestBase.java       | 66 ++++++++------------
 .../TestStochasticLoadBalancerBalanceCluster.java  |  2 +
 ...estStochasticLoadBalancerHeterogeneousCost.java | 72 ++--------------------
 .../TestStochasticLoadBalancerLargeCluster.java    |  3 +-
 .../TestStochasticLoadBalancerMidCluster.java      | 10 ++-
 .../TestStochasticLoadBalancerRegionReplica.java   |  3 +-
 ...icLoadBalancerRegionReplicaHighReplication.java |  6 +-
 ...asticLoadBalancerRegionReplicaLargeCluster.java |  6 +-
 ...chasticLoadBalancerRegionReplicaMidCluster.java |  4 +-
 ...egionReplicaReplicationGreaterThanNumNodes.java |  6 +-
 ...ochasticLoadBalancerRegionReplicaSameHosts.java |  3 +-
 ...ochasticLoadBalancerRegionReplicaWithRacks.java |  5 +-
 .../TestStochasticLoadBalancerSmallCluster.java    | 10 +--
 16 files changed, 83 insertions(+), 130 deletions(-)

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 5cc98478f9b..91e1ec61552 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 @@ import org.apache.yetus.audience.InterfaceAudience;
 @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 @@ abstract class CostFunction {
    * @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 e5cd5446c5c..8405130c1c4 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 @@ public class StochasticLoadBalancer extends 
BaseLoadBalancer {
 
   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 4a996e7796f..54729f88b70 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 @@ public class BalancerTestBase {
   }
 
   protected String printMock(List<ServerAndLoad> balancedCluster) {
+    if (balancedCluster == null) {
+      return "null";
+    }
     NavigableSet<ServerAndLoad> 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 e45ac5a6932..9578f212efb 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 @@ import org.slf4j.LoggerFactory;
 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 class StochasticBalancerTestBase extends 
BalancerTestBase {
     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<ServerName, List<RegionInfo>> 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 @@ public class StochasticBalancerTestBase extends 
BalancerTestBase {
       assertFullyBalancedForReplicas);
   }
 
-  protected void testWithCluster(Map<ServerName, List<RegionInfo>> serverMap,
-    RackManager rackManager, boolean assertFullyBalanced, boolean 
assertFullyBalancedForReplicas) {
-    List<ServerAndLoad> list = convertToList(serverMap);
-    LOG.info("Mock Cluster : " + printMock(list) + " " + printStats(list));
-
-    loadBalancer.setRackManager(rackManager);
-    // Run the balancer.
-    Map<TableName, Map<ServerName, List<RegionInfo>>> LoadOfAllTable =
-      (Map) mockClusterServersWithTables(serverMap);
-    List<RegionPlan> 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<ServerAndLoad> 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<RegionPlan> 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 @@ public class StochasticBalancerTestBase extends 
BalancerTestBase {
     Map<TableName, Map<ServerName, List<RegionInfo>>> LoadOfAllTable =
       (Map) mockClusterServersWithTables(serverMap);
     List<RegionPlan> 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<ServerAndLoad> balancedCluster = null;
     // Run through iteration until done. Otherwise will be killed as test time 
out
@@ -140,4 +123,9 @@ public class StochasticBalancerTestBase extends 
BalancerTestBase {
       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 2a7b8afccc3..2b2c56aa99a 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 @@ package org.apache.hadoop.hbase.master.balancer;
 
 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<ServerName, List<RegionInfo>> 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 8691cff733f..a565c14f0fd 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 @@ package org.apache.hadoop.hbase.master.balancer;
 
 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.HConstants;
 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.BeforeClass;
 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 @@ public class TestStochasticLoadBalancerHeterogeneousCost 
extends StochasticBalan
     createRulesFile(RULES_FILE, rules);
     final Map<ServerName, List<RegionInfo>> serverMap =
       this.createServerMap(numNodes, numRegions, numRegionsPerServer, 1, 1);
-    this.testWithCluster(serverMap, null, true, false);
-  }
-
-  @Override
-  protected void testWithCluster(final Map<ServerName, List<RegionInfo>> 
serverMap,
-    final RackManager rackManager, final boolean assertFullyBalanced,
-    final boolean assertFullyBalancedForReplicas) {
-    final List<ServerAndLoad> list = this.convertToList(serverMap);
-    LOG.info("Mock Cluster : " + this.printMock(list) + " " + 
this.printStats(list));
-
-    loadBalancer.setRackManager(rackManager);
-
-    // Run the balancer.
-    final List<RegionPlan> 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<ServerAndLoad> 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<RegionPlan> 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 @@ public class TestStochasticLoadBalancerHeterogeneousCost 
extends StochasticBalan
     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 620d610288f..e6dfc912005 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 class TestStochasticLoadBalancerLargeCluster extends 
StochasticBalancerTe
     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 80adea40fd7..e7b3dd3fd8a 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 class TestStochasticLoadBalancerMidCluster extends 
StochasticBalancerTest
     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 class TestStochasticLoadBalancerMidCluster extends 
StochasticBalancerTest
     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 class TestStochasticLoadBalancerMidCluster extends 
StochasticBalancerTest
     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 bd437425f21..9d873070a60 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 class TestStochasticLoadBalancerRegionReplica 
extends StochasticBalancerT
     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 a58b8e16296..448609bc981 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 af010033ae5..fe2236e170b 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 class 
TestStochasticLoadBalancerRegionReplicaLargeCluster
     // 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 e668b20c1cb..44e5d983aaa 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 class 
TestStochasticLoadBalancerRegionReplicaMidCluster extends Stochasti
     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 6ee9682e8d6..b37349e8add 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 c8e7a83c9bd..3ddb0943527 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 class TestStochasticLoadBalancerRegionReplicaSameHosts 
extends Stochastic
       }
     }
 
-    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 ad60aadc1c1..f57c4264adb 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 class TestStochasticLoadBalancerRegionReplicaWithRacks 
extends Stochastic
   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 class TestStochasticLoadBalancerRegionReplicaWithRacks 
extends Stochastic
   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 831c9e93272..bd934db759b 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 class TestStochasticLoadBalancerSmallCluster extends 
StochasticBalancerTe
     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 class TestStochasticLoadBalancerSmallCluster extends 
StochasticBalancerTe
     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 class TestStochasticLoadBalancerSmallCluster extends 
StochasticBalancerTe
     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);
   }
 }

Reply via email to