Index: src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (版本 1141455) +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java (工作副本) @@ -705,9 +705,16 @@ HServerInfo hsiWithoutLoad = new HServerInfo( serverInfo.getServerAddress(), serverInfo.getStartCode(), serverInfo.getInfoPort(), serverInfo.getHostname()); - this.regions.put(regionInfo, hsiWithoutLoad); - addToServers(hsiWithoutLoad, regionInfo); - this.regions.notifyAll(); + + if (isServerOnline(hsiWithoutLoad.getServerName())) { + this.regions.put(regionInfo, hsiWithoutLoad); + addToServers(hsiWithoutLoad, regionInfo); + this.regions.notifyAll(); + } else { + LOG.info("The server is not in online servers, waiting to unassign, " + + "ServerName=" + hsiWithoutLoad.getServerName() + ", region=" + + regionInfo.getEncodedName()); + } } // Remove plan if one. clearRegionPlan(regionInfo); @@ -2156,4 +2163,11 @@ public void stop() { this.timeoutMonitor.interrupt(); } + + /** + * Check whether the RegionServer is online. + */ + public boolean isServerOnline(String serverName) { + return this.serverManager.isServerOnline(serverName); + } } Index: src/main/java/org/apache/hadoop/hbase/master/handler/OpenedRegionHandler.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/handler/OpenedRegionHandler.java (版本 1141455) +++ src/main/java/org/apache/hadoop/hbase/master/handler/OpenedRegionHandler.java (工作副本) @@ -99,11 +99,17 @@ LOG.warn("Skipping the onlining of " + regionInfo.getRegionNameAsString() + " because regions is NOT in RIT -- presuming this is because it SPLIT"); } + String serverName = this.serverInfo.getServerName(); if (this.assignmentManager.getZKTable().isDisablingOrDisabledTable( regionInfo.getTableDesc().getNameAsString())) { LOG.debug("Opened region " + regionInfo.getRegionNameAsString() + " but " + "this table is disabled, triggering close of region"); assignmentManager.unassign(regionInfo); + } else if (!this.assignmentManager.isServerOnline(serverName)) { + LOG.debug("The server is not in online servers, then close the region, " + + "ServerName=" + serverName + ", region=" + + this.regionInfo.getEncodedName()); + assignmentManager.unassign(regionInfo); } else { LOG.debug("Opened region " + regionInfo.getRegionNameAsString() + " on " + serverInfo.getServerName());