Author: jdcryans
Date: Thu Sep 15 23:51:00 2011
New Revision: 1171331

URL: http://svn.apache.org/viewvc?rev=1171331&view=rev
Log:
HBASE-4395  EnableTableHandler races with itself

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

Modified: hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1171331&r1=1171330&r2=1171331&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Thu Sep 15 23:51:00 2011
@@ -270,6 +270,7 @@ Release 0.91.0 - Unreleased
                to contact the sink (JD and Lars Hofhansl)
    HBASE-4390  [replication] ReplicationSource's UncaughtExceptionHandler
                shouldn't join
+   HBASE-4395  EnableTableHandler races with itself
 
   IMPROVEMENTS
    HBASE-3290  Max Compaction Size (Nicolas Spiegelberg via Stack)  

Modified: 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
URL: 
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java?rev=1171331&r1=1171330&r2=1171331&view=diff
==============================================================================
--- 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
 (original)
+++ 
hbase/trunk/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
 Thu Sep 15 23:51:00 2011
@@ -109,32 +109,28 @@ public class EnableTableHandler extends 
     // Set table enabling flag up in zk.
     this.assignmentManager.getZKTable().setEnablingTable(this.tableNameStr);
     boolean done = false;
-    while (true) {
-      // Get the regions of this table. We're done when all listed
-      // tables are onlined.
-      List<HRegionInfo> regionsInMeta =
-        MetaReader.getTableRegions(this.ct, tableName, true);
-      int countOfRegionsInTable = regionsInMeta.size();
-      List<HRegionInfo> regions = regionsToAssign(regionsInMeta);
-      if (regions.size() == 0) {
+    // Get the regions of this table. We're done when all listed
+    // tables are onlined.
+    List<HRegionInfo> regionsInMeta =
+      MetaReader.getTableRegions(this.ct, tableName, true);
+    int countOfRegionsInTable = regionsInMeta.size();
+    List<HRegionInfo> regions = regionsToAssign(regionsInMeta);
+    int regionsCount = regions.size();
+    if (regionsCount == 0) {
+      done = true;
+    }
+    LOG.info("Table has " + countOfRegionsInTable + " regions of which " +
+      regionsCount + " are offline.");
+    BulkEnabler bd = new BulkEnabler(this.server, regions,
+      countOfRegionsInTable);
+    try {
+      if (bd.bulkAssign()) {
         done = true;
-        break;
-      }
-      LOG.info("Table has " + countOfRegionsInTable + " regions of which " +
-        regions.size() + " are offline.");
-      BulkEnabler bd = new BulkEnabler(this.server, regions,
-        countOfRegionsInTable);
-      try {
-        if (bd.bulkAssign()) {
-          done = true;
-          break;
-        }
-      } catch (InterruptedException e) {
-        LOG.warn("Enable was interrupted");
-        // Preserve the interrupt.
-        Thread.currentThread().interrupt();
-        break;
       }
+    } catch (InterruptedException e) {
+      LOG.warn("Enable was interrupted");
+      // Preserve the interrupt.
+      Thread.currentThread().interrupt();
     }
     // Flip the table to enabled.
     if (done) this.assignmentManager.getZKTable().setEnabledTable(
@@ -191,10 +187,17 @@ public class EnableTableHandler extends 
       long startTime = System.currentTimeMillis();
       long remaining = timeout;
       List<HRegionInfo> regions = null;
+      int lastNumberOfRegions = this.countOfRegionsInTable;
       while (!server.isStopped() && remaining > 0) {
         Thread.sleep(waitingTimeForEvents);
         regions = assignmentManager.getRegionsOfTable(tableName);
         if (isDone(regions)) break;
+
+        // Punt on the timeout as long we make progress
+        if (regions.size() > lastNumberOfRegions) {
+          lastNumberOfRegions = regions.size();
+          timeout += waitingTimeForEvents;
+        }
         remaining = timeout - (System.currentTimeMillis() - startTime);
       }
       return isDone(regions);


Reply via email to