This is an automated email from the ASF dual-hosted git repository. junegunn 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 8f5803da347 HBASE-29474 RegionSplitter.rollingSplit is broken (#7174) 8f5803da347 is described below commit 8f5803da3472adc7182d584df8aa2c94f8e309b0 Author: Junegunn Choi <juneg...@apache.org> AuthorDate: Mon Jul 28 22:34:45 2025 +0900 HBASE-29474 RegionSplitter.rollingSplit is broken (#7174) Avoid concurrent modification by iterating over a snapshot of the keys. Also, revive the sorting logic for the ServerName list, which was mistakenly removed in 5e91b45b166cd5a68457234f0a62ca1c2b5d9211. Signed-off-by: Duo Zhang <zhang...@apache.org> --- .../java/org/apache/hadoop/hbase/util/RegionSplitter.java | 12 +++++++----- .../org/apache/hadoop/hbase/util/TestRegionSplitter.java | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java index 430df04cd42..dccd4ae0fc0 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/RegionSplitter.java @@ -21,9 +21,9 @@ import java.io.IOException; import java.math.BigInteger; import java.util.Arrays; import java.util.Collection; +import java.util.Comparator; import java.util.LinkedList; import java.util.List; -import java.util.Map; import java.util.Set; import java.util.TreeMap; import org.apache.commons.lang3.ArrayUtils; @@ -460,13 +460,15 @@ public class RegionSplitter { } } + // Sort the ServerNames by the number of regions they have + final List<ServerName> serversLeft = Lists.newArrayList(daughterRegions.keySet()); + serversLeft.sort(Comparator.comparing(rsSizes::get)); + // Round-robin through the ServerName list. Choose the lightest-loaded servers // first to keep the master from load-balancing regions as we split. - for (Map.Entry<ServerName, - LinkedList<Pair<byte[], byte[]>>> daughterRegion : daughterRegions.entrySet()) { + for (final ServerName rsLoc : serversLeft) { Pair<byte[], byte[]> dr = null; - ServerName rsLoc = daughterRegion.getKey(); - LinkedList<Pair<byte[], byte[]>> regionList = daughterRegion.getValue(); + final LinkedList<Pair<byte[], byte[]>> regionList = daughterRegions.get(rsLoc); // Find a region in the ServerName list that hasn't been moved LOG.debug("Finding a region on " + rsLoc); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java index 4950188232c..4f7d7299e54 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestRegionSplitter.java @@ -72,7 +72,7 @@ public class TestRegionSplitter { @BeforeClass public static void setup() throws Exception { - UTIL.startMiniCluster(); + UTIL.startMiniCluster(2); } @AfterClass