Index: src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (revision 1206051) +++ src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (working copy) @@ -24,7 +24,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.Server; @@ -110,10 +109,14 @@ tryTransitionToFailedOpen(regionInfo); return; } - boolean failed = true; if (tickleOpening("post_region_open")) { - if (updateMeta(region)) failed = false; + // Just update .META. table ,but not add it to online regions. + // We shouldn't serve this region before master receive region opened + // message. + if (updateMeta(region)) { + failed = false; + } } if (failed || this.server.isStopped() || this.rsServices.isStopping()) { @@ -132,6 +135,8 @@ cleanupFailedOpen(region); return; } + // Successful region open, add it to OnlineRegions + this.rsServices.addToOnlineRegions(region); // Done! Successful region open LOG.debug("Opened " + name + " on server:" + @@ -212,9 +217,11 @@ } /** - * Thread to run region post open tasks. Call {@link #getException()} after - * the thread finishes to check for exceptions running - * {@link RegionServerServices#postOpenDeployTasks(HRegion, org.apache.hadoop.hbase.catalog.CatalogTracker, boolean)}. + * Thread to run region post open tasks, excluding addToOnlineRegions. Call + * {@link #getException()} after the thread finishes to check for exceptions + * running + * {@link RegionServerServices#postOpenDeployTasks(HRegion, org.apache.hadoop.hbase.catalog.CatalogTracker, boolean)} + * . */ static class PostOpenDeployTasksThread extends Thread { private Exception exception = null; @@ -237,6 +244,11 @@ try { this.services.postOpenDeployTasks(this.region, this.server.getCatalogTracker(), false); + // We shouldn't serve this region before master receive region opened + // message. We remove it from OnlineRegions for the moment and add it in + // the end of openRegionHanlder + this.services.removeFromOnlineRegions(region.getRegionInfo() + .getEncodedName()); } catch (Exception e) { LOG.warn("Exception running postOpenDeployTasks; region=" + this.region.getRegionInfo().getEncodedName(), e);