From c67f57699962947ebfa4dd10569f0edefa422b3c Mon Sep 17 00:00:00 2001 From: Ma Zhengxuan <1319614897@qq.com> Date: Mon, 31 Aug 2026 20:50:01 +0800 Subject: [PATCH] HBASE-30093 Start stochastic search timeout after initialization --- .../balancer/StochasticLoadBalancer.java | 2 +- .../balancer/TestStochasticLoadBalancer.java | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) 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 79a0129518e9..e72e9caccfd9 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 @@ -585,7 +585,6 @@ protected List balanceTable(TableName tableName, BalancerClusterState cluster = createState(loadOfOneTable, loads, finder, rackManager); long startTime = EnvironmentEdgeManager.currentTime(); - cluster.setStopRequestedAt(startTime + maxRunningTime); initCosts(cluster); balancerConditionals.loadClusterState(cluster); @@ -636,6 +635,7 @@ protected List balanceTable(TableName tableName, currentCost / sumMultiplier, functionCost(), computedMaxSteps); final String initFunctionTotalCosts = totalCostsPerFunc(); + cluster.setStopRequestedAt(EnvironmentEdgeManager.currentTime() + maxRunningTime); // Perform a stochastic walk to see if we can get a good fit. long step; boolean planImprovedConditionals = false; diff --git a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java index 14f682b4b2c4..7ddbce318027 100644 --- a/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java +++ b/hbase-balancer/src/test/java/org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -44,6 +45,7 @@ import org.apache.hadoop.hbase.Size; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.RegionInfo; +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; @@ -496,6 +498,42 @@ public void testCostAfterUndoAction() { } } + @Test + public void testSearchDeadlineIsSetAfterInitialization() throws Exception { + Configuration testConf = new Configuration(conf); + testConf.setInt(StochasticLoadBalancer.MAX_STEPS_KEY, 0); + boolean[] needsBalanceCalled = { false }; + boolean[] deadlineSet = { false }; + StochasticLoadBalancer balancer = + new StochasticLoadBalancer(new DummyMetricsStochasticBalancer()) { + @Override + protected BalancerClusterState createState(Map> clusterState, + Map> loads, RegionHDFSBlockLocationFinder finder, + RackManager rackManager) { + return new BalancerClusterState(clusterState, loads, finder, rackManager) { + @Override + void setStopRequestedAt(long stopRequestedAt) { + deadlineSet[0] = true; + assertTrue(needsBalanceCalled[0]); + super.setStopRequestedAt(stopRequestedAt); + } + }; + } + + @Override + boolean needsBalance(TableName tableName, BalancerClusterState cluster) { + needsBalanceCalled[0] = true; + return true; + } + }; + balancer.setClusterInfoProvider(new DummyClusterInfoProvider(testConf)); + balancer.initialize(); + + balancer.balanceTable(HConstants.ENSEMBLE_TABLE_NAME, createServerMap(2, 2, 1, 1, 1)); + + assertTrue(deadlineSet[0]); + } + @Test public void testTableSkewCost() { Configuration conf = HBaseConfiguration.create();