diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchema.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchema.java index 18fe8b7..e632230 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchema.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchema.java @@ -70,8 +70,8 @@ public interface ClusterSchema { /** * Utility method that will wait {@link #HBASE_MASTER_CLUSTER_SCHEMA_OPERATION_TIMEOUT_KEY} - * timeout and if exceptions, does conversion so palatable outside Master: i.e. - * {@link InterruptedException} becomes {@link InterruptedIOException} and so on. + * timeout and if exceptions, THROWs the exception doing conversion so palatable outside Master: + * i.e. {@link InterruptedException} becomes {@link InterruptedIOException} and so on. * * <> * @@ -79,7 +79,7 @@ public interface ClusterSchema { * @return On completion, info on the procedure that ran. * @throws IOException */ - // TODO: Where to put this utility? + // TODO: Where to put this utility? It goes away? ProcedureInfo get(final Future future) throws IOException; /** diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java index f2b5cf3..c7f4692 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java @@ -87,7 +87,11 @@ class ClusterSchemaServiceImpl implements ClusterSchemaService { @Override public ProcedureInfo get(final Future future) throws IOException { try { - return future.get(this.clusterSchemaOperationTimeoutInMillis, TimeUnit.MILLISECONDS); + ProcedureInfo pi = + future.get(this.clusterSchemaOperationTimeoutInMillis, TimeUnit.MILLISECONDS); + // If the procedure got an exception, throw it. + if (pi.getException() != null) throw pi.getException(); + return pi; } catch (ExecutionException ee) { // No cleanup to do... just let the exception out. if (ee.getCause() instanceof IOException) throw (IOException)ee.getCause(); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index 292ad55..f29cad6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -2568,6 +2568,8 @@ public class HMaster extends HRegionServer implements MasterServices { // request for all TableDescriptors Collection htds; if (namespace != null && namespace.length() > 0) { + // Do a check on the namespace existence. Will fail if does not exist. + this.clusterSchemaService.getNamespace(namespace); htds = tableDescriptors.getByNamespace(namespace).values(); } else { htds = tableDescriptors.getAll().values(); @@ -2611,46 +2613,17 @@ public class HMaster extends HRegionServer implements MasterServices { */ public List listTableNames(final String namespace, final String regex, final boolean includeSysTables) throws IOException { - final List descriptors = new ArrayList(); - - boolean bypass = false; - if (cpHost != null) { - bypass = cpHost.preGetTableNames(descriptors, regex); - } - + List htds = new ArrayList(); + boolean bypass = cpHost != null? cpHost.preGetTableNames(htds, regex): false; if (!bypass) { - // get all descriptors - Collection htds; - if (namespace != null && namespace.length() > 0) { - htds = tableDescriptors.getByNamespace(namespace).values(); - } else { - htds = tableDescriptors.getAll().values(); - } - - for (HTableDescriptor htd: htds) { - if (includeSysTables || !htd.getTableName().isSystemTable()) { - descriptors.add(htd); - } - } - - // Retains only those matched by regular expression. - if (regex != null) { - filterTablesByRegex(descriptors, Pattern.compile(regex)); - } - - if (cpHost != null) { - cpHost.postGetTableNames(descriptors, regex); - } - } - - List result = new ArrayList(descriptors.size()); - for (HTableDescriptor htd: descriptors) { - result.add(htd.getTableName()); + htds.addAll(listTableDescriptors(namespace, regex, null, includeSysTables)); + if (cpHost != null) cpHost.postGetTableNames(htds, regex); } + List result = new ArrayList(htds.size()); + for (HTableDescriptor htd: htds) result.add(htd.getTableName()); return result; } - /** * Removes the table descriptors that don't match the pattern. * @param descriptors list of table descriptors to filter diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index d5bc958d..2528814 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -833,7 +833,7 @@ public class MasterRpcServices extends RSRpcServices try { return GetNamespaceDescriptorResponse.newBuilder() .setNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor( - master.getClusterSchema().getNamespace(request.getNamespaceName()))) + master.getNamespace(request.getNamespaceName()))) .build(); } catch (IOException e) { throw new ServiceException(e); @@ -1121,7 +1121,7 @@ public class MasterRpcServices extends RSRpcServices try { ListNamespaceDescriptorsResponse.Builder response = ListNamespaceDescriptorsResponse.newBuilder(); - for(NamespaceDescriptor ns: master.getClusterSchema().getNamespaces()) { + for(NamespaceDescriptor ns: master.getNamespaces()) { response.addNamespaceDescriptor(ProtobufUtil.toProtoNamespaceDescriptor(ns)); } return response.build(); @@ -1306,14 +1306,9 @@ public class MasterRpcServices extends RSRpcServices master.checkInitialized(); master.snapshotManager.checkSnapshotSupport(); - // ensure namespace exists + // Ensure namespace exists. Will throw exception if non-known NS. TableName dstTable = TableName.valueOf(request.getSnapshot().getTable()); - NamespaceDescriptor nsd = NamespaceDescriptor.create(dstTable.getNamespaceAsString()).build(); - try { - master.getClusterSchema().createNamespace(nsd, HConstants.NO_NONCE, HConstants.NO_NONCE); - } catch (NamespaceExistException nee) { - if (LOG.isDebugEnabled()) LOG.debug("Namespace " + nsd.getName() + " exists"); - } + master.getNamespace(dstTable.getNamespaceAsString()); SnapshotDescription reqSnapshot = request.getSnapshot(); master.snapshotManager.restoreSnapshot(reqSnapshot); return RestoreSnapshotResponse.newBuilder().build(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java index c24d8a3..f9e2a16 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestNamespace.java @@ -358,7 +358,7 @@ public class TestNamespace { runWithExpectedException(new Callable() { @Override public Void call() throws Exception { - admin.listTableDescriptorsByNamespace("non_existing_namespace"); + admin.listTableDescriptorsByNamespace("non_existant_namespace"); return null; } }, NamespaceNotFoundException.class);