Author: jdcryans
Date: Thu Sep 15 23:50:53 2011
New Revision: 1171330

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

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

Modified: hbase/branches/0.90/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.90/CHANGES.txt?rev=1171330&r1=1171329&r2=1171330&view=diff
==============================================================================
--- hbase/branches/0.90/CHANGES.txt (original)
+++ hbase/branches/0.90/CHANGES.txt Thu Sep 15 23:50:53 2011
@@ -44,6 +44,7 @@ Release 0.90.5 - Unreleased
                to contact the sink (JD and Lars Hofhansl)
    HBASE-4390  [replication] ReplicationSource's UncaughtExceptionHandler
                shouldn't join
+   HBASE-4395  EnableTableHandler races with itself
 
   IMPROVEMENT
    HBASE-4205  Enhance HTable javadoc (Eric Charles)

Modified: 
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
URL: 
http://svn.apache.org/viewvc/hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java?rev=1171330&r1=1171329&r2=1171330&view=diff
==============================================================================
--- 
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
 (original)
+++ 
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/master/handler/EnableTableHandler.java
 Thu Sep 15 23:50:53 2011
@@ -83,34 +83,30 @@ 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 online.");
-      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 disabled.
+    // Flip the table to enabled.
     if (done) 
this.assignmentManager.getZKTable().setEnabledTable(this.tableNameStr);
     LOG.info("Enabled table is done=" + done);
   }
@@ -163,10 +159,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