From c5be474665c678e8611f8a9da5c1feb9c1166e0c Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Tue, 19 May 2026 23:37:04 +0530 Subject: [PATCH 1/5] HBASE-30169 Split completed parent region added to RIT list on RS crash --- .../assignment/RegionInTransitionTracker.java | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java index e3c52e5bdc6f..a26b1105475c 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java @@ -59,7 +59,7 @@ public boolean isRegionInTransition(final RegionInfo regionInfo) { * other servers. */ public void regionCrashed(RegionStateNode regionStateNode) { - if (regionStateNode.getRegionInfo().getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) { + if (isReplica(regionStateNode) || isSplitOrMerged(regionStateNode)) { return; } @@ -79,7 +79,7 @@ public void regionCrashed(RegionStateNode regionStateNode) { */ public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) { // only consider default replica for availability - if (regionStateNode.getRegionInfo().getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID) { + if (isReplica(regionStateNode)) { return; } @@ -89,10 +89,7 @@ public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) { tableEnabled ? ENABLE_TABLE_REGION_STATE : DISABLE_TABLE_REGION_STATE; // if region is merged or split it should not be in RIT list - if ( - currentState == RegionState.State.SPLIT || currentState == RegionState.State.MERGED - || regionStateNode.getRegionInfo().isSplit() - ) { + if (isSplitOrMerged(regionStateNode)) { if (removeRegionInTransition(regionStateNode.getRegionInfo())) { LOG.debug("Removed {} from RIT list as it is split or merged", regionStateNode.getRegionInfo().getEncodedName()); @@ -110,6 +107,12 @@ public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) { } } + private static boolean isSplitOrMerged(RegionStateNode regionStateNode) { + return regionStateNode.getState() == RegionState.State.SPLIT + || regionStateNode.getState() == RegionState.State.MERGED + || regionStateNode.getRegionInfo().isSplit(); + } + private boolean isTableEnabled(TableName tableName) { if (tableStateManager != null) { return tableStateManager.isTableState(tableName, TableState.State.ENABLED, @@ -156,4 +159,9 @@ public List getRegionsInTransition() { public void setTableStateManager(TableStateManager tableStateManager) { this.tableStateManager = tableStateManager; } + + private static boolean isReplica(RegionStateNode regionStateNode) { + return regionStateNode.getRegionInfo().getReplicaId() != RegionInfo.DEFAULT_REPLICA_ID; + } + } From b96952afafba595f97615af356482fa8e9794e02 Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Thu, 21 May 2026 17:11:19 +0530 Subject: [PATCH 2/5] HBASE-30169 Split completed parent region added to RIT list on host RS and master crash --- .../master/assignment/AssignmentManager.java | 4 -- .../assignment/RegionInTransitionTracker.java | 6 +- .../assignment/AssignmentTestingUtil.java | 9 ++- .../master/assignment/TestRegionSplit.java | 56 +++++++++++++++++-- .../TestSplitTransactionOnCluster.java | 6 +- 5 files changed, 65 insertions(+), 16 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index caaf8acda01b..cb8ce316d9b9 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -1998,10 +1998,6 @@ public List getRegionsInTransition() { return regionInTransitionTracker.getRegionsInTransition(); } - public boolean isRegionInTransition(final RegionInfo regionInfo) { - return regionInTransitionTracker.isRegionInTransition(regionInfo); - } - public int getRegionTransitScheduledCount() { return regionStates.getRegionTransitScheduledCount(); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java index a26b1105475c..566864c6cb5d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java @@ -44,15 +44,13 @@ public class RegionInTransitionTracker { private final List ENABLE_TABLE_REGION_STATE = Collections.singletonList(RegionState.State.OPEN); + // DO NOT USE containsKey() on regionInTransition map as MutableRegionInfo.hashCode() considers + // offline/split flags. private final ConcurrentSkipListMap regionInTransition = new ConcurrentSkipListMap<>(RegionInfo.COMPARATOR); private TableStateManager tableStateManager; - public boolean isRegionInTransition(final RegionInfo regionInfo) { - return regionInTransition.containsKey(regionInfo); - } - /** * Handles a region whose hosting RegionServer has crashed. When a RegionServer fails, all regions * it was hosting are automatically added to the RIT list since they need to be reassigned to diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java index 8e8f76913f46..1808cfc4df3a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/AssignmentTestingUtil.java @@ -49,12 +49,17 @@ private AssignmentTestingUtil() { } public static void waitForRegionToBeInTransition(final HBaseTestingUtility util, - final RegionInfo hri) throws Exception { - while (!getMaster(util).getAssignmentManager().isRegionInTransition(hri)) { + final RegionInfo hri) { + while (!isRegionInTransition(hri, getMaster(util).getAssignmentManager())) { Threads.sleep(10); } } + public static boolean isRegionInTransition(RegionInfo hri, AssignmentManager am) { + return am.getRegionsInTransition().stream() + .anyMatch(rsn -> rsn.getRegionInfo().getEncodedName().equals(hri.getEncodedName())); + } + public static void waitForRsToBeDead(final HBaseTestingUtility util, final ServerName serverName) throws Exception { util.waitFor(60000, new ExplainingPredicate() { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java index bed5de2c5205..4760e88541fe 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java @@ -19,8 +19,8 @@ import static org.apache.hadoop.hbase.master.assignment.AssignmentTestingUtil.insertData; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; import java.util.Map; @@ -117,8 +117,8 @@ public void testSplitTableRegion() throws Exception { int splitRowNum = startRowNum + rowCount / 2; byte[] splitKey = Bytes.toBytes("" + splitRowNum); - assertTrue(regions != null, "not able to find a splittable region"); - assertTrue(regions.length == 1, "not able to find a splittable region"); + assertNotNull(regions, "not able to find a splittable region"); + assertEquals(1, regions.length, "not able to find a splittable region"); // Split region of the table long procId = procExec.submitProcedure( @@ -127,7 +127,7 @@ public void testSplitTableRegion() throws Exception { ProcedureTestingUtility.waitProcedure(procExec, procId); ProcedureTestingUtility.assertProcNotFailed(procExec, procId); - assertTrue(UTIL.getHBaseCluster().getRegions(tableName).size() == 2, "not able to split table"); + assertEquals(2, UTIL.getHBaseCluster().getRegions(tableName).size(), "not able to split table"); // disable table UTIL.getAdmin().disableTable(tableName); @@ -155,6 +155,54 @@ public void testSplitTableRegion() throws Exception { regionInfoMap.get(tableRegions.get(1).getRegionInfo())); } + @Test + public void testRITWithSplitTableRegion() throws Exception { + final TableName tableName = TableName.valueOf(testMethodName); + final ProcedureExecutor procExec = getMasterProcedureExecutor(); + + RegionInfo[] regions = + MasterProcedureTestingUtility.createTable(procExec, tableName, null, columnFamilyName); + insertData(UTIL, tableName, rowCount, startRowNum, columnFamilyName); + int splitRowNum = startRowNum + rowCount / 2; + byte[] splitKey = Bytes.toBytes("" + splitRowNum); + + assertNotNull(regions, "not able to find a splittable region"); + assertEquals(1, regions.length, "not able to find a splittable region"); + assertEquals(0, + UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionsInTransitionCount()); + + ServerName targetRS = UTIL.getHBaseCluster().getMaster().getAssignmentManager() + .getRegionStates().getRegionServerOfRegion(regions[0]); + // Split region of the table + long procId = procExec.submitProcedure( + new SplitTableRegionProcedure(procExec.getEnvironment(), regions[0], splitKey)); + // Wait the completion + ProcedureTestingUtility.waitProcedure(procExec, procId); + ProcedureTestingUtility.assertProcNotFailed(procExec, procId); + + assertEquals(2, UTIL.getHBaseCluster().getRegions(tableName).size(), "not able to split table"); + assertEquals(0, + UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionsInTransitionCount()); + // As there are only 3 RS, start one more RS before expiring one + UTIL.getHBaseCluster().startRegionServer(); + + // stop RS holding split parent + UTIL.getHBaseCluster().getMaster().getServerManager().expireServer(targetRS); + + // stop master + UTIL.getHBaseCluster().stopMaster(0); + UTIL.getHBaseCluster().waitOnMaster(0); + Thread.sleep(500); + + // restart master + JVMClusterUtil.MasterThread t = UTIL.getHBaseCluster().startMaster(); + UTIL.getHBaseCluster().waitForActiveAndReadyMaster(10000); + UTIL.invalidateConnection(); + + assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], + UTIL.getHBaseCluster().getMaster().getAssignmentManager())); + } + @Test public void testSplitStoreFiles() throws Exception { final TableName tableName = TableName.valueOf(testMethodName); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java index e0ee9e3b8d0b..e04371d4704f 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java @@ -904,7 +904,8 @@ public void testSplitRegionWithNoStoreFiles() throws Exception { } catch (DoNotRetryIOException e) { // Expected } - assertFalse(am.isRegionInTransition(hri), "Split region can't be assigned"); + assertFalse(AssignmentTestingUtil.isRegionInTransition(hri, am), + "Split region can't be assigned"); assertTrue(regionStates.isRegionInState(hri, State.SPLIT)); // We should not be able to unassign it either @@ -914,7 +915,8 @@ public void testSplitRegionWithNoStoreFiles() throws Exception { } catch (DoNotRetryIOException e) { // Expected } - assertFalse(am.isRegionInTransition(hri), "Split region can't be unassigned"); + assertFalse(AssignmentTestingUtil.isRegionInTransition(hri, am), + "Split region can't be unassigned"); assertTrue(regionStates.isRegionInState(hri, State.SPLIT)); } finally { admin.balancerSwitch(true, false); From 401c21c2c3cbf7d98489e1d47b61030cfd169067 Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Thu, 21 May 2026 17:17:00 +0530 Subject: [PATCH 3/5] HBASE-30169 comment fix --- .../hbase/master/assignment/RegionInTransitionTracker.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java index 566864c6cb5d..9402a437e2b1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java @@ -44,7 +44,7 @@ public class RegionInTransitionTracker { private final List ENABLE_TABLE_REGION_STATE = Collections.singletonList(RegionState.State.OPEN); - // DO NOT USE containsKey() on regionInTransition map as MutableRegionInfo.hashCode() considers + // DO NOT USE containsKey() on regionInTransition map as MutableRegionInfo.COMPARATOR considers // offline/split flags. private final ConcurrentSkipListMap regionInTransition = new ConcurrentSkipListMap<>(RegionInfo.COMPARATOR); From c60b659f667bf443c4236aa48023a08ec9db1c5b Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Tue, 26 May 2026 00:07:36 +0530 Subject: [PATCH 4/5] HBASE-30169 change the place to check the isSplitOrMerged --- .../master/assignment/AssignmentManager.java | 5 +++-- .../assignment/AssignmentManagerUtil.java | 13 ++++++++++++ .../assignment/RegionInTransitionTracker.java | 16 ++++++--------- .../master/assignment/TestRegionSplit.java | 20 +++++++++++-------- 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java index cb8ce316d9b9..72533798e8b1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManager.java @@ -1796,9 +1796,10 @@ public void visitRegionState(Result result, final RegionInfo regionInfo, final S } // add regions to RIT while visiting the meta regionInTransitionTracker.handleRegionStateNodeOperation(regionNode); - // If region location of region belongs to a dead server mark the region crashed + // If region is supposed to be serve traffic (NOT split and merged) and location of region + // belongs to a dead server mark the region crashed if ( - regionNode.getRegionLocation() != null + regionNode.getRegionLocation() != null && !AssignmentManagerUtil.isSplitOrMerged(regionNode) && master.getServerManager().isServerDead(regionNode.getRegionLocation()) ) { long timeOfCrash = master.getServerManager().getDeadServers() diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java index 7a11c5961b4f..c59ec8efc677 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/AssignmentManagerUtil.java @@ -35,6 +35,7 @@ import org.apache.hadoop.hbase.client.RegionReplicaUtil; import org.apache.hadoop.hbase.favored.FavoredNodesManager; import org.apache.hadoop.hbase.ipc.HBaseRpcController; +import org.apache.hadoop.hbase.master.RegionState; import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv; import org.apache.hadoop.hbase.wal.WALSplitUtil; import org.apache.yetus.audience.InterfaceAudience; @@ -308,4 +309,16 @@ static void checkClosedRegion(MasterProcedureEnv env, RegionInfo regionInfo) thr + ", abort split/merge to prevent data loss"); } } + + /** + * For splitting, need to test both region info and state, and will return true if either of the + * test returns true. Please see the comments in + * {@link AssignmentManager#markRegionAsSplit(RegionInfo, ServerName, RegionInfo, RegionInfo)} for + * more details on why we need to test two conditions. + */ + static boolean isSplitOrMerged(RegionStateNode regionStateNode) { + return regionStateNode.getState() == RegionState.State.SPLIT + || regionStateNode.getRegionInfo().isSplit() + || regionStateNode.getState() == RegionState.State.MERGED; + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java index 9402a437e2b1..cc598814582e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionInTransitionTracker.java @@ -44,8 +44,10 @@ public class RegionInTransitionTracker { private final List ENABLE_TABLE_REGION_STATE = Collections.singletonList(RegionState.State.OPEN); - // DO NOT USE containsKey() on regionInTransition map as MutableRegionInfo.COMPARATOR considers - // offline/split flags. + // DO NOT USE containsKey()/remove() on regionInTransition with a different RegionInfo instance: + // this map is ordered by RegionInfo.COMPARATOR, and that comparator includes the offline flag. + // Lookups can therefore fail if the RegionInfo used as the key has a different offline value, + // even when it refers to the same region. Offline value changes with splitting. private final ConcurrentSkipListMap regionInTransition = new ConcurrentSkipListMap<>(RegionInfo.COMPARATOR); @@ -57,7 +59,7 @@ public class RegionInTransitionTracker { * other servers. */ public void regionCrashed(RegionStateNode regionStateNode) { - if (isReplica(regionStateNode) || isSplitOrMerged(regionStateNode)) { + if (isReplica(regionStateNode)) { return; } @@ -87,7 +89,7 @@ public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) { tableEnabled ? ENABLE_TABLE_REGION_STATE : DISABLE_TABLE_REGION_STATE; // if region is merged or split it should not be in RIT list - if (isSplitOrMerged(regionStateNode)) { + if (AssignmentManagerUtil.isSplitOrMerged(regionStateNode)) { if (removeRegionInTransition(regionStateNode.getRegionInfo())) { LOG.debug("Removed {} from RIT list as it is split or merged", regionStateNode.getRegionInfo().getEncodedName()); @@ -105,12 +107,6 @@ public void handleRegionStateNodeOperation(RegionStateNode regionStateNode) { } } - private static boolean isSplitOrMerged(RegionStateNode regionStateNode) { - return regionStateNode.getState() == RegionState.State.SPLIT - || regionStateNode.getState() == RegionState.State.MERGED - || regionStateNode.getRegionInfo().isSplit(); - } - private boolean isTableEnabled(TableName tableName) { if (tableStateManager != null) { return tableStateManager.isTableState(tableName, TableState.State.ENABLED, diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java index 4760e88541fe..2c76f72062d4 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java @@ -21,6 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.List; import java.util.Map; @@ -168,8 +169,8 @@ public void testRITWithSplitTableRegion() throws Exception { assertNotNull(regions, "not able to find a splittable region"); assertEquals(1, regions.length, "not able to find a splittable region"); - assertEquals(0, - UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionsInTransitionCount()); + assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], + UTIL.getHBaseCluster().getMaster().getAssignmentManager())); ServerName targetRS = UTIL.getHBaseCluster().getMaster().getAssignmentManager() .getRegionStates().getRegionServerOfRegion(regions[0]); @@ -181,22 +182,25 @@ public void testRITWithSplitTableRegion() throws Exception { ProcedureTestingUtility.assertProcNotFailed(procExec, procId); assertEquals(2, UTIL.getHBaseCluster().getRegions(tableName).size(), "not able to split table"); - assertEquals(0, - UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionsInTransitionCount()); + assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], + UTIL.getHBaseCluster().getMaster().getAssignmentManager())); // As there are only 3 RS, start one more RS before expiring one UTIL.getHBaseCluster().startRegionServer(); - // stop RS holding split parent + // We don't want SCP to complete so kill PR it after store update + ProcedureTestingUtility + .toggleKillAfterStoreUpdate(UTIL.getHBaseCluster().getMaster().getMasterProcedureExecutor()); + // stop RS holding split parent to create SCP and add RS into deadServerList UTIL.getHBaseCluster().getMaster().getServerManager().expireServer(targetRS); // stop master UTIL.getHBaseCluster().stopMaster(0); UTIL.getHBaseCluster().waitOnMaster(0); - Thread.sleep(500); // restart master - JVMClusterUtil.MasterThread t = UTIL.getHBaseCluster().startMaster(); - UTIL.getHBaseCluster().waitForActiveAndReadyMaster(10000); + UTIL.getHBaseCluster().startMaster(); + assertTrue(UTIL.getHBaseCluster().waitForActiveAndReadyMaster(30000), + "Master failed to initialize in in 30 seconds"); UTIL.invalidateConnection(); assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], From 35921eb0fca6cbfe4095723f5e0678f1f808ce27 Mon Sep 17 00:00:00 2001 From: Umeshkumar9414 <9414umeshkumar@gmail.com> Date: Fri, 12 Jun 2026 23:48:37 +0530 Subject: [PATCH 5/5] HBASE-30169 add assertion for split validation --- .../hadoop/hbase/master/assignment/TestRegionSplit.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java index 2c76f72062d4..8c2122fbe59d 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/assignment/TestRegionSplit.java @@ -160,6 +160,8 @@ public void testSplitTableRegion() throws Exception { public void testRITWithSplitTableRegion() throws Exception { final TableName tableName = TableName.valueOf(testMethodName); final ProcedureExecutor procExec = getMasterProcedureExecutor(); + // Disable CatalogJanitor to keep the split region in hbase:meta throughout the test + UTIL.getHBaseCluster().getMaster().getCatalogJanitor().setEnabled(false); RegionInfo[] regions = MasterProcedureTestingUtility.createTable(procExec, tableName, null, columnFamilyName); @@ -184,6 +186,8 @@ public void testRITWithSplitTableRegion() throws Exception { assertEquals(2, UTIL.getHBaseCluster().getRegions(tableName).size(), "not able to split table"); assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], UTIL.getHBaseCluster().getMaster().getAssignmentManager())); + assertTrue(UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates() + .getOrCreateRegionStateNode(regions[0]).isSplit()); // As there are only 3 RS, start one more RS before expiring one UTIL.getHBaseCluster().startRegionServer(); @@ -205,6 +209,8 @@ public void testRITWithSplitTableRegion() throws Exception { assertFalse(AssignmentTestingUtil.isRegionInTransition(regions[0], UTIL.getHBaseCluster().getMaster().getAssignmentManager())); + assertTrue(UTIL.getHBaseCluster().getMaster().getAssignmentManager().getRegionStates() + .getOrCreateRegionStateNode(regions[0]).isSplit()); } @Test