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 =