Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java (revision 1526315) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java (working copy) @@ -69,6 +69,7 @@ private HTable nsTable; private ZKNamespaceManager zkNamespaceManager; private boolean initialized; + private volatile boolean started; static final String NS_INIT_TIMEOUT = "hbase.master.namespace.init.timeout"; static final int DEFAULT_NS_INIT_TIMEOUT = 60000; @@ -103,6 +104,7 @@ } catch (InterruptedException e) { throw new IOException("Wait for namespace table assignment interrupted", e); } + started = true; // initialize namespace table getNamespaceTable(); @@ -110,6 +112,9 @@ @SuppressWarnings("deprecation") private synchronized HTable getNamespaceTable() throws IOException { + if (!started) { + throw new IOException(this.getClass().getName() + " isn't ready to serve"); + } if (!initialized) { try { nsTable = new HTable(conf, TableName.NAMESPACE_TABLE_NAME); @@ -272,4 +277,12 @@ newRegions, masterServices).prepare()); } + + /** + * Once started the manager can be used. + * @return true if started + */ + public boolean isStarted() { + return started; + } } Index: hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java =================================================================== --- hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (revision 1526315) +++ hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java (working copy) @@ -3092,6 +3092,9 @@ @Override public NamespaceDescriptor getNamespaceDescriptor(String name) throws IOException { + if (tableNamespaceManager == null) { + LOG.warn("Cannot getNamespaceDescriptor, manager not available"); + } NamespaceDescriptor nsd = tableNamespaceManager.get(name); if (nsd == null) { throw new NamespaceNotFoundException(name); @@ -3106,14 +3109,20 @@ @Override public List listTableDescriptorsByNamespace(String name) throws IOException { + if (tableNamespaceManager == null || !tableNamespaceManager.isStarted()) { + return Lists.newArrayList(); + } getNamespaceDescriptor(name); // check that namespace exists return Lists.newArrayList(tableDescriptors.getByNamespace(name).values()); } @Override public List listTableNamesByNamespace(String name) throws IOException { + List tableNames = Lists.newArrayList(); + if (tableNamespaceManager == null || !tableNamespaceManager.isStarted()) { + return tableNames; + } getNamespaceDescriptor(name); // check that namespace exists - List tableNames = Lists.newArrayList(); for (HTableDescriptor descriptor: tableDescriptors.getByNamespace(name).values()) { tableNames.add(descriptor.getTableName()); }