You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2012/07/08 21:21:54 UTC

svn commit: r1358821 - in /hbase/branches/0.94/src: main/java/org/apache/hadoop/hbase/regionserver/ test/java/org/apache/hadoop/hbase/regionserver/

Author: larsh
Date: Sun Jul  8 19:21:53 2012
New Revision: 1358821

URL: http://svn.apache.org/viewvc?rev=1358821&view=rev
Log:
HBASE-6329 Stopping META regionserver when splitting region could cause daughter region to be assigned twice (chunhui shen)

Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java
    hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1358821&r1=1358820&r2=1358821&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Sun Jul  8 19:21:53 2012
@@ -783,6 +783,11 @@ public class HRegionServer implements HR
       this.hbaseMaster = null;
     }
     this.leases.close();
+
+    if (!killed) {
+      join();
+    }
+
     try {
       deleteMyEphemeralNode();
     } catch (KeeperException e) {
@@ -792,9 +797,6 @@ public class HRegionServer implements HR
     LOG.info("stopping server " + this.serverNameFromMasterPOV +
       "; zookeeper connection closed.");
 
-    if (!killed) {
-      join();
-    }
     LOG.info(Thread.currentThread().getName() + " exiting");
   }
 
@@ -1616,6 +1618,7 @@ public class HRegionServer implements HR
   public void postOpenDeployTasks(final HRegion r, final CatalogTracker ct,
       final boolean daughter)
   throws KeeperException, IOException {
+    checkOpen();
     LOG.info("Post open deploy tasks for region=" + r.getRegionNameAsString() +
       ", daughter=" + daughter);
     // Do checks to see if we need to compact (references or too many files)

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java?rev=1358821&r1=1358820&r2=1358821&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitRequest.java Sun Jul  8 19:21:53 2012
@@ -67,6 +67,13 @@ class SplitRequest implements Runnable {
         st.execute(this.server, this.server);
         this.server.getMetrics().incrementSplitSuccessCount();
       } catch (Exception e) {
+        if (this.server.isStopping() || this.server.isStopped()) {
+          LOG.info(
+              "Skip rollback/cleanup of failed split of "
+                  + parent.getRegionNameAsString() + " because server is"
+                  + (this.server.isStopping() ? " stopping" : " stopped"), e);
+          return;
+        }
         try {
           LOG.info("Running rollback/cleanup of failed split of " +
             parent.getRegionNameAsString() + "; " + e.getMessage(), e);

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java?rev=1358821&r1=1358820&r2=1358821&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/SplitTransaction.java Sun Jul  8 19:21:53 2012
@@ -341,11 +341,6 @@ public class SplitTransaction {
     boolean stopping = services != null && services.isStopping();
     // TODO: Is this check needed here?
     if (stopped || stopping) {
-      // add 2nd daughter first (see HBASE-4335)
-      MetaEditor.addDaughter(server.getCatalogTracker(),
-          b.getRegionInfo(), services.getServerName());
-      MetaEditor.addDaughter(server.getCatalogTracker(),
-          a.getRegionInfo(), services.getServerName());
       LOG.info("Not opening daughters " +
           b.getRegionInfo().getRegionNameAsString() +
           " and " +
@@ -396,7 +391,8 @@ public class SplitTransaction {
    * @param a second daughter region
    * @throws IOException If thrown, transaction failed. Call {@link #rollback(Server, RegionServerServices)}
    */
-  /* package */void transitionZKNode(final Server server, HRegion a, HRegion b)
+  /* package */void transitionZKNode(final Server server,
+      final RegionServerServices services, HRegion a, HRegion b)
       throws IOException {
     // Tell master about split by updating zk.  If we fail, abort.
     if (server != null && server.getZooKeeper() != null) {
@@ -420,7 +416,8 @@ public class SplitTransaction {
             parent.getRegionInfo(), a.getRegionInfo(), b.getRegionInfo(),
             server.getServerName(), this.znodeVersion);
           spins++;
-        } while (this.znodeVersion != -1);
+        } while (this.znodeVersion != -1 && !server.isStopped()
+            && !services.isStopping());
       } catch (Exception e) {
         if (e instanceof InterruptedException) {
           Thread.currentThread().interrupt();
@@ -454,7 +451,7 @@ public class SplitTransaction {
   throws IOException {
     PairOfSameType<HRegion> regions = createDaughters(server, services);
     openDaughters(server, services, regions.getFirst(), regions.getSecond());
-    transitionZKNode(server, regions.getFirst(), regions.getSecond());
+    transitionZKNode(server, services, regions.getFirst(), regions.getSecond());
     return regions;
   }
 

Modified: hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java?rev=1358821&r1=1358820&r2=1358821&view=diff
==============================================================================
--- hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java (original)
+++ hbase/branches/0.94/src/test/java/org/apache/hadoop/hbase/regionserver/TestEndToEndSplitTransaction.java Sun Jul  8 19:21:53 2012
@@ -132,7 +132,8 @@ public class TestEndToEndSplitTransactio
     assertTrue(test(con, tableName, lastRow, server));
 
     // 4. phase III
-    split.transitionZKNode(server, regions.getFirst(), regions.getSecond());
+    split.transitionZKNode(server, server, regions.getFirst(),
+        regions.getSecond());
     assertTrue(test(con, tableName, firstRow, server));
     assertTrue(test(con, tableName, lastRow, server));
   }