diff -u -rw before/HMaster.java after/HMaster.java --- before/HMaster.java 2010-05-04 23:45:38.000000000 -0700 +++ after/HMaster.java 2010-05-05 14:41:34.000000000 -0700 @@ -428,14 +428,17 @@ break; } } - boolean doDelayQueue = this.regionManager.getRootRegionLocation() != null; - switch (this.regionServerOperationQueue.process(doDelayQueue)) { + final HServerAddress root = this.regionManager.getRootRegionLocation(); + switch (this.regionServerOperationQueue.process(root)) { case FAILED: + // If FAILED op processing, bad. Exit. break FINISHED; case REQUEUED_BUT_PROBLEM: if (!checkFileSystem()) + // If bad filesystem, exit. break FINISHED; - default: // PROCESSED, NOOP, REQUEUED: + default: + // Continue run loop if conditions are PROCESSED, NOOP, REQUEUED break; } } diff -u -rw before/RegionServerOperationQueue.java after/RegionServerOperationQueue.java --- before/RegionServerOperationQueue.java 2010-05-04 23:46:02.000000000 -0700 +++ after/RegionServerOperationQueue.java 2010-05-05 14:43:05.000000000 -0700 @@ -14,6 +14,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HMsg; import org.apache.hadoop.hbase.HServerInfo; +import org.apache.hadoop.hbase.HServerAddress; import org.apache.hadoop.hbase.RemoteExceptionHandler; import org.apache.hadoop.hbase.util.Sleeper; import org.apache.hadoop.ipc.RemoteException; @@ -90,19 +91,20 @@ /** * Try to get an operation off of the queue and process it. - * @param skipDelayedToDos If true, do not do delayed todos first but instead - * move straight to the current todos list. This is set when we want to be - * sure that recently queued events are processed first such as the onlining - * of root region (Root region needs to be online before we can do meta - * onlining; meta onlining needs to be done before we can do... and so on). + * @param rootRegionLocation Location of the root region. * @return {@link ProcessingResultCode#PROCESSED}, * {@link ProcessingResultCode#REQUEUED}, * {@link ProcessingResultCode#REQUEUED_BUT_PROBLEM} */ - public synchronized ProcessingResultCode process(final boolean skipDelayedToDos) { - RegionServerOperation op = delayedToDoQueue.poll(); + public synchronized ProcessingResultCode process(final HServerAddress rootRegionLocation) { + RegionServerOperation op = null; + // Only process the delayed queue if root region is online. If offline, + // the operation to put it online is probably in the toDoQueue. Process + // it first. + if (rootRegionLocation != null) { + op = delayedToDoQueue.poll(); + } else { // if there aren't any todo items in the queue, sleep for a bit. - if (op == null) { try { op = toDoQueue.poll(threadWakeFrequency, TimeUnit.MILLISECONDS); } catch (InterruptedException e) {