This is an automated email from the ASF dual-hosted git repository.
junegunn pushed a commit to branch branch-2.6
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.6 by this push:
new 90b9aa37605 HBASE-29472 Fix splitting algorithms of RegionSplitter
tool (#7173)
90b9aa37605 is described below
commit 90b9aa376052dea44a974709911a8dfc7fbd6639
Author: Junegunn Choi <[email protected]>
AuthorDate: Sat Jul 26 15:15:47 2025 +0900
HBASE-29472 Fix splitting algorithms of RegionSplitter tool (#7173)
Signed-off-by: Nihal Jain <[email protected]>
---
.../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 b38f97af880..ef63985a2d2 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
@@ -978,6 +978,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 ff35b059ce8..c97cbd02fba 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.
*/