Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (revision 1158621) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (working copy) @@ -326,7 +326,8 @@ synchronized (regionsInTransition) { switch (data.getEventType()) { case RS_ZK_REGION_CLOSING: - if (isOnDeadServer(regionInfo, deadServers)) { + if (isOnDeadServer(regionInfo, deadServers) && + (null == data.getServerName() || !serverManager.isServerOnline(data.getServerName()))){ // If was on dead server, its closed now. Force to OFFLINE and this // will get it reassigned if appropriate forceOffline(regionInfo, data); @@ -372,7 +373,8 @@ "; letting RIT timeout so will be assigned elsewhere"); break; } - if (isOnDeadServer(regionInfo, deadServers)) { + if (isOnDeadServer(regionInfo, deadServers) && + (null == data.getServerName() || !serverManager.isServerOnline(data.getServerName()))) { // If was on a dead server, then its not open any more; needs handling. forceOffline(regionInfo, data); } else { @@ -1640,6 +1642,16 @@ boolean assign = ServerShutdownHandler.processDeadRegion(regionInfo, result, this, this.catalogTracker); + RegionTransitionData data = ZKAssign.getData(watcher, regionInfo.getEncodedName()); + + //Online region server is processing + if (data != null && data.getServerName() != null && + serverManager.isServerOnline(data.getServerName())){ + LOG.info("The region " + regionInfo.getEncodedName() + + "is processing by " + data.getServerName()); + continue; + } + if (assign) { ZKAssign.createOrForceNodeOffline(watcher, regionInfo, master.getServerName()); Index: src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (revision 1158621) +++ src/main/java/org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java (working copy) @@ -83,6 +83,9 @@ if (region != null) { LOG.warn("Attempted open of " + name + " but already online on this server"); + + //Master will assign to other region server, so we need close this one. + cleanupFailedOpen(region); return; }