Index: src/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java (revision 893350) +++ src/java/org/apache/hadoop/hbase/master/ProcessRegionOpen.java (working copy) @@ -103,8 +103,16 @@ master.regionManager.metaScannerThread.interrupt(); } } - // If updated successfully, remove from pending list. - master.regionManager.removeRegion(regionInfo); + // If updated successfully, remove from pending list if the state + // is consistent. For example, a disable could be called before the + // synchronization. + if(master.regionManager. + isOfflined(regionInfo.getRegionNameAsString())) { + LOG.warn("We opened a region while it was asked to be closed."); + } else { + master.regionManager.removeRegion(regionInfo); + } + return true; } } Index: src/java/org/apache/hadoop/hbase/master/RegionManager.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/RegionManager.java (revision 893350) +++ src/java/org/apache/hadoop/hbase/master/RegionManager.java (working copy) @@ -957,7 +957,7 @@ s = new RegionState(info); regionsInTransition.put(info.getRegionNameAsString(), s); } - if (force || (!s.isPendingOpen() && !s.isOpen())) { + if (force || (!s.isPendingOpen() || !s.isOpen())) { s.setUnassigned(); } } @@ -1030,7 +1030,7 @@ * @param regionInfo * @param setOffline */ - public void setClosing(final String serverName, final HRegionInfo regionInfo, + public void setClosing(String serverName, final HRegionInfo regionInfo, final boolean setOffline) { synchronized (this.regionsInTransition) { RegionState s = @@ -1038,6 +1038,12 @@ if (s == null) { s = new RegionState(regionInfo); } + // If region was asked to open before getting here, we could be taking + // the wrong server name + if(s.isPendingOpen()) { + serverName = s.getServerName(); + } + s.setClosing(serverName, setOffline); this.regionsInTransition.put(regionInfo.getRegionNameAsString(), s); } @@ -1640,10 +1646,10 @@ } synchronized void setClosed() { - if (!pendingClose && !pendingOpen) { + if (!pendingClose && !pendingOpen && !closing) { throw new IllegalStateException( "Cannot set a region to be closed if it was not already marked as" + - " pending close or pending open. State: " + toString()); + " pending close, pending open or closing. State: " + toString()); } this.unassigned = false; this.pendingOpen = false;