HBASE-14591 Region with reference hfile may split after a forced split in IncreasingToUpperBoundRegionSplitPolicy

This commit is contained in:
Liu Shaohui 2015-10-14 10:14:50 +08:00
parent 4754e583f9
commit 0e41dc18c0
2 changed files with 30 additions and 4 deletions

View File

@ -67,9 +67,7 @@ public class IncreasingToUpperBoundRegionSplitPolicy extends ConstantSizeRegionS
@Override @Override
protected boolean shouldSplit() { protected boolean shouldSplit() {
if (region.shouldForceSplit()) { boolean force = region.shouldForceSplit();
return true;
}
boolean foundABigStore = false; boolean foundABigStore = false;
// Get count of regions that have the same common table as this.region // Get count of regions that have the same common table as this.region
int tableRegionsCount = getCountOfCommonTableRegions(); int tableRegionsCount = getCountOfCommonTableRegions();
@ -93,7 +91,7 @@ public class IncreasingToUpperBoundRegionSplitPolicy extends ConstantSizeRegionS
} }
} }
return foundABigStore; return foundABigStore | force;
} }
/** /**

View File

@ -61,6 +61,34 @@ public class TestRegionSplitPolicy {
Mockito.doReturn(stores).when(mockRegion).getStores(); 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 @Test
public void testIncreasingToUpperBoundRegionSplitPolicy() throws IOException { public void testIncreasingToUpperBoundRegionSplitPolicy() throws IOException {
// Configure IncreasingToUpperBoundRegionSplitPolicy as our split policy // Configure IncreasingToUpperBoundRegionSplitPolicy as our split policy