diff --git src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index 3c9973e..3db427d 100644 --- src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -2847,7 +2847,26 @@ public class AssignmentManager extends ZooKeeperListener { if (!nodes.isEmpty()) { for (String encodedRegionName : nodes) { - processRegionInTransition(encodedRegionName, null, deadServers); + + Stat stat = new Stat(); + RegionTransitionData data = ZKAssign.getDataAndWatch(watcher, encodedRegionName, stat); + if (data == null) continue; + HRegionInfo hri = getHRegionInfo(data); + if (hri == null) continue; + + // delete RITs if exists in any state of disabling or disabled tables during master starts + // up + if (!hri.isMetaTable()) { + String tableName = hri.getTableNameAsString(); + boolean disabled = this.zkTable.isDisabledTable(tableName); + if (disabled || this.zkTable.isDisablingTable(tableName)) { + ZKAssign.deleteNodeFailSilent(watcher, hri); + regionOffline(hri); + continue; + } + } + + processRegionsInTransition(data, hri, deadServers, stat.getVersion()); } } } diff --git src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java index 8b889f7..821311a 100644 --- src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java +++ src/main/java/org/apache/hadoop/hbase/master/handler/ServerShutdownHandler.java @@ -379,31 +379,37 @@ public class ServerShutdownHandler extends EventHandler { // If the table was partially disabled and the RS went down, we should clear the RIT // and remove the node for the region. The rit that we use may be stale in case the table // was in DISABLING state but though we did assign we will not be clearing the znode in - // CLOSING state. Doing this will have no harm. See HBASE-5927 - toAssign = checkForDisablingOrDisabledTables(ritsGoingToServer, toAssign, rit, assignmentManager); + // CLOSING state. Doing this will have no harm. The rit can be null if region server went + // down during master startup. + toAssign = + checkForDisablingOrDisabledTables(ritsGoingToServer, toAssign, rit, assignmentManager, + e.getKey()); } return toAssign; } private List checkForDisablingOrDisabledTables(Set regionsFromRIT, - List toAssign, RegionState rit, AssignmentManager assignmentManager) { - if (rit == null) { + List toAssign, RegionState rit, AssignmentManager assignmentManager, HRegionInfo hri) { + boolean disabling = assignmentManager.getZKTable().isDisablingTable(hri.getTableNameAsString()); + boolean disabled = assignmentManager.getZKTable().isDisabledTable(hri.getTableNameAsString()); + if (!disabling && !disabled) { return toAssign; } - if (!rit.isClosing() && !rit.isPendingClose()) { - return toAssign; + + try { + // If table is partially disabled then delete znode if exists in any state. + ZKAssign.deleteNodeFailSilent(services.getZooKeeper(), hri); + } catch (KeeperException ke) { + this.server.abort("Unexpected ZK exception deleting unassigned node " + hri, ke); + return null; } - if (!assignmentManager.getZKTable().isDisablingOrDisabledTable( - rit.getRegion().getTableNameAsString())) { - return toAssign; + if (rit != null) { + assignmentManager.regionOffline(hri); } - HRegionInfo hri = rit.getRegion(); - AssignmentManager am = assignmentManager; - am.deleteClosingOrClosedNode(hri); - am.regionOffline(hri); // To avoid region assignment if table is in disabling or disabled state. toAssign.remove(hri); regionsFromRIT.remove(hri); + return toAssign; }