diff --git a/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java b/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java index c999541..5081700 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java +++ b/src/main/java/org/apache/hadoop/hbase/master/AssignmentManager.java @@ -1832,16 +1832,37 @@ public class AssignmentManager extends ZooKeeperListener { } /** - * @return True if only catalog tables online. + * @param hsi + * @return True if this server is carrying a catalog region, a region from + * -ROOT- or .META. table. */ - boolean isCatalogOnly() { + boolean isMetaRegionServer(final HServerInfo hsi) { synchronized (this.regions) { - LOG.info("REGIONS REMOVE " + this.regions.keySet()); - for (Map.Entry e: this.regions.entrySet()) { - if (!e.getKey().isMetaTable()) return false; + List regions = this.servers.get(hsi); + if (regions == null || regions.isEmpty()) return false; + for (HRegionInfo hri: regions) { + if (hri.isMetaRegion()) return true; + } + } + return false; + } + + /** + * Run through remaining regionservers and unassign all catalog regions. + */ + void unassignCatalogRegions() { + this.servers.entrySet(); + synchronized (this.regions) { + for (Map.Entry> e: this.servers.entrySet()) { + List regions = e.getValue(); + if (regions == null || regions.isEmpty()) continue; + for (HRegionInfo hri: regions) { + if (hri.isMetaRegion()) { + unassign(hri); + } + } } } - return true; } /** @@ -1950,4 +1971,4 @@ public class AssignmentManager extends ZooKeeperListener { public void stop() { this.timeoutMonitor.interrupt(); } -} +} \ No newline at end of file diff --git a/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java b/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java index e737294..ca154fc 100644 --- a/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java +++ b/src/main/java/org/apache/hadoop/hbase/master/ServerManager.java @@ -284,26 +284,34 @@ public class ServerManager { HMsg [] reply = null; if (this.clusterShutdown) { - if (this.services.getAssignmentManager().isCatalogOnly()) { - LOG.info("Only catalog regions remaining; running their shutdown now"); + if (isOnlyMetaRegionServersOnline()) { + LOG.info("Only catalog regions remaining; running unassign"); // The only remaining regions are catalog regions. // Shutdown needs to be staggered; the meta regions need to close last // in case they need to be updated during the close melee. If only // catalog reigons remaining, tell them they can go down now too. On // close of region, the regionservers should then shut themselves down. - Map> assignments = - this.services.getAssignmentManager().getAssignments(); - for (Map.Entry> e: assignments.entrySet()) { - for (HRegionInfo hri: e.getValue()) { - this.services.getAssignmentManager().unassign(hri); - } - } + this.services.getAssignmentManager().unassignCatalogRegions(); } } return processRegionServerAllsWell(info, mostLoadedRegions, reply); } /** + * @return True if all online servers are carrying one or more catalog + * regions, there are no servers online carrying user regions only + */ + private boolean isOnlyMetaRegionServersOnline() { + List onlineServers = getOnlineServersList(); + for (HServerInfo hsi: onlineServers) { + if (!this.services.getAssignmentManager().isMetaRegionServer(hsi)) { + return false; + } + } + return true; + } + + /** * RegionServer is checking in, no exceptional circumstances * @param serverInfo * @param mostLoadedRegions