You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2010/04/29 03:23:08 UTC

svn commit: r939157 - in /hadoop/hbase/trunk: CHANGES.txt core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java

Author: jdcryans
Date: Thu Apr 29 01:23:07 2010
New Revision: 939157

URL: http://svn.apache.org/viewvc?rev=939157&view=rev
Log:
HBASE-2499  Race condition when disabling a table leaves regions in transition

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

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=939157&r1=939156&r2=939157&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Thu Apr 29 01:23:07 2010
@@ -295,6 +295,7 @@ Release 0.21.0 - Unreleased
                master.jsp moved under webapps/master(Cristian Ivascu via Stack)
    HBASE-2487  Uncaught exceptions in receiving IPC responses orphan clients
                (Todd Lipcon via Stack)
+   HBASE-2499  Race condition when disabling a table leaves regions in transition
 
   IMPROVEMENTS
    HBASE-1760  Cleanup TODOs in HTable

Modified: hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java?rev=939157&r1=939156&r2=939157&view=diff
==============================================================================
--- hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java (original)
+++ hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/ChangeTableState.java Thu Apr 29 01:23:07 2010
@@ -23,7 +23,9 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.client.Delete;
+import org.apache.hadoop.hbase.client.Get;
 import org.apache.hadoop.hbase.client.Put;
+import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.ipc.HRegionInterface;
 import org.apache.hadoop.hbase.util.Writables;
 
@@ -85,13 +87,17 @@ class ChangeTableState extends TableOper
         continue;
       }
 
-      // Update meta table
-      Put put = updateRegionInfo(i);
-      server.put(m.getRegionName(), put);
-      Delete delete = new Delete(i.getRegionName());
-      delete.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER);
-      delete.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER);
-      server.delete(m.getRegionName(), delete);
+      // If it's already offline then don't set it a second/third time, skip
+      // Same for online, don't set again if already online
+      if (!(i.isOffline() && !online) && !(!i.isOffline() && online)) {
+        // Update meta table
+        Put put = updateRegionInfo(i);
+        server.put(m.getRegionName(), put);
+        Delete delete = new Delete(i.getRegionName());
+        delete.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER);
+        delete.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER);
+        server.delete(m.getRegionName(), delete);
+      }
       if (LOG.isDebugEnabled()) {
         LOG.debug("Removed server and startcode from row and set online=" +
           this.online + ": " + i.getRegionNameAsString());
@@ -124,6 +130,15 @@ class ChangeTableState extends TableOper
 
         // Cause regions being served to be taken off-line and disabled
         for (HRegionInfo i: e.getValue()) {
+          // The scan we did could be totally staled, get the freshest data
+          Get get = new Get(i.getRegionName());
+          get.addColumn(CATALOG_FAMILY, SERVER_QUALIFIER);
+          Result values = server.get(m.getRegionName(), get);
+          String serverAddress = BaseScanner.getServerAddress(values);
+          // If this region is unassigned, skip!
+          if(serverAddress.length() == 0) {
+            continue;
+          }
           if (LOG.isDebugEnabled()) {
             LOG.debug("Adding region " + i.getRegionNameAsString() +
               " to setClosing list");