You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ra...@apache.org on 2013/02/07 19:11:35 UTC
svn commit: r1443638 - in /hbase/branches/0.94/src:
main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java
Author: ramkrishna
Date: Thu Feb 7 18:11:35 2013
New Revision: 1443638
URL: http://svn.apache.org/r1443638
Log:
HBASE-7698 race between RS shutdown thread and openregionhandler causes region to get stuck (Ram)
Modified:
hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java
Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java?rev=1443638&r1=1443637&r2=1443638&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java Thu Feb 7 18:11:35 2013
@@ -84,6 +84,8 @@ public class OpenRegionHandler extends E
@Override
public void process() throws IOException {
+ boolean transitionToFailedOpen = false;
+ boolean openSuccessful = false;
try {
final String name = regionInfo.getRegionNameAsString();
if (this.server.isStopped() || this.rsServices.isStopping()) {
@@ -120,6 +122,7 @@ public class OpenRegionHandler extends E
this.rsServices.isStopping()) {
cleanupFailedOpen(region);
tryTransitionToFailedOpen(regionInfo);
+ transitionToFailedOpen = true;
return;
}
@@ -131,17 +134,21 @@ public class OpenRegionHandler extends E
// In case (a), the Master will process us as a dead server. In case
// (b) the region is already being handled elsewhere anyway.
cleanupFailedOpen(region);
+ transitionToFailedOpen = true;
return;
}
// Successful region open, and add it to OnlineRegions
this.rsServices.addToOnlineRegions(region);
-
+ openSuccessful = true;
// Done! Successful region open
LOG.debug("Opened " + name + " on server:" +
this.server.getServerName());
} finally {
this.rsServices.getRegionsInTransitionInRS().
remove(this.regionInfo.getEncodedNameAsBytes());
+ if (!openSuccessful && !transitionToFailedOpen) {
+ tryTransitionToFailedOpen(regionInfo);
+ }
}
}
@@ -359,7 +366,7 @@ public class OpenRegionHandler extends E
return region;
}
- private void cleanupFailedOpen(final HRegion region) throws IOException {
+ void cleanupFailedOpen(final HRegion region) throws IOException {
if (region != null) region.close();
}
Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java?rev=1443638&r1=1443637&r2=1443638&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/handler/TestOpenRegionHandler.java Thu Feb 7 18:11:35 2013
@@ -178,6 +178,35 @@ public class TestOpenRegionHandler {
assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, data.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 {
+ 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
+ }
+ RegionTransitionData data =
+ ZKAssign.getData(server.getZooKeeper(), TEST_HRI.getEncodedName());
+ assertEquals(EventType.RS_ZK_REGION_FAILED_OPEN, data.getEventType());
+ }
+
@org.junit.Rule
public org.apache.hadoop.hbase.ResourceCheckerJUnitRule cu =