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

Reply via email to