Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (revision 1441742) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (working copy) @@ -87,6 +87,7 @@ @Override public void process() throws IOException { boolean openSuccessful = false; + boolean transitionToFailedOpen = false; final String regionName = regionInfo.getRegionNameAsString(); try { @@ -129,7 +130,7 @@ // processing needs to do a close as part of cleanup. HRegion region = openRegion(); if (region == null) { - tryTransitionFromOpeningToFailedOpen(regionInfo); + tryTransitionFromOpeningToFailedOpen(regionInfo, transitionToFailedOpen); return; } boolean failed = true; @@ -141,7 +142,7 @@ if (failed || this.server.isStopped() || this.rsServices.isStopping()) { cleanupFailedOpen(region); - tryTransitionFromOpeningToFailedOpen(regionInfo); + tryTransitionFromOpeningToFailedOpen(regionInfo, transitionToFailedOpen); return; } @@ -153,7 +154,7 @@ // OR (c) someone cancelled the open // In all cases, we try to transition to failed_open to be safe. cleanupFailedOpen(region); - tryTransitionFromOpeningToFailedOpen(regionInfo); + tryTransitionFromOpeningToFailedOpen(regionInfo, transitionToFailedOpen); return; } @@ -197,6 +198,8 @@ " should be closed is now opened." ); } + } else if (transitionToFailedOpen == false) { + tryTransitionFromOpeningToFailedOpen(regionInfo, transitionToFailedOpen); } } } @@ -352,9 +355,11 @@ /** * This is not guaranteed to succeed, we just do our best. * @param hri Region we're working on. + * @param transitionToFailedOpen * @return whether znode is successfully transitioned to FAILED_OPEN state. */ - private boolean tryTransitionFromOpeningToFailedOpen(final HRegionInfo hri) { + private boolean tryTransitionFromOpeningToFailedOpen(final HRegionInfo hri, + boolean transitionToFailedOpen) { boolean result = false; final String name = hri.getRegionNameAsString(); try { @@ -376,6 +381,7 @@ LOG.error("Failed transitioning node " + name + " from OPENING to FAILED_OPEN", e); } + transitionToFailedOpen = true; return result; } @@ -455,7 +461,7 @@ return region; } - private void cleanupFailedOpen(final HRegion region) throws IOException { + void cleanupFailedOpen(final HRegion region) throws IOException { if (region != null) region.close(); } Index: hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java (revision 1441742) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java (working copy) @@ -184,6 +184,41 @@ assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType()); } + @Test + public void testTransitionToFailedOpenEvenIfCleanupFails() throws Exception { + Server server = new MockServer(HTU); + RegionServerServices rsServices = new MockRegionServerServices(); + // Create it OFFLINE, which is what it expects + ZKAssign.createNodeOffline(server.getZooKeeper(), TEST_HRI, + server.getServerName()); + + // Create the handler + OpenRegionHandler handler = new OpenRegionHandler(server, rsServices, + TEST_HRI, TEST_HTD) { + @Override + boolean updateMeta(HRegion r) { + return false; + }; + + @Override + void cleanupFailedOpen(HRegion region) throws IOException { + // TODO Auto-generated method stub + throw new IOException("FileSystem got closed."); + } + + }; + rsServices.getRegionsInTransitionInRS().put( + TEST_HRI.getEncodedNameAsBytes(), Boolean.TRUE); + try { + handler.process(); + } catch (Exception e) { + // Ignore the IOException that we have thrown from cleanupFailedOpen + } + RegionTransition rt = RegionTransition.parseFrom(ZKAssign.getData( + server.getZooKeeper(), TEST_HRI.getEncodedName())); + assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, rt.getEventType()); + } + }