Index: src/test/org/apache/hadoop/hbase/client/TestAdmin.java =================================================================== --- src/test/org/apache/hadoop/hbase/client/TestAdmin.java (revision 893381) +++ src/test/org/apache/hadoop/hbase/client/TestAdmin.java (working copy) @@ -395,7 +395,6 @@ @Test public void testHundredsOfTable() throws IOException{ final int times = 100; - byte [] name = Bytes.toBytes("testHundredsOfTable"); HColumnDescriptor fam1 = new HColumnDescriptor("fam1"); HColumnDescriptor fam2 = new HColumnDescriptor("fam2"); HColumnDescriptor fam3 = new HColumnDescriptor("fam3"); @@ -411,6 +410,8 @@ for(int i = 0; i < times; i++) { String tableName = "table"+i; this.admin.disableTable(tableName); + this.admin.enableTable(tableName); + this.admin.disableTable(tableName); this.admin.deleteTable(tableName); } } 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) @@ -1961,6 +1961,14 @@ info.setOffline(true); put.add(CATALOG_FAMILY, REGIONINFO_QUALIFIER, Writables.getBytes(info)); srvr.put(metaRegionName, put); + removeServerInfoInMETA(srvr, metaRegionName, info); + } + + public static void removeServerInfoInMETA(final HRegionInterface srvr, + final byte [] metaRegionName, final HRegionInfo info) + throws IOException { + + byte [] row = info.getRegionName(); Delete del = new Delete(row); del.deleteColumns(CATALOG_FAMILY, SERVER_QUALIFIER); del.deleteColumns(CATALOG_FAMILY, STARTCODE_QUALIFIER); 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,39 @@ @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()) { - // offline the region in meta and then remove it from the - // set of regions in transition - HRegion.offlineRegionInMETA(server, metaRegionName, - regionInfo); - master.getRegionManager().removeRegion(regionInfo); + if(offlineRegion) { + // offline the region in meta and then remove it from the + // set of regions in transition + HRegion.offlineRegionInMETA(server, metaRegionName, + regionInfo); + master.getRegionManager().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.removeServerInfoInMETA(server, metaRegionName, + regionInfo); + master.getRegionManager().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.getRegionManager().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) @@ -78,6 +78,13 @@ continue; } + if(!this.online && this.master.getRegionManager(). + 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,15 @@ 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()) {