You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/07/30 06:57:44 UTC

svn commit: r980649 - in /hbase/trunk: CHANGES.txt src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java

Author: stack
Date: Fri Jul 30 04:57:44 2010
New Revision: 980649

URL: http://svn.apache.org/viewvc?rev=980649&view=rev
Log:
HBASE-2755 Duplicate assignment of a region after region server recovery

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=980649&r1=980648&r2=980649&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Jul 30 04:57:44 2010
@@ -461,6 +461,8 @@ Release 0.21.0 - Unreleased
    HBASE-2884  TestHFileOutputFormat flaky when map tasks generate identical
                data
    HBASE-2890  Initialize RPC JMX metrics on startup (Gary Helmling via Stack)
+   HBASE-2755  Duplicate assignment of a region after region server recovery
+               (Kannan Muthukkaruppan via Stack)
 
   IMPROVEMENTS
    HBASE-1760  Cleanup TODOs in HTable

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java?rev=980649&r1=980648&r2=980649&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/BaseScanner.java Fri Jul 30 04:57:44 2010
@@ -194,7 +194,7 @@ abstract class BaseScanner extends Chore
         long startCode = getStartCode(values);
 
         // Note Region has been assigned.
-        checkAssigned(regionServer, region, info, serverAddress, startCode);
+        checkAssigned(regionServer, region, info, serverAddress, startCode, true);
         if (isSplitParent(info)) {
           splitParents.put(info, values);
         }
@@ -533,12 +533,15 @@ abstract class BaseScanner extends Chore
    * @param info
    * @param hostnameAndPort hostname ':' port as it comes out of .META.
    * @param startCode
+   * @param checkTwice should we check twice before adding a region
+   * to unassigned pool.              
    * @throws IOException
    */
   protected void checkAssigned(final HRegionInterface regionServer,
     final MetaRegion meta, final HRegionInfo info,
-    final String hostnameAndPort, final long startCode)
+    final String hostnameAndPort, final long startCode, boolean checkTwice)
   throws IOException {
+    boolean tryAgain = false;
     String serverName = null;
     String sa = hostnameAndPort;
     long sc = startCode;
@@ -575,16 +578,31 @@ abstract class BaseScanner extends Chore
       // If we can't find the HServerInfo, then add it to the list of
       //  unassigned regions.
       if (storedInfo == null) {
-        // The current assignment is invalid
-        if (LOG.isDebugEnabled()) {
-          LOG.debug("Current assignment of " + info.getRegionNameAsString() +
-            " is not valid; " + " serverAddress=" + sa +
-            ", startCode=" + sc + " unknown.");
+        if (checkTwice) {
+          tryAgain = true;
+        } else {
+          if (LOG.isDebugEnabled()) {
+            LOG.debug("Current assignment of " + info.getRegionNameAsString() +
+              " is not valid; " + " serverAddress=" + sa +
+              ", startCode=" + sc + " unknown.");
+          }
+          // Now get the region assigned
+          this.master.getRegionManager().setUnassigned(info, true);
         }
-        // Now get the region assigned
-        this.master.getRegionManager().setUnassigned(info, true);
       }
     }
+    if (tryAgain) {
+      // The current assignment is invalid. But we need to try again.
+      if (LOG.isDebugEnabled()) {
+        LOG.debug("Current assignment of " + info.getRegionNameAsString() +
+          " is not valid; " + " serverAddress=" + sa +
+          ", startCode=" + sc + " unknown; checking once more!");
+      }
+      // passing null for hostNameAndPort will force the function
+      // to reget the assignment from META and protect against
+      // double assignment race conditions (HBASE-2755).
+      checkAssigned(regionServer, meta, info, null, 0, false);
+    }
   }
 
   /**