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 f88a1ce5258 HBASE-29472 Fix splitting algorithms of RegionSplitter 
tool (#7173)
f88a1ce5258 is described below

commit f88a1ce52583fc02ad3d421ccf32bd7f38c3f0b3
Author: Junegunn Choi <juneg...@apache.org>
AuthorDate: Sat Jul 26 15:15:47 2025 +0900

    HBASE-29472 Fix splitting algorithms of RegionSplitter tool (#7173)
    
    Signed-off-by: Nihal Jain <nihalj...@apache.org>
---
 .../apache/hadoop/hbase/util/RegionSplitter.java   |  3 +++
 .../hadoop/hbase/util/TestRegionSplitter.java      | 30 ++++++++++++++++++++++
 2 files changed, 33 insertions(+)

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 5d0509ac3d1..430df04cd42 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
@@ -980,6 +980,9 @@ public class RegionSplitter {
      * @return the midpoint of the 2 numbers
      */
     public BigInteger split2(BigInteger a, BigInteger b) {
+      if (b.equals(lastRowInt)) {
+        b = b.add(BigInteger.ONE);
+      }
       return a.add(b).divide(BigInteger.valueOf(2)).abs();
     }
 
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 532e55223ad..4950188232c 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
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.hadoop.conf.Configuration;
@@ -108,6 +109,35 @@ public class TestRegionSplitter {
       TableName.valueOf(name.getMethodName()));
   }
 
+  /**
+   * Test creating a pre-split table and splitting it again using the 
HexStringSplit and
+   * DecimalStringSplit algorithms.
+   */
+  @Test
+  public void testSplitPresplitTable() throws Exception {
+    testSplitPresplitTable(new HexStringSplit());
+    testSplitPresplitTable(new DecimalStringSplit());
+  }
+
+  private void testSplitPresplitTable(RegionSplitter.NumberStringSplit 
splitter) throws Exception {
+    final List<byte[]> initialBounds = new ArrayList<>();
+    initialBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY);
+    initialBounds.addAll(Arrays.asList(splitter.split(8)));
+    initialBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY);
+
+    // Do table creation/pre-splitting and verification of region boundaries
+    final String className = splitter.getClass().getSimpleName();
+    final TableName tableName = TableName.valueOf(className);
+    preSplitTableAndVerify(initialBounds, className, tableName);
+
+    // Split the table again and verify the new region boundaries
+    final List<byte[]> expectedBounds = new ArrayList<>();
+    expectedBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY);
+    expectedBounds.addAll(Arrays.asList(splitter.split(16)));
+    expectedBounds.add(ArrayUtils.EMPTY_BYTE_ARRAY);
+    rollingSplitAndVerify(tableName, className, expectedBounds);
+  }
+
   /**
    * Test creating a pre-split table using the UniformSplit algorithm.
    */

Reply via email to