Index: hbase-server/src/test/java/org/apache/hadoop/hbase/TestFullLogReconstruction.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/TestFullLogReconstruction.java (revision 1519102) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/TestFullLogReconstruction.java (working copy) @@ -55,7 +55,7 @@ c.setInt("ipc.client.connect.max.retries", 1); c.setInt("dfs.client.block.recovery.retries", 1); c.setInt(HConstants.ZK_SESSION_TIMEOUT, 1000); - TEST_UTIL.startMiniCluster(2); + TEST_UTIL.startMiniCluster(3); } /** 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 1519102) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java (working copy) @@ -127,6 +127,11 @@ } finally { HRegion.closeHRegion(region); } + // Region server is expected to abort due to the znode disappearing underneath it + // This was corresponding to the second handler.process() call above. + // The disappearance of znode is different from master removing it on successful open + // because OpenRegionHandler didn't have a chance to update the znode with OPENED state + assertTrue("region server should have aborted", rss.isAborted()); } @Test Index: hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java =================================================================== --- hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java (revision 1519102) +++ hbase-server/src/test/java/org/apache/hadoop/hbase/MockRegionServerServices.java (working copy) @@ -55,6 +55,7 @@ private ZooKeeperWatcher zkw = null; private ServerName serverName = null; private RpcServerInterface rpcServer = null; + private volatile boolean abortRequested; MockRegionServerServices(ZooKeeperWatcher zkw) { this.zkw = zkw; @@ -154,7 +155,8 @@ @Override public void abort(String why, Throwable e) { - //no-op + this.abortRequested = true; + stop(why); } @Override @@ -169,7 +171,7 @@ @Override public boolean isAborted() { - return false; + return this.abortRequested; } @Override 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 1519102) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (working copy) @@ -35,6 +35,7 @@ import org.apache.hadoop.hbase.regionserver.RegionServerServices; import org.apache.hadoop.hbase.util.CancelableProgressable; import org.apache.hadoop.hbase.zookeeper.ZKAssign; +import org.apache.hadoop.hbase.zookeeper.ZKUtil; import org.apache.zookeeper.KeeperException; /** @@ -401,9 +402,19 @@ EventType.RS_ZK_REGION_OPENING, EventType.RS_ZK_REGION_FAILED_OPEN, this.version) == -1) { - LOG.warn("Unable to mark region " + hri + " as FAILED_OPEN. " + + String warnMsg = "Unable to mark region " + hri + " as FAILED_OPEN. " + "It's likely that the master already timed out this open " + - "attempt, and thus another RS already has the region."); + "attempt, and thus another RS already has the region."; + try { + String node = ZKAssign.getNodeName(this.server.getZooKeeper(), hri.getEncodedName()); + if (ZKUtil.checkExists(this.server.getZooKeeper(), node) < 0) { + rsServices.abort(warnMsg, null); + } else { + LOG.warn(warnMsg); + } + } catch (KeeperException ke) { + rsServices.abort(warnMsg, ke); + } } else { result = true; }