Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1388823) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -1125,9 +1125,13 @@ if (rs != null) { HRegionInfo regionInfo = rs.getRegion(); if (rs.isSplit()) { - LOG.debug("Ephemeral node deleted, regionserver crashed?, " + - "clearing from RIT; rs=" + rs); + LOG.debug("Ephemeral node deleted, regionserver crashed?, offlining the region" + + rs.getRegion() + "clearing from RIT; rs=" + rs); regionOffline(rs.getRegion()); + } else if (rs.isSplitting()) { + LOG.debug("Ephemeral node deleted. Found in SPLIITING state. " + "Removing from RIT " + + rs.getRegion()); + this.regionsInTransition.remove(regionName); } else { LOG.debug("The znode of region " + regionInfo.getRegionNameAsString() + " has been deleted."); Index: src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (revision 1388823) +++ src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (working copy) @@ -539,7 +539,7 @@ * to create it. * @see #cleanupSplitDir(FileSystem, Path) */ - private static void createSplitDir(final FileSystem fs, final Path splitdir) + void createSplitDir(final FileSystem fs, final Path splitdir) throws IOException { if (fs.exists(splitdir)) { LOG.info("The " + splitdir Index: src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java =================================================================== --- src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java (revision 1388823) +++ src/test/java/org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java (working copy) @@ -27,16 +27,20 @@ import java.io.IOException; import java.util.List; +import java.util.NavigableMap; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.FileSystem; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.*; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.executor.EventHandler.EventType; import org.apache.hadoop.hbase.executor.RegionTransitionData; +import org.apache.hadoop.hbase.master.AssignmentManager.RegionState; import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.master.handler.SplitRegionHandler; import org.apache.hadoop.hbase.util.Bytes; @@ -587,6 +591,57 @@ } } + @Test + public void testShouldClearRITWhenNodeFoundInSplittingState() throws Exception { + final byte[] tableName = Bytes.toBytes("testShouldClearRITWhenNodeFoundInSplittingState"); + HBaseAdmin admin = new HBaseAdmin(TESTING_UTIL.getConfiguration()); + try { + // Create table then get the single region for our new table. + HTableDescriptor htd = new HTableDescriptor(tableName); + htd.addFamily(new HColumnDescriptor("cf")); + admin.createTable(htd); + + List regions = cluster.getRegions(tableName); + int regionServerIndex = cluster.getServerWith(regions.get(0).getRegionName()); + HRegionServer regionServer = cluster.getRegionServer(regionServerIndex); + SplitTransaction st = null; + + st = new MockedSplitTransaction(regions.get(0), null) { + @Override + void createSplitDir(FileSystem fs, Path splitdir) throws IOException { + throw new IOException(""); + } + }; + + try { + st.execute(regionServer, regionServer); + } catch (IOException e) { + String node = ZKAssign.getNodeName(regionServer.getZooKeeper(), regions.get(0) + .getRegionInfo().getEncodedName()); + + assertFalse(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1); + NavigableMap regionsInTransition = cluster + .getMaster().getAssignmentManager().getRegionsInTransition(); + RegionState regionState = regionsInTransition.get(regions.get(0).getRegionInfo() + .getEncodedName()); + assertTrue(regionState.getState() == RegionState.State.SPLITTING); + assertTrue(st.rollback(regionServer, regionServer)); + assertTrue(ZKUtil.checkExists(regionServer.getZooKeeper(), node) == -1); + regionsInTransition = cluster.getMaster().getAssignmentManager() + .getRegionsInTransition(); + while (regionsInTransition.containsKey(regions.get(0).getRegionInfo().getEncodedName())) { + // Just in case the nodeDeleted event did not get executed. + Thread.sleep(200); + } + } + } finally { + if (admin.isTableAvailable(tableName) && admin.isTableEnabled(tableName)) { + admin.disableTable(tableName); + admin.deleteTable(tableName); + } + } + } + public static class MockedSplitTransaction extends SplitTransaction { public MockedSplitTransaction(HRegion r, byte[] splitrow) {