Index: src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java (revision 1126563) +++ src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java (working copy) @@ -80,6 +80,9 @@ public static final ImmutableBytesWritable DEFERRED_LOG_FLUSH_KEY = new ImmutableBytesWritable(Bytes.toBytes(DEFERRED_LOG_FLUSH)); + public static final String NUM_INITIAL_REGS = "NUM_INITIAL_REGS"; + public static final ImmutableBytesWritable NUM_INITIAL_REGS_KEY = + new ImmutableBytesWritable(Bytes.toBytes(NUM_INITIAL_REGS)); // The below are ugly but better than creating them each time till we // replace booleans being saved as Strings with plain booleans. Need a @@ -340,7 +343,7 @@ * @param key The key. * @param value The value. */ - private void setValue(final ImmutableBytesWritable key, + public void setValue(final ImmutableBytesWritable key, final byte[] value) { values.put(key, new ImmutableBytesWritable(value)); } Index: src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (revision 1126563) +++ src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java (working copy) @@ -673,6 +673,11 @@ public boolean isTableAvailable(final byte[] tableName) throws IOException { final AtomicBoolean available = new AtomicBoolean(true); final AtomicInteger regionCount = new AtomicInteger(0); + HTableDescriptor tableDesc = getHTableDescriptor(tableName); + byte[] rawInitialRegs = tableDesc.getValue( + HTableDescriptor.NUM_INITIAL_REGS_KEY.get()); + int initialRegions = rawInitialRegs == null ? 1 : + Bytes.toInt(rawInitialRegs); MetaScannerVisitor visitor = new MetaScannerVisitor() { @Override public boolean processRow(Result row) throws IOException { @@ -683,18 +688,26 @@ if (Bytes.equals(tableName, info.getTableDesc().getName())) { value = row.getValue(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER); - if (value == null) { + if (value == null || value.length == 0) { available.set(false); return false; } - regionCount.incrementAndGet(); + if (!(info.isOffline() || info.isSplit())) { + regionCount.incrementAndGet(); + } } + } else { + available.set(false); + return false; } return true; } }; - MetaScanner.metaScan(conf, visitor); - return available.get() && (regionCount.get() > 0); + MetaScanner.metaScan(conf, visitor, tableName); + boolean isAvailable = available.get() && (regionCount.get() >= initialRegions); + if (isAvailable) LOG.info("Table " + Bytes.toStringBinary(tableName) + + " available with " + regionCount.get() + " regions"); + return isAvailable; } /* Index: src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1126563) +++ src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -890,7 +904,11 @@ private synchronized void createTable(final HRegionInfo [] newRegions, final boolean sync) throws IOException { - String tableName = newRegions[0].getTableDesc().getNameAsString(); + HTableDescriptor tableDesc = newRegions[0].getTableDesc(); + String tableName = tableDesc.getNameAsString(); + // HBASE-3904 store number of initial regions in table desc + tableDesc.setValue(HTableDescriptor.NUM_INITIAL_REGS_KEY, + Bytes.toBytes(newRegions.length)); if(MetaReader.tableExists(catalogTracker, tableName)) { throw new TableExistsException(tableName); } Index: src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (revision 1126563) +++ src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java (working copy) @@ -336,6 +336,8 @@ lastKey = splitKey; } } + int numRegs = splitKeys == null ? 1 : splitKeys.length; + desc.setValue(HTableDescriptor.NUM_INITIAL_REGS_KEY,Bytes.toBytes(numRegs)); try { getMaster().createTable(desc, splitKeys); } catch (RemoteException e) {