diff --git src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java index 38aada9..417628b 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java @@ -161,7 +161,9 @@ public class SplitTransaction { * false if it is not (e.g. its already closed, etc.). */ public boolean prepare() { - if (this.parent.isClosed() || this.parent.isClosing()) return false; + if (this.parent.isClosed() || this.parent.isClosing() || this.parent.hasReferences()) { + return false; + } // Split key can be null if this region is unsplittable; i.e. has refs. if (this.splitrow == null) return false; HRegionInfo hri = this.parent.getRegionInfo(); diff --git src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java index 408edc6..da1f2c2 100644 --- src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java @@ -19,6 +19,8 @@ */ package org.apache.hadoop.hbase.regionserver; +import com.google.common.collect.ImmutableList; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -142,6 +144,29 @@ public class TestSplitTransaction { } /** + * Pass a reference store + */ + @Test public void testPrepareWithRegionsWithReference() throws IOException { + // create a mock that will act as a reference StoreFile + StoreFile storeFileMock = Mockito.mock(StoreFile.class); + when(storeFileMock.isReference()).thenReturn(true); + + // add the mock to the parent stores + Store storeMock = Mockito.mock(Store.class); + List storeFileList = new ArrayList(1); + storeFileList.add(storeFileMock); + when(storeMock.getStorefiles()).thenReturn(storeFileList); + when(storeMock.close()).thenReturn(ImmutableList.copyOf(storeFileList)); + this.parent.stores.put(Bytes.toBytes(""), storeMock); + + SplitTransaction st = new SplitTransaction(this.parent, GOOD_SPLIT_ROW); + + assertFalse("a region should not be splittable if it has instances of store file references", + st.prepare()); + } + + + /** * Pass an unreasonable split row. */ @Test public void testPrepareWithBadSplitRow() throws IOException {