Index: src/java/org/apache/hadoop/hbase/regionserver/HRegion.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (revision 893381) +++ src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (working copy) @@ -1947,10 +1947,7 @@ info.setOffline(true); put.add(CATALOG_FAMILY, REGIONINFO_QUALIFIER, Writables.getBytes(info)); srvr.put(metaRegionName, put); - Delete del = new Delete(row); - del.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER); - del.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER); - srvr.delete(metaRegionName, del); + cleanRegionInMETA(srvr, metaRegionName, info); } /** Index: src/java/org/apache/hadoop/hbase/master/ProcessRegionClose.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/ProcessRegionClose.java (revision 893381) +++ src/java/org/apache/hadoop/hbase/master/ProcessRegionClose.java (working copy) @@ -59,33 +59,36 @@ @Override protected boolean process() throws IOException { Boolean result = null; - if (offlineRegion) { + if (offlineRegion || reassignRegion) { result = new RetryableMetaOperation(getMetaRegion(), this.master) { public Boolean call() throws IOException { - LOG.info("region closed: " + regionInfo.getRegionNameAsString()); // We can't proceed unless the meta region we are going to update // is online. metaRegionAvailable() will put this operation on the // delayedToDoQueue, so return true so the operation is not put // back on the toDoQueue - if (metaRegionAvailable()) { + if(offlineRegion) { // offline the region in meta and then remove it from the // set of regions in transition HRegion.offlineRegionInMETA(server, metaRegionName, regionInfo); master.regionManager.removeRegion(regionInfo); + LOG.info("region closed: " + regionInfo.getRegionNameAsString()); + } else { + // we are reassigning the region eventually, so set it unassigned + // and remove the server info + HRegion.cleanRegionInMETA(server, metaRegionName, + regionInfo); + master.regionManager.setUnassigned(regionInfo, false); + LOG.info("region set as unassigned: " + regionInfo.getRegionNameAsString()); } return true; } }.doWithRetries(); result = result == null ? true : result; - } else if (reassignRegion) { - LOG.info("region set as unassigned: " + regionInfo.getRegionNameAsString()); - // we are reassigning the region eventually, so set it unassigned - master.regionManager.setUnassigned(regionInfo, false); } else { LOG.info("Region was neither offlined, or asked to be reassigned, what gives: " + regionInfo.getRegionNameAsString()); Index: src/java/org/apache/hadoop/hbase/master/ChangeTableState.java =================================================================== --- src/java/org/apache/hadoop/hbase/master/ChangeTableState.java (revision 893381) +++ src/java/org/apache/hadoop/hbase/master/ChangeTableState.java (working copy) @@ -79,6 +79,14 @@ continue; } + if(!this.online && this.master.regionManager. + isPendingOpen(i.getRegionNameAsString())) { + LOG.debug("Skipping region " + i.toString() + + " because it is pending open, will tell it to close later"); + continue; + } + + // Update meta table Put put = updateRegionInfo(i); server.put(m.getRegionName(), put); Index: src/java/org/apache/hadoop/hbase/client/HBaseAdmin.java =================================================================== --- src/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (revision 893381) +++ src/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (working copy) @@ -326,15 +326,16 @@ if (this.master == null) { throw new MasterNotRunningException("master has been shut down"); } - try { - this.master.enableTable(tableName); - } catch (RemoteException e) { - throw RemoteExceptionHandler.decodeRemoteException(e); - } + // Wait until all regions are enabled boolean enabled = false; for (int tries = 0; tries < this.numRetries; tries++) { + try { + this.master.enableTable(tableName); + } catch (RemoteException e) { + throw RemoteExceptionHandler.decodeRemoteException(e); + } enabled = isTableEnabled(tableName); if (enabled) break; long sleep = getPauseTime(tries); @@ -382,15 +383,16 @@ if (this.master == null) { throw new MasterNotRunningException("master has been shut down"); } - try { - this.master.disableTable(tableName); - } catch (RemoteException e) { - throw RemoteExceptionHandler.decodeRemoteException(e); - } // Wait until all regions are disabled boolean disabled = false; for (int tries = 0; tries < this.numRetries; tries++) { + + try { + this.master.disableTable(tableName); + } catch (RemoteException e) { + throw RemoteExceptionHandler.decodeRemoteException(e); + } disabled = isTableDisabled(tableName); if (disabled) break; if (LOG.isDebugEnabled()) {