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

rmattingly pushed a commit to branch HBASE-29070-branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 83878ac80a7d6ddd70369722d85c4fde9ae87c08
Author: Ray Mattingly <[email protected]>
AuthorDate: Thu Jan 16 08:52:40 2025 -0500

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

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java
index 4292465cb3f..372cc54c8b2 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/balancer/CostFunction.java
+++ 
b/hbase-server/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;
 
@@ -91,13 +93,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-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 607c5162ba4..1237d2c899d 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
@@ -349,10 +349,8 @@ public class StochasticLoadBalancer extends 
BaseLoadBalancer {
 
   private boolean areSomeRegionReplicasColocated(BalancerClusterState c) {
     regionReplicaHostCostFunction.prepare(c);
-    if (Math.abs(regionReplicaHostCostFunction.cost()) > 
CostFunction.COST_EPSILON) {
-      return true;
-    }
-    return (Math.abs(regionReplicaHostCostFunction.cost()) > 
CostFunction.COST_EPSILON);
+    double cost = Math.abs(regionReplicaHostCostFunction.cost());
+    return cost > CostFunction.getCostEpsilon(cost);
   }
 
   @RestrictedApi(explanation = "Should only be called in tests", link = "",
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
index b1fb92895e1..9e8f7c97dca 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -30,10 +31,10 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.NavigableSet;
 import java.util.Queue;
 import java.util.Random;
 import java.util.Set;
-import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ThreadLocalRandom;
@@ -286,6 +287,11 @@ public class BalancerTestBase {
     }
   }
 
+  protected void setMaxRunTime(Duration maxRunTime) {
+    conf.setLong(StochasticLoadBalancer.MAX_RUNNING_TIME_KEY, 
maxRunTime.toMillis());
+    loadBalancer.loadConf(conf);
+  }
+
   protected String printStats(List<ServerAndLoad> servers) {
     int numServers = servers.size();
     int totalRegions = 0;
@@ -308,7 +314,10 @@ public class BalancerTestBase {
   }
 
   protected String printMock(List<ServerAndLoad> balancedCluster) {
-    SortedSet<ServerAndLoad> sorted = new TreeSet<>(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);
     sb.append("{ ");
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
index 35f87773669..f9255fb1bfd 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerBalanceCluster.java
+++ 
b/hbase-server/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,8 +52,8 @@ public class TestStochasticLoadBalancerBalanceCluster extends 
BalancerTestBase {
    */
   @Test
   public void testBalanceCluster() throws Exception {
-    conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 2 * 60 * 
1000); // 2 min
     conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 20000000L);
+    setMaxRunTime(Duration.ofMillis(1500));
     loadBalancer.onConfigurationChange(conf);
 
     for (int[] mockCluster : clusterStateMocks) {
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
index b55ff22cb6d..41bcb87d4b2 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerHeterogeneousCost.java
@@ -17,7 +17,6 @@
  */
 package org.apache.hadoop.hbase.master.balancer;
 
-import static junit.framework.TestCase.assertNotNull;
 import static junit.framework.TestCase.assertTrue;
 import static org.junit.Assert.assertNull;
 import static org.mockito.Mockito.mock;
@@ -41,7 +40,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.MasterServices;
-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;
@@ -49,8 +47,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 
BalancerTestBase {
@@ -58,9 +54,6 @@ public class TestStochasticLoadBalancerHeterogeneousCost 
extends BalancerTestBas
   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 HBaseTestingUtility HTU = new HBaseTestingUtility();
   private static String RULES_FILE;
 
@@ -172,65 +165,7 @@ public class TestStochasticLoadBalancerHeterogeneousCost 
extends BalancerTestBas
     
TestStochasticLoadBalancerHeterogeneousCostRules.createRulesFile(RULES_FILE, 
rules);
     final Map<ServerName, List<RegionInfo>> serverMap =
       this.createServerMap(numNodes, numRegions, numRegionsPerServer, 1, 1);
-    this.testWithCluster(serverMap, null, true, false);
-  }
-
-  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));
-
-    BalancerTestBase.loadBalancer.setRackManager(rackManager);
-
-    // Run the balancer.
-    final List<RegionPlan> plans =
-      
BalancerTestBase.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 =
-          
BalancerTestBase.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
@@ -313,6 +248,10 @@ public class TestStochasticLoadBalancerHeterogeneousCost 
extends BalancerTestBas
     private FairRandomCandidateGenerator fairRandomCandidateGenerator =
       new FairRandomCandidateGenerator();
 
+    StochasticLoadTestBalancer() {
+      super(new DummyMetricsStochasticBalancer());
+    }
+
     @Override
     protected CandidateGenerator getRandomGenerator() {
       return fairRandomCandidateGenerator;
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java
index 910ca5bcab6..36e8dba9b00 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerLargeCluster.java
+++ 
b/hbase-server/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,8 +39,8 @@ public class TestStochasticLoadBalancerLargeCluster extends 
BalancerTestBase {
     int numRegionsPerServer = 80; // all servers except one
     int numTables = 100;
     int replication = 1;
-    conf.setLong("hbase.master.balancer.stochastic.maxRunningTime", 6 * 60 * 
1000);
     conf.setLong(StochasticLoadBalancer.MAX_STEPS_KEY, 20000000L);
+    setMaxRunTime(Duration.ofSeconds(30));
     loadBalancer.onConfigurationChange(conf);
     testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, 
replication, numTables,
       true, true);
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java
index 2f5363283d8..a149c8222af 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerMidCluster.java
+++ 
b/hbase-server/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,9 @@ public class TestStochasticLoadBalancerMidCluster extends 
BalancerTestBase {
     int numRegionsPerServer = 60; // all servers except one
     int replication = 1;
     int numTables = 40;
-    testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, 
numTables, true, true);
+    setMaxRunTime(Duration.ofMillis(10_000));
+    testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, 
replication, numTables,
+      true, true);
   }
 
   @Test
@@ -50,7 +53,8 @@ public class TestStochasticLoadBalancerMidCluster extends 
BalancerTestBase {
     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(10_000));
+    testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, 
replication, numTables,
       assertFullyBalanced, false);
   }
 
@@ -61,7 +65,9 @@ public class TestStochasticLoadBalancerMidCluster extends 
BalancerTestBase {
     int numRegionsPerServer = 9; // all servers except one
     int replication = 1;
     int numTables = 110;
-    testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, 
numTables, true, true);
+    setMaxRunTime(Duration.ofMillis(10_000));
+    testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, 
replication, numTables,
+      true, true);
     // TODO(eclark): Make sure that the tables are well distributed.
   }
 }
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java
index 2e39b6031a6..714f5a9e2f6 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplica.java
@@ -171,7 +171,8 @@ public class TestStochasticLoadBalancerRegionReplica 
extends BalancerTestBase {
     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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
index cf02e8ba77e..9a545434c55 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaHighReplication.java
+++ 
b/hbase-server/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;
@@ -34,13 +35,14 @@ public class 
TestStochasticLoadBalancerRegionReplicaHighReplication extends Bala
   @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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java
index d60ac903f6e..3031fcd9c90 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaLargeCluster.java
+++ 
b/hbase-server/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;
@@ -38,12 +39,15 @@ public class 
TestStochasticLoadBalancerRegionReplicaLargeCluster extends Balance
     // 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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java
index 88517c73de5..62394e3e27f 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaMidCluster.java
@@ -38,6 +38,8 @@ public class 
TestStochasticLoadBalancerRegionReplicaMidCluster extends BalancerT
     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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
index 55d09e75c59..2fd314d8f56 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaReplicationGreaterThanNumNodes.java
+++ 
b/hbase-server/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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
index 2839344af53..b26a85436e1 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaSameHosts.java
@@ -40,7 +40,6 @@ public class TestStochasticLoadBalancerRegionReplicaSameHosts 
extends BalancerTe
   @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 BalancerTe
       }
     }
 
-    testWithCluster(newServerMap, null, true, true);
+    testWithClusterWithIteration(newServerMap, null, true, true);
   }
 }
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
index 1d55dae9bd1..6ecf73314ad 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerRegionReplicaWithRacks.java
+++ 
b/hbase-server/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;
@@ -60,7 +61,7 @@ public class TestStochasticLoadBalancerRegionReplicaWithRacks 
extends BalancerTe
   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 = 4;
     int numRegions = numNodes * 1;
@@ -79,7 +80,7 @@ public class TestStochasticLoadBalancerRegionReplicaWithRacks 
extends BalancerTe
   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-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java
index e0e79d4af00..0546f71a35d 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancerSmallCluster.java
@@ -38,7 +38,8 @@ public class TestStochasticLoadBalancerSmallCluster extends 
BalancerTestBase {
     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 
BalancerTestBase {
     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
@@ -58,8 +60,8 @@ public class TestStochasticLoadBalancerSmallCluster extends 
BalancerTestBase {
     int numRegionsPerServer = 1; // all servers except one
     int replication = 1;
     int numTables = 10;
-    /* fails because of max moves */
-    testWithCluster(numNodes, numRegions, numRegionsPerServer, replication, 
numTables, false,
-      false);
+    // fails because of max moves
+    testWithClusterWithIteration(numNodes, numRegions, numRegionsPerServer, 
replication, numTables,
+      false, false);
   }
 }

Reply via email to