diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java index 8c31f0a1551..7144cb846da 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/IncreasingToUpperBoundRegionSplitPolicy.java @@ -67,9 +67,7 @@ public class IncreasingToUpperBoundRegionSplitPolicy extends ConstantSizeRegionS @Override protected boolean shouldSplit() { - if (region.shouldForceSplit()) { - return true; - } + boolean force = region.shouldForceSplit(); boolean foundABigStore = false; // Get count of regions that have the same common table as this.region int tableRegionsCount = getCountOfCommonTableRegions(); @@ -93,7 +91,7 @@ public class IncreasingToUpperBoundRegionSplitPolicy extends ConstantSizeRegionS } } - return foundABigStore; + return foundABigStore | force; } /** diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java index 3ceb8feeada..1c381970159 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java @@ -61,6 +61,34 @@ public class TestRegionSplitPolicy { Mockito.doReturn(stores).when(mockRegion).getStores(); } + @Test + public void testForceSplitRegionWithReference() throws IOException { + htd.setMaxFileSize(1024L); + // Add a store above the requisite size. Should split. + HStore mockStore = Mockito.mock(HStore.class); + Mockito.doReturn(2000L).when(mockStore).getSize(); + // Act as if there's a reference file or some other reason it can't split. + // This should prevent splitting even though it's big enough. + Mockito.doReturn(false).when(mockStore).canSplit(); + stores.add(mockStore); + + conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY, + ConstantSizeRegionSplitPolicy.class.getName()); + ConstantSizeRegionSplitPolicy policy = + (ConstantSizeRegionSplitPolicy)RegionSplitPolicy.create(mockRegion, conf); + assertFalse(policy.shouldSplit()); + Mockito.doReturn(true).when(mockRegion).shouldForceSplit(); + assertFalse(policy.shouldSplit()); + + Mockito.doReturn(false).when(mockRegion).shouldForceSplit(); + conf.set(HConstants.HBASE_REGION_SPLIT_POLICY_KEY, + IncreasingToUpperBoundRegionSplitPolicy.class.getName()); + policy = (IncreasingToUpperBoundRegionSplitPolicy) RegionSplitPolicy.create(mockRegion, conf); + assertFalse(policy.shouldSplit()); + Mockito.doReturn(true).when(mockRegion).shouldForceSplit(); + assertFalse(policy.shouldSplit()); + } + @Test public void testIncreasingToUpperBoundRegionSplitPolicy() throws IOException { // Configure IncreasingToUpperBoundRegionSplitPolicy as our split policy