Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1161977) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -369,8 +369,12 @@ synchronized (regionsInTransition) { switch (data.getEventType()) { case RS_ZK_REGION_CLOSING: - if (isOnDeadServer(regionInfo, deadServers)) { - // If was on dead server, its closed now. Force to OFFLINE and this + // If zk node of the region was updated by a live server, + // we should skip this region and just add it into RIT. + if (isOnDeadServer(regionInfo, deadServers) + && (null == data.getOrigin() || !serverManager.isServerOnline(data + .getOrigin()))) { + // If was on dead server, its closed now. Force to OFFLINE and this // will get it reassigned if appropriate forceOffline(regionInfo, data); } else { @@ -418,8 +422,10 @@ "assigned elsewhere"); break; } - if (isOnDeadServer(regionInfo, deadServers)) { - // If was on a dead server, then its not open any more; needs handling. + if (isOnDeadServer(regionInfo, deadServers) + && !serverManager.isServerOnline(sn)) { + // If was on a dead server, then its not open any more; needs + // handling. forceOffline(regionInfo, data); } else { new OpenedRegionHandler(master, this, regionInfo, sn).process(); @@ -1957,6 +1963,18 @@ Result result = region.getSecond(); // If region was in transition (was in zk) force it offline for reassign try { + RegionTransitionData data = ZKAssign.getData(watcher, + regionInfo.getEncodedName()); + + // If zk node of this region has been updated by a live server, + // we consider that this region is being handled. + // So we should skip it and process it in processRegionsInTransition. + if (data != null && data.getOrigin() != null + && serverManager.isServerOnline(data.getOrigin())) { + LOG.info("The region " + regionInfo.getEncodedName() + + "is being handled on " + data.getOrigin()); + continue; + } // Process with existing RS shutdown code boolean assign = ServerShutdownHandler.processDeadRegion(regionInfo, result, this,