Index: hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 1380128) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -915,17 +915,29 @@ // Just skip out w/o closing regions. Used when testing. } else if (abortRequested) { if (this.fsOk) { - closeAllRegions(abortRequested); // Don't leave any open file handles + closeUserRegions(abortRequested); // Don't leave any open file handles } LOG.info("aborting server " + this.serverNameFromMasterPOV); } else { - closeAllRegions(abortRequested); + closeUserRegions(abortRequested); closeAllScanners(); LOG.info("stopping server " + this.serverNameFromMasterPOV); } // Interrupt catalog tracker here in case any regions being opened out in // handlers are stuck waiting on meta or root. if (this.catalogTracker != null) this.catalogTracker.stop(); + + // Closed the compactSplit thread before close meta regions + if (!this.killed && containMetaRegions()) { + if (!abortRequested || this.fsOk) { + if (this.compactSplitThread != null) { + this.compactSplitThread.join(); + this.compactSplitThread = null; + } + closeMetaTableRegions(abortRequested); + } + } + if (!this.killed && this.fsOk) { waitOnAllRegionsToClose(abortRequested); LOG.info("stopping server " + this.serverNameFromMasterPOV + @@ -963,11 +975,16 @@ LOG.info(Thread.currentThread().getName() + " exiting"); } + private boolean containMetaRegions() { + return onlineRegions.containsKey(HRegionInfo.ROOT_REGIONINFO.getEncodedName()) + || onlineRegions.containsKey(HRegionInfo.FIRST_META_REGIONINFO.getEncodedName()); + } + private boolean areAllUserRegionsOffline() { if (getNumberOfOnlineRegions() > 2) return false; boolean allUserRegionsOffline = true; for (Map.Entry e: this.onlineRegions.entrySet()) { - if (!e.getValue().getRegionInfo().isMetaRegion()) { + if (!e.getValue().getRegionInfo().isMetaTable()) { allUserRegionsOffline = false; break; } @@ -1977,7 +1994,14 @@ */ protected void closeAllRegions(final boolean abort) { closeUserRegions(abort); - // Only root and meta should remain. Are we carrying root or meta? + closeMetaTableRegions(abort); + } + + /** + * Close root and meta region if we carrying + * @param abort Whether we're running an abort. + */ + void closeMetaTableRegions(final boolean abort) { HRegion meta = null; HRegion root = null; this.lock.writeLock().lock(); @@ -2009,7 +2033,7 @@ try { for (Map.Entry e: this.onlineRegions.entrySet()) { HRegion r = e.getValue(); - if (!r.getRegionInfo().isMetaRegion() && r.isAvailable()) { + if (!r.getRegionInfo().isMetaTable() && r.isAvailable()) { // Don't update zk with this close transition; pass false. closeRegion(r.getRegionInfo(), abort, false); }