Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (revision 1388447) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (working copy) @@ -283,6 +283,7 @@ if (!testing) { services.removeFromOnlineRegions(this.parent.getRegionInfo().getEncodedName(), null); } + this.journal.add(JournalEntry.OFFLINED_PARENT); // TODO: If splitStoreFiles were multithreaded would we complete steps in @@ -590,6 +591,10 @@ // there's files to split. It then fires up everything, waits for // completion and finally checks for any exception int nbFiles = hstoreFilesToSplit.size(); + if (0 == nbFiles) { + LOG.info("No store files to split for the region "+this.parent.getRegionInfo()); + nbFiles = 1; + } ThreadFactoryBuilder builder = new ThreadFactoryBuilder(); builder.setNameFormat("StoreFileSplitter-%1$d"); ThreadFactory factory = builder.build(); Index: hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java (revision 1388447) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransaction.java (working copy) @@ -292,6 +292,48 @@ assertTrue("Rollback hooks should be called.", wasRollBackHookCalled()); } + @Test + public void testIfStoreFilesIsZeroShouldSuccessfullyCompleteSplit() throws Exception { + // Start transaction w/o loading entries . + SplitTransaction st = prepareGOOD_SPLIT_ROW(); + + // Run the execute. Look at what it returns. + Server mockServer = Mockito.mock(Server.class); + when(mockServer.getConfiguration()).thenReturn(TEST_UTIL.getConfiguration()); + PairOfSameType daughters = st.execute(mockServer, null); + // Do some assertions about execution. + assertTrue(this.fs.exists(st.getSplitDir())); + // Assert the parent region is closed. + assertTrue(this.parent.isClosed()); + + // Assert splitdir is empty -- because its content will have been moved out + // to be under the daughter region dirs. + assertEquals(0, this.fs.listStatus(st.getSplitDir()).length); + // Check daughters have correct key span. + assertTrue(Bytes.equals(this.parent.getStartKey(), daughters.getFirst().getStartKey())); + assertTrue(Bytes.equals(GOOD_SPLIT_ROW, daughters.getFirst().getEndKey())); + assertTrue(Bytes.equals(daughters.getSecond().getStartKey(), GOOD_SPLIT_ROW)); + assertTrue(Bytes.equals(this.parent.getEndKey(), daughters.getSecond().getEndKey())); + // Count rows. + int daughtersCount = 0; + + for (HRegion r : daughters) { + // Opening of region should be successful. + HRegion openRegion = HRegion.openHRegion(this.testdir, r.getRegionInfo(), r.getTableDesc(), + r.getLog(), TEST_UTIL.getConfiguration()); + try { + daughtersCount++; + } finally { + openRegion.close(); + openRegion.getLog().closeAndDelete(); + } + } + assertEquals(2, daughtersCount); + // Assert the write lock is no longer held on parent + assertTrue(!this.parent.lock.writeLock().isHeldByCurrentThread()); + + } + private boolean wasRollBackHookCalled(){ return (preRollBackCalled && postRollBackCalled); }