diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java index a1b4386..1a6b08d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java @@ -115,6 +115,30 @@ public interface Admin extends Abortable, Closeable { HTableDescriptor[] listTables(String regex) throws IOException; /** + * List all the tables matching the given pattern. + * + * @param pattern The compiled regular expression to match against + * @param includeSysTables False to match only against userspace tables + * @return - returns an array of HTableDescriptors + * @throws IOException if a remote or network exception occurs + * @see #listTables() + */ + HTableDescriptor[] listTables(Pattern pattern, boolean includeSysTables) + throws IOException; + + /** + * List all the tables matching the given pattern. + * + * @param regex The regular expression to match against + * @param includeSysTables False to match only against userspace tables + * @return - returns an array of HTableDescriptors + * @throws IOException if a remote or network exception occurs + * @see #listTables(java.util.regex.Pattern, boolean) + */ + HTableDescriptor[] listTables(String regex, boolean includeSysTables) + throws IOException; + + /** * List all of the names of userspace tables. * * @return TableName[] table names diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java index d8856ad..a30ce9d 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionAdapter.java @@ -38,7 +38,7 @@ import org.apache.hadoop.hbase.protobuf.generated.MasterProtos.MasterService; /** * An internal class that delegates to an {@link HConnection} instance. * A convenience to override when customizing method implementations. - * + * * * @see ConnectionUtils#createShortCircuitHConnection(HConnection, ServerName, * AdminService.BlockingInterface, ClientService.BlockingInterface) for case where we make @@ -177,11 +177,6 @@ abstract class ConnectionAdapter implements ClusterConnection { } @Override - public HTableDescriptor[] listTables(String regex) throws IOException { - return wrappedConnection.listTables(regex); - } - - @Override public String[] getTableNames() throws IOException { return wrappedConnection.getTableNames(); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java index 6525d8c..bca8be8 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ConnectionManager.java @@ -2398,24 +2398,6 @@ class ConnectionManager { } } - /** - * @deprecated Use {@link Admin#listTableNames()} instead - */ - @Deprecated - @Override - public HTableDescriptor[] listTables(String regex) throws IOException { - MasterKeepAliveConnection master = getKeepAliveMasterService(); - try { - GetTableDescriptorsRequest req = - RequestConverter.buildGetTableDescriptorsRequest(regex); - return ProtobufUtil.getHTableDescriptorArray(master.getTableDescriptors(null, req)); - } catch (ServiceException se) { - throw ProtobufUtil.getRemoteException(se); - } finally { - master.close(); - } - } - @Override public String[] getTableNames() throws IOException { TableName[] tableNames = listTableNames(); diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 499e247..17e6c97 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -328,7 +328,7 @@ public class HBaseAdmin implements Admin { */ @Override public HTableDescriptor[] listTables(Pattern pattern) throws IOException { - return this.connection.listTables(pattern.toString()); + return listTables(pattern, false); } /** @@ -341,7 +341,44 @@ public class HBaseAdmin implements Admin { */ @Override public HTableDescriptor[] listTables(String regex) throws IOException { - return listTables(Pattern.compile(regex)); + return listTables(Pattern.compile(regex), false); + } + + /** + * List all the tables matching the given pattern. + * + * @param pattern The compiled regular expression to match against + * @param includeSysTables False to match only against userspace tables + * @return - returns an array of HTableDescriptors + * @throws IOException if a remote or network exception occurs + * @see #listTables() + */ + @Override + public HTableDescriptor[] listTables(final Pattern pattern, final boolean includeSysTables) + throws IOException { + return executeCallable(new MasterCallable(getConnection()) { + @Override + public HTableDescriptor[] call(int callTimeout) throws ServiceException { + GetTableDescriptorsRequest req = + RequestConverter.buildGetTableDescriptorsRequest(pattern, includeSysTables); + return ProtobufUtil.getHTableDescriptorArray(master.getTableDescriptors(null, req)); + } + }); + } + + /** + * List all the tables matching the given pattern. + * + * @param regex The regular expression to match against + * @param includeSysTables False to match only against userspace tables + * @return - returns an array of HTableDescriptors + * @throws IOException if a remote or network exception occurs + * @see #listTables(java.util.regex.Pattern, boolean) + */ + @Override + public HTableDescriptor[] listTables(String regex, boolean includeSysTables) + throws IOException { + return listTables(Pattern.compile(regex), includeSysTables); } /** @@ -2648,7 +2685,7 @@ public class HBaseAdmin implements Admin { } /** - * Roll the log writer. I.e. when using a file system based write ahead log, + * Roll the log writer. I.e. when using a file system based write ahead log, * start writing log messages to a new file. * * Note that when talking to a version 1.0+ HBase deployment, the rolling is asynchronous. diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java index 7add87b..9a4ef69 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HConnection.java @@ -258,13 +258,6 @@ public interface HConnection extends Connection { @Deprecated HTableDescriptor[] listTables() throws IOException; - /** - * List all the userspace tables matching the pattern. - * @return - returns an array of HTableDescriptors - * @throws IOException if a remote or network exception occurs - */ - HTableDescriptor[] listTables(String pattern) throws IOException; - // This is a bit ugly - We call this getTableNames in 0.94 and the // successor function, returning TableName, listTableNames in later versions // because Java polymorphism doesn't consider return value types diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index 2d8c53e..29f2cfc 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.protobuf; import java.io.IOException; import java.util.List; +import java.util.regex.Pattern; import org.apache.hadoop.hbase.CellScannable; import org.apache.hadoop.hbase.DoNotRetryIOException; @@ -1229,11 +1230,15 @@ public final class RequestConverter { /** * Creates a protocol buffer GetTableDescriptorsRequest * + * @param pattern The compiled regular expression to match against + * @param includeSysTables False to match only against userspace tables * @return a GetTableDescriptorsRequest */ - public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest(final String pattern) { + public static GetTableDescriptorsRequest buildGetTableDescriptorsRequest(final Pattern pattern, + boolean includeSysTables) { GetTableDescriptorsRequest.Builder builder = GetTableDescriptorsRequest.newBuilder(); - builder.setRegex(pattern); + builder.setRegex(pattern.toString()); + builder.setIncludeSysTables(includeSysTables); return builder.build(); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlClient.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlClient.java index ae43c17..521c58b 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlClient.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlClient.java @@ -178,7 +178,7 @@ public class AccessControlClient { String namespace = tableRegex.substring(1); permList = ProtobufUtil.getUserPermissions(protocol, Bytes.toBytes(namespace)); } else { - htds = admin.listTables(Pattern.compile(tableRegex)); + htds = admin.listTables(Pattern.compile(tableRegex), true); for (HTableDescriptor hd : htds) { permList.addAll(ProtobufUtil.getUserPermissions(protocol, hd.getTableName())); } diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java index 3819faef..0cf3b17 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java @@ -34196,6 +34196,16 @@ public final class MasterProtos { */ com.google.protobuf.ByteString getRegexBytes(); + + // optional bool include_sys_tables = 3 [default = false]; + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + boolean hasIncludeSysTables(); + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + boolean getIncludeSysTables(); } /** * Protobuf type {@code GetTableDescriptorsRequest} @@ -34261,6 +34271,11 @@ public final class MasterProtos { regex_ = input.readBytes(); break; } + case 24: { + bitField0_ |= 0x00000002; + includeSysTables_ = input.readBool(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -34383,9 +34398,26 @@ public final class MasterProtos { } } + // optional bool include_sys_tables = 3 [default = false]; + public static final int INCLUDE_SYS_TABLES_FIELD_NUMBER = 3; + private boolean includeSysTables_; + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public boolean hasIncludeSysTables() { + return ((bitField0_ & 0x00000002) == 0x00000002); + } + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public boolean getIncludeSysTables() { + return includeSysTables_; + } + private void initFields() { tableNames_ = java.util.Collections.emptyList(); regex_ = ""; + includeSysTables_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -34411,6 +34443,9 @@ public final class MasterProtos { if (((bitField0_ & 0x00000001) == 0x00000001)) { output.writeBytes(2, getRegexBytes()); } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + output.writeBool(3, includeSysTables_); + } getUnknownFields().writeTo(output); } @@ -34428,6 +34463,10 @@ public final class MasterProtos { size += com.google.protobuf.CodedOutputStream .computeBytesSize(2, getRegexBytes()); } + if (((bitField0_ & 0x00000002) == 0x00000002)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(3, includeSysTables_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -34458,6 +34497,11 @@ public final class MasterProtos { result = result && getRegex() .equals(other.getRegex()); } + result = result && (hasIncludeSysTables() == other.hasIncludeSysTables()); + if (hasIncludeSysTables()) { + result = result && (getIncludeSysTables() + == other.getIncludeSysTables()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -34479,6 +34523,10 @@ public final class MasterProtos { hash = (37 * hash) + REGEX_FIELD_NUMBER; hash = (53 * hash) + getRegex().hashCode(); } + if (hasIncludeSysTables()) { + hash = (37 * hash) + INCLUDE_SYS_TABLES_FIELD_NUMBER; + hash = (53 * hash) + hashBoolean(getIncludeSysTables()); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -34597,6 +34645,8 @@ public final class MasterProtos { } regex_ = ""; bitField0_ = (bitField0_ & ~0x00000002); + includeSysTables_ = false; + bitField0_ = (bitField0_ & ~0x00000004); return this; } @@ -34638,6 +34688,10 @@ public final class MasterProtos { to_bitField0_ |= 0x00000001; } result.regex_ = regex_; + if (((from_bitField0_ & 0x00000004) == 0x00000004)) { + to_bitField0_ |= 0x00000002; + } + result.includeSysTables_ = includeSysTables_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -34685,6 +34739,9 @@ public final class MasterProtos { regex_ = other.regex_; onChanged(); } + if (other.hasIncludeSysTables()) { + setIncludeSysTables(other.getIncludeSysTables()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -35032,6 +35089,39 @@ public final class MasterProtos { return this; } + // optional bool include_sys_tables = 3 [default = false]; + private boolean includeSysTables_ ; + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public boolean hasIncludeSysTables() { + return ((bitField0_ & 0x00000004) == 0x00000004); + } + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public boolean getIncludeSysTables() { + return includeSysTables_; + } + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public Builder setIncludeSysTables(boolean value) { + bitField0_ |= 0x00000004; + includeSysTables_ = value; + onChanged(); + return this; + } + /** + * optional bool include_sys_tables = 3 [default = false]; + */ + public Builder clearIncludeSysTables() { + bitField0_ = (bitField0_ & ~0x00000004); + includeSysTables_ = false; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:GetTableDescriptorsRequest) } @@ -48755,118 +48845,118 @@ public final class MasterProtos { "equest\022\036\n\ntable_name\030\001 \002(\0132\n.TableName\"T", "\n\034GetSchemaAlterStatusResponse\022\035\n\025yet_to" + "_update_regions\030\001 \001(\r\022\025\n\rtotal_regions\030\002" + - " \001(\r\"L\n\032GetTableDescriptorsRequest\022\037\n\013ta" + + " \001(\r\"o\n\032GetTableDescriptorsRequest\022\037\n\013ta" + "ble_names\030\001 \003(\0132\n.TableName\022\r\n\005regex\030\002 \001" + - "(\t\"A\n\033GetTableDescriptorsResponse\022\"\n\014tab" + - "le_schema\030\001 \003(\0132\014.TableSchema\"\026\n\024GetTabl" + - "eNamesRequest\"8\n\025GetTableNamesResponse\022\037" + - "\n\013table_names\030\001 \003(\0132\n.TableName\"6\n\024GetTa" + - "bleStateRequest\022\036\n\ntable_name\030\001 \002(\0132\n.Ta" + - "bleName\"9\n\025GetTableStateResponse\022 \n\013tabl", - "e_state\030\001 \002(\0132\013.TableState\"\031\n\027GetCluster" + - "StatusRequest\"B\n\030GetClusterStatusRespons" + - "e\022&\n\016cluster_status\030\001 \002(\0132\016.ClusterStatu" + - "s\"\030\n\026IsMasterRunningRequest\"4\n\027IsMasterR" + - "unningResponse\022\031\n\021is_master_running\030\001 \002(" + - "\010\"@\n\024ExecProcedureRequest\022(\n\tprocedure\030\001" + - " \002(\0132\025.ProcedureDescription\"F\n\025ExecProce" + - "dureResponse\022\030\n\020expected_timeout\030\001 \001(\003\022\023" + - "\n\013return_data\030\002 \001(\014\"B\n\026IsProcedureDoneRe" + - "quest\022(\n\tprocedure\030\001 \001(\0132\025.ProcedureDesc", - "ription\"W\n\027IsProcedureDoneResponse\022\023\n\004do" + - "ne\030\001 \001(\010:\005false\022\'\n\010snapshot\030\002 \001(\0132\025.Proc" + - "edureDescription\"\273\001\n\017SetQuotaRequest\022\021\n\t" + - "user_name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t\022\021\n\tn" + - "amespace\030\003 \001(\t\022\036\n\ntable_name\030\004 \001(\0132\n.Tab" + - "leName\022\022\n\nremove_all\030\005 \001(\010\022\026\n\016bypass_glo" + - "bals\030\006 \001(\010\022\"\n\010throttle\030\007 \001(\0132\020.ThrottleR" + - "equest\"\022\n\020SetQuotaResponse\"\"\n UpdateMast" + - "erConfigurationRequest\"#\n!UpdateMasterCo" + - "nfigurationResponse2\312\031\n\rMasterService\022S\n", - "\024GetSchemaAlterStatus\022\034.GetSchemaAlterSt" + - "atusRequest\032\035.GetSchemaAlterStatusRespon" + - "se\022P\n\023GetTableDescriptors\022\033.GetTableDesc" + - "riptorsRequest\032\034.GetTableDescriptorsResp" + - "onse\022>\n\rGetTableNames\022\025.GetTableNamesReq" + - "uest\032\026.GetTableNamesResponse\022G\n\020GetClust" + - "erStatus\022\030.GetClusterStatusRequest\032\031.Get" + - "ClusterStatusResponse\022D\n\017IsMasterRunning" + - "\022\027.IsMasterRunningRequest\032\030.IsMasterRunn" + - "ingResponse\0222\n\tAddColumn\022\021.AddColumnRequ", - "est\032\022.AddColumnResponse\022;\n\014DeleteColumn\022" + - "\024.DeleteColumnRequest\032\025.DeleteColumnResp" + - "onse\022;\n\014ModifyColumn\022\024.ModifyColumnReque" + - "st\032\025.ModifyColumnResponse\0225\n\nMoveRegion\022" + - "\022.MoveRegionRequest\032\023.MoveRegionResponse" + - "\022Y\n\026DispatchMergingRegions\022\036.DispatchMer" + - "gingRegionsRequest\032\037.DispatchMergingRegi" + - "onsResponse\022;\n\014AssignRegion\022\024.AssignRegi" + - "onRequest\032\025.AssignRegionResponse\022A\n\016Unas" + - "signRegion\022\026.UnassignRegionRequest\032\027.Una", - "ssignRegionResponse\022>\n\rOfflineRegion\022\025.O" + - "fflineRegionRequest\032\026.OfflineRegionRespo" + - "nse\0228\n\013DeleteTable\022\023.DeleteTableRequest\032" + - "\024.DeleteTableResponse\022>\n\rtruncateTable\022\025" + - ".TruncateTableRequest\032\026.TruncateTableRes" + - "ponse\0228\n\013EnableTable\022\023.EnableTableReques" + - "t\032\024.EnableTableResponse\022;\n\014DisableTable\022" + - "\024.DisableTableRequest\032\025.DisableTableResp" + - "onse\0228\n\013ModifyTable\022\023.ModifyTableRequest" + - "\032\024.ModifyTableResponse\0228\n\013CreateTable\022\023.", - "CreateTableRequest\032\024.CreateTableResponse" + - "\022/\n\010Shutdown\022\020.ShutdownRequest\032\021.Shutdow" + - "nResponse\0225\n\nStopMaster\022\022.StopMasterRequ" + - "est\032\023.StopMasterResponse\022,\n\007Balance\022\017.Ba" + - "lanceRequest\032\020.BalanceResponse\022M\n\022SetBal" + - "ancerRunning\022\032.SetBalancerRunningRequest" + - "\032\033.SetBalancerRunningResponse\022A\n\016RunCata" + - "logScan\022\026.RunCatalogScanRequest\032\027.RunCat" + - "alogScanResponse\022S\n\024EnableCatalogJanitor" + - "\022\034.EnableCatalogJanitorRequest\032\035.EnableC", - "atalogJanitorResponse\022\\\n\027IsCatalogJanito" + - "rEnabled\022\037.IsCatalogJanitorEnabledReques" + - "t\032 .IsCatalogJanitorEnabledResponse\022L\n\021E" + - "xecMasterService\022\032.CoprocessorServiceReq" + - "uest\032\033.CoprocessorServiceResponse\022/\n\010Sna" + - "pshot\022\020.SnapshotRequest\032\021.SnapshotRespon" + - "se\022V\n\025GetCompletedSnapshots\022\035.GetComplet" + - "edSnapshotsRequest\032\036.GetCompletedSnapsho" + - "tsResponse\022A\n\016DeleteSnapshot\022\026.DeleteSna" + - "pshotRequest\032\027.DeleteSnapshotResponse\022A\n", - "\016IsSnapshotDone\022\026.IsSnapshotDoneRequest\032" + - "\027.IsSnapshotDoneResponse\022D\n\017RestoreSnaps" + - "hot\022\027.RestoreSnapshotRequest\032\030.RestoreSn" + - "apshotResponse\022V\n\025IsRestoreSnapshotDone\022" + - "\035.IsRestoreSnapshotDoneRequest\032\036.IsResto" + - "reSnapshotDoneResponse\022>\n\rExecProcedure\022" + - "\025.ExecProcedureRequest\032\026.ExecProcedureRe" + - "sponse\022E\n\024ExecProcedureWithRet\022\025.ExecPro" + - "cedureRequest\032\026.ExecProcedureResponse\022D\n" + - "\017IsProcedureDone\022\027.IsProcedureDoneReques", - "t\032\030.IsProcedureDoneResponse\022D\n\017ModifyNam" + - "espace\022\027.ModifyNamespaceRequest\032\030.Modify" + - "NamespaceResponse\022D\n\017CreateNamespace\022\027.C" + - "reateNamespaceRequest\032\030.CreateNamespaceR" + - "esponse\022D\n\017DeleteNamespace\022\027.DeleteNames" + - "paceRequest\032\030.DeleteNamespaceResponse\022Y\n" + - "\026GetNamespaceDescriptor\022\036.GetNamespaceDe" + - "scriptorRequest\032\037.GetNamespaceDescriptor" + - "Response\022_\n\030ListNamespaceDescriptors\022 .L" + - "istNamespaceDescriptorsRequest\032!.ListNam", - "espaceDescriptorsResponse\022t\n\037ListTableDe" + - "scriptorsByNamespace\022\'.ListTableDescript" + - "orsByNamespaceRequest\032(.ListTableDescrip" + - "torsByNamespaceResponse\022b\n\031ListTableName" + - "sByNamespace\022!.ListTableNamesByNamespace" + - "Request\032\".ListTableNamesByNamespaceRespo" + - "nse\022>\n\rGetTableState\022\025.GetTableStateRequ" + - "est\032\026.GetTableStateResponse\022/\n\010SetQuota\022" + - "\020.SetQuotaRequest\032\021.SetQuotaResponse\022b\n\031" + - "UpdateMasterConfiguration\022!.UpdateMaster", - "ConfigurationRequest\032\".UpdateMasterConfi" + - "gurationResponseBB\n*org.apache.hadoop.hb" + - "ase.protobuf.generatedB\014MasterProtosH\001\210\001" + - "\001\240\001\001" + "(\t\022!\n\022include_sys_tables\030\003 \001(\010:\005false\"A\n" + + "\033GetTableDescriptorsResponse\022\"\n\014table_sc" + + "hema\030\001 \003(\0132\014.TableSchema\"\026\n\024GetTableName" + + "sRequest\"8\n\025GetTableNamesResponse\022\037\n\013tab" + + "le_names\030\001 \003(\0132\n.TableName\"6\n\024GetTableSt" + + "ateRequest\022\036\n\ntable_name\030\001 \002(\0132\n.TableNa", + "me\"9\n\025GetTableStateResponse\022 \n\013table_sta" + + "te\030\001 \002(\0132\013.TableState\"\031\n\027GetClusterStatu" + + "sRequest\"B\n\030GetClusterStatusResponse\022&\n\016" + + "cluster_status\030\001 \002(\0132\016.ClusterStatus\"\030\n\026" + + "IsMasterRunningRequest\"4\n\027IsMasterRunnin" + + "gResponse\022\031\n\021is_master_running\030\001 \002(\010\"@\n\024" + + "ExecProcedureRequest\022(\n\tprocedure\030\001 \002(\0132" + + "\025.ProcedureDescription\"F\n\025ExecProcedureR" + + "esponse\022\030\n\020expected_timeout\030\001 \001(\003\022\023\n\013ret" + + "urn_data\030\002 \001(\014\"B\n\026IsProcedureDoneRequest", + "\022(\n\tprocedure\030\001 \001(\0132\025.ProcedureDescripti" + + "on\"W\n\027IsProcedureDoneResponse\022\023\n\004done\030\001 " + + "\001(\010:\005false\022\'\n\010snapshot\030\002 \001(\0132\025.Procedure" + + "Description\"\273\001\n\017SetQuotaRequest\022\021\n\tuser_" + + "name\030\001 \001(\t\022\022\n\nuser_group\030\002 \001(\t\022\021\n\tnamesp" + + "ace\030\003 \001(\t\022\036\n\ntable_name\030\004 \001(\0132\n.TableNam" + + "e\022\022\n\nremove_all\030\005 \001(\010\022\026\n\016bypass_globals\030" + + "\006 \001(\010\022\"\n\010throttle\030\007 \001(\0132\020.ThrottleReques" + + "t\"\022\n\020SetQuotaResponse\"\"\n UpdateMasterCon" + + "figurationRequest\"#\n!UpdateMasterConfigu", + "rationResponse2\312\031\n\rMasterService\022S\n\024GetS" + + "chemaAlterStatus\022\034.GetSchemaAlterStatusR" + + "equest\032\035.GetSchemaAlterStatusResponse\022P\n" + + "\023GetTableDescriptors\022\033.GetTableDescripto" + + "rsRequest\032\034.GetTableDescriptorsResponse\022" + + ">\n\rGetTableNames\022\025.GetTableNamesRequest\032" + + "\026.GetTableNamesResponse\022G\n\020GetClusterSta" + + "tus\022\030.GetClusterStatusRequest\032\031.GetClust" + + "erStatusResponse\022D\n\017IsMasterRunning\022\027.Is" + + "MasterRunningRequest\032\030.IsMasterRunningRe", + "sponse\0222\n\tAddColumn\022\021.AddColumnRequest\032\022" + + ".AddColumnResponse\022;\n\014DeleteColumn\022\024.Del" + + "eteColumnRequest\032\025.DeleteColumnResponse\022" + + ";\n\014ModifyColumn\022\024.ModifyColumnRequest\032\025." + + "ModifyColumnResponse\0225\n\nMoveRegion\022\022.Mov" + + "eRegionRequest\032\023.MoveRegionResponse\022Y\n\026D" + + "ispatchMergingRegions\022\036.DispatchMergingR" + + "egionsRequest\032\037.DispatchMergingRegionsRe" + + "sponse\022;\n\014AssignRegion\022\024.AssignRegionReq" + + "uest\032\025.AssignRegionResponse\022A\n\016UnassignR", + "egion\022\026.UnassignRegionRequest\032\027.Unassign" + + "RegionResponse\022>\n\rOfflineRegion\022\025.Offlin" + + "eRegionRequest\032\026.OfflineRegionResponse\0228" + + "\n\013DeleteTable\022\023.DeleteTableRequest\032\024.Del" + + "eteTableResponse\022>\n\rtruncateTable\022\025.Trun" + + "cateTableRequest\032\026.TruncateTableResponse" + + "\0228\n\013EnableTable\022\023.EnableTableRequest\032\024.E" + + "nableTableResponse\022;\n\014DisableTable\022\024.Dis" + + "ableTableRequest\032\025.DisableTableResponse\022" + + "8\n\013ModifyTable\022\023.ModifyTableRequest\032\024.Mo", + "difyTableResponse\0228\n\013CreateTable\022\023.Creat" + + "eTableRequest\032\024.CreateTableResponse\022/\n\010S" + + "hutdown\022\020.ShutdownRequest\032\021.ShutdownResp" + + "onse\0225\n\nStopMaster\022\022.StopMasterRequest\032\023" + + ".StopMasterResponse\022,\n\007Balance\022\017.Balance" + + "Request\032\020.BalanceResponse\022M\n\022SetBalancer" + + "Running\022\032.SetBalancerRunningRequest\032\033.Se" + + "tBalancerRunningResponse\022A\n\016RunCatalogSc" + + "an\022\026.RunCatalogScanRequest\032\027.RunCatalogS" + + "canResponse\022S\n\024EnableCatalogJanitor\022\034.En", + "ableCatalogJanitorRequest\032\035.EnableCatalo" + + "gJanitorResponse\022\\\n\027IsCatalogJanitorEnab" + + "led\022\037.IsCatalogJanitorEnabledRequest\032 .I" + + "sCatalogJanitorEnabledResponse\022L\n\021ExecMa" + + "sterService\022\032.CoprocessorServiceRequest\032" + + "\033.CoprocessorServiceResponse\022/\n\010Snapshot" + + "\022\020.SnapshotRequest\032\021.SnapshotResponse\022V\n" + + "\025GetCompletedSnapshots\022\035.GetCompletedSna" + + "pshotsRequest\032\036.GetCompletedSnapshotsRes" + + "ponse\022A\n\016DeleteSnapshot\022\026.DeleteSnapshot", + "Request\032\027.DeleteSnapshotResponse\022A\n\016IsSn" + + "apshotDone\022\026.IsSnapshotDoneRequest\032\027.IsS" + + "napshotDoneResponse\022D\n\017RestoreSnapshot\022\027" + + ".RestoreSnapshotRequest\032\030.RestoreSnapsho" + + "tResponse\022V\n\025IsRestoreSnapshotDone\022\035.IsR" + + "estoreSnapshotDoneRequest\032\036.IsRestoreSna" + + "pshotDoneResponse\022>\n\rExecProcedure\022\025.Exe" + + "cProcedureRequest\032\026.ExecProcedureRespons" + + "e\022E\n\024ExecProcedureWithRet\022\025.ExecProcedur" + + "eRequest\032\026.ExecProcedureResponse\022D\n\017IsPr", + "ocedureDone\022\027.IsProcedureDoneRequest\032\030.I" + + "sProcedureDoneResponse\022D\n\017ModifyNamespac" + + "e\022\027.ModifyNamespaceRequest\032\030.ModifyNames" + + "paceResponse\022D\n\017CreateNamespace\022\027.Create" + + "NamespaceRequest\032\030.CreateNamespaceRespon" + + "se\022D\n\017DeleteNamespace\022\027.DeleteNamespaceR" + + "equest\032\030.DeleteNamespaceResponse\022Y\n\026GetN" + + "amespaceDescriptor\022\036.GetNamespaceDescrip" + + "torRequest\032\037.GetNamespaceDescriptorRespo" + + "nse\022_\n\030ListNamespaceDescriptors\022 .ListNa", + "mespaceDescriptorsRequest\032!.ListNamespac" + + "eDescriptorsResponse\022t\n\037ListTableDescrip" + + "torsByNamespace\022\'.ListTableDescriptorsBy" + + "NamespaceRequest\032(.ListTableDescriptorsB" + + "yNamespaceResponse\022b\n\031ListTableNamesByNa" + + "mespace\022!.ListTableNamesByNamespaceReque" + + "st\032\".ListTableNamesByNamespaceResponse\022>" + + "\n\rGetTableState\022\025.GetTableStateRequest\032\026" + + ".GetTableStateResponse\022/\n\010SetQuota\022\020.Set" + + "QuotaRequest\032\021.SetQuotaResponse\022b\n\031Updat", + "eMasterConfiguration\022!.UpdateMasterConfi" + + "gurationRequest\032\".UpdateMasterConfigurat" + + "ionResponseBB\n*org.apache.hadoop.hbase.p" + + "rotobuf.generatedB\014MasterProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -49298,7 +49388,7 @@ public final class MasterProtos { internal_static_GetTableDescriptorsRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_GetTableDescriptorsRequest_descriptor, - new java.lang.String[] { "TableNames", "Regex", }); + new java.lang.String[] { "TableNames", "Regex", "IncludeSysTables", }); internal_static_GetTableDescriptorsResponse_descriptor = getDescriptor().getMessageTypes().get(71); internal_static_GetTableDescriptorsResponse_fieldAccessorTable = new diff --git a/hbase-protocol/src/main/protobuf/Master.proto b/hbase-protocol/src/main/protobuf/Master.proto index 406395e..7bd427b 100644 --- a/hbase-protocol/src/main/protobuf/Master.proto +++ b/hbase-protocol/src/main/protobuf/Master.proto @@ -315,6 +315,7 @@ message GetSchemaAlterStatusResponse { message GetTableDescriptorsRequest { repeated TableName table_names = 1; optional string regex = 2; + optional bool include_sys_tables = 3 [default=false]; } message GetTableDescriptorsResponse { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java index afc6ecf..568da47 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterAndRegionObserver.java @@ -435,7 +435,8 @@ public abstract class BaseMasterAndRegionObserver extends BaseRegionObserver @Override public void postGetTableDescriptors(ObserverContext ctx, - List descriptors, String regex) throws IOException { + List tableNamesList, List descriptors, + String regex) throws IOException { } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java index 3f0ffc2..969ef92 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/BaseMasterObserver.java @@ -427,7 +427,8 @@ public class BaseMasterObserver implements MasterObserver { @Override public void postGetTableDescriptors(ObserverContext ctx, - List descriptors, String regex) throws IOException { + List tableNamesList, List descriptors, + String regex) throws IOException { } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java index 1e00210..3acd6f7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/coprocessor/MasterObserver.java @@ -726,12 +726,14 @@ public interface MasterObserver extends Coprocessor { /** * Called after a getTableDescriptors request has been processed. * @param ctx the environment to interact with the framework and master + * @param tableNamesList the list of table names, or null if querying for all * @param descriptors the list of descriptors about to be returned * @param regex regular expression used for filtering the table names * @throws IOException */ void postGetTableDescriptors(ObserverContext ctx, - List descriptors, String regex) throws IOException; + List tableNamesList, List descriptors, + String regex) throws IOException; /** * Called before a new namespace is created by diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java index 31a5dab..045bc2d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterCoprocessorHost.java @@ -844,13 +844,13 @@ public class MasterCoprocessorHost }); } - public void postGetTableDescriptors(final List descriptors, final String regex) - throws IOException { + public void postGetTableDescriptors(final List tableNamesList, + final List descriptors, final String regex) throws IOException { execOperation(coprocessors.isEmpty() ? null : new CoprocessorOperation() { @Override public void call(MasterObserver oserver, ObserverContext ctx) throws IOException { - oserver.postGetTableDescriptors(ctx, descriptors, regex); + oserver.postGetTableDescriptors(ctx, tableNamesList, descriptors, regex); } }); } 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 4170621..0a600c3 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 @@ -798,7 +798,7 @@ public class MasterRpcServices extends RSRpcServices } List descriptors = new ArrayList(); - List tableNameList = new ArrayList(); + List tableNameList = new ArrayList(req.getTableNamesCount()); for(HBaseProtos.TableName tableNamePB: req.getTableNamesList()) { tableNameList.add(ProtobufUtil.toTableName(tableNamePB)); } @@ -825,7 +825,7 @@ public class MasterRpcServices extends RSRpcServices } if (descriptorMap != null) { for(HTableDescriptor desc: descriptorMap.values()) { - if(!desc.getTableName().isSystemTable()) { + if(!(!req.getIncludeSysTables() && desc.getTableName().isSystemTable())) { descriptors.add(desc); } } @@ -855,23 +855,23 @@ public class MasterRpcServices extends RSRpcServices matched = pat.matcher(defaultNameSpace + TableName.NAMESPACE_DELIM + tableName) .matches(); } - if (!matched) + if (!matched) { itr.remove(); } + } } if (master.cpHost != null) { try { master.cpHost.postGetTableDescriptors(descriptors); // method required for AccessController. - master.cpHost.postGetTableDescriptors(descriptors, regex); + master.cpHost.postGetTableDescriptors(tableNameList, descriptors, regex); } catch (IOException ioe) { throw new ServiceException(ioe); } } } - GetTableDescriptorsResponse.Builder builder = GetTableDescriptorsResponse.newBuilder(); for (HTableDescriptor htd: descriptors) { builder.addTableSchema(htd.convert()); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java index 1218368..838a0d1 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java @@ -974,7 +974,7 @@ public class AccessController extends BaseMasterAndRegionObserver TableName tableName, final HTableDescriptor htd) throws IOException { final Configuration conf = c.getEnvironment().getConfiguration(); // default the table owner to current user, if not specified. - final String owner = (htd.getOwnerString() != null) ? htd.getOwnerString() : + final String owner = (htd.getOwnerString() != null) ? htd.getOwnerString() : getActiveUser().getShortName(); User.runAsLoginUser(new PrivilegedExceptionAction() { @Override @@ -2251,39 +2251,34 @@ public class AccessController extends BaseMasterAndRegionObserver List tableNamesList, List descriptors, String regex) throws IOException { // We are delegating the authorization check to postGetTableDescriptors as we don't have - // any concrete set of table names when regex is present. - if(regex == null) { - // If the list is empty, this is a request for all table descriptors and requires GLOBAL - // ADMIN privs. - if (tableNamesList == null || tableNamesList.isEmpty()) { - requireGlobalPermission("getTableDescriptors", Action.ADMIN, null, null); - } + // any concrete set of table names when a regex is present or the full list is requested. + if (regex == null && tableNamesList != null && !tableNamesList.isEmpty()) { // Otherwise, if the requestor has ADMIN or CREATE privs for all listed tables, the // request can be granted. - else { - MasterServices masterServices = ctx.getEnvironment().getMasterServices(); - for (TableName tableName: tableNamesList) { - // Skip checks for a table that does not exist - if (!masterServices.getTableStateManager().isTablePresent(tableName)) - continue; - requirePermission("getTableDescriptors", tableName, null, null, - Action.ADMIN, Action.CREATE); - } + MasterServices masterServices = ctx.getEnvironment().getMasterServices(); + for (TableName tableName: tableNamesList) { + // Skip checks for a table that does not exist + if (!masterServices.getTableStateManager().isTablePresent(tableName)) + continue; + requirePermission("getTableDescriptors", tableName, null, null, + Action.ADMIN, Action.CREATE); } } } @Override public void postGetTableDescriptors(ObserverContext ctx, - List descriptors, String regex) throws IOException { + List tableNamesList, List descriptors, + String regex) throws IOException { // Skipping as checks in this case are already done by preGetTableDescriptors. - if (regex == null) { + if (regex == null && tableNamesList != null && !tableNamesList.isEmpty()) { return; } int numMatchedTables = descriptors.size(); // Retains only those which passes authorization checks, as the checks weren't done as part // of preGetTableDescriptors. - for(Iterator itr = descriptors.iterator(); itr.hasNext();) { + Iterator itr = descriptors.iterator(); + while (itr.hasNext()) { HTableDescriptor htd = itr.next(); try { requirePermission("getTableDescriptors", htd.getTableName(), null, null, @@ -2365,7 +2360,7 @@ public class AccessController extends BaseMasterAndRegionObserver final String namespace, final Quotas quotas) throws IOException { requirePermission("setNamespaceQuota", Action.ADMIN); } - + @Override public ReplicationEndpoint postCreateReplicationEndPoint( ObserverContext ctx, ReplicationEndpoint endpoint) { diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java index 8fc4471..2a11d81 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/coprocessor/TestMasterObserver.java @@ -773,11 +773,6 @@ public class TestMasterObserver { postDeleteSnapshotCalled = true; } - @Override - public void preGetTableDescriptors(ObserverContext ctx, - List tableNamesList, List descriptors) throws IOException { - } - public boolean wasDeleteSnapshotCalled() { return preDeleteSnapshotCalled && postDeleteSnapshotCalled; } @@ -1011,9 +1006,7 @@ public class TestMasterObserver { @Override public void preGetTableDescriptors(ObserverContext ctx, - List tableNamesList, List descriptors, String regex) - throws IOException { - preGetTableDescriptorsCalled = true; + List tableNamesList, List descriptors) throws IOException { } @Override @@ -1022,8 +1015,16 @@ public class TestMasterObserver { } @Override + public void preGetTableDescriptors(ObserverContext ctx, + List tableNamesList, List descriptors, String regex) + throws IOException { + preGetTableDescriptorsCalled = true; + } + + @Override public void postGetTableDescriptors(ObserverContext ctx, - List descriptors, String regex) throws IOException { + List tableNamesList, List descriptors, + String regex) throws IOException { postGetTableDescriptorsCalled = true; } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java index 0aeb346..b8a3fb2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestAccessController.java @@ -260,7 +260,7 @@ public class TestAccessController extends SecureTestUtil { try { assertEquals(4, AccessControlClient.getUserPermissions(conf, TEST_TABLE.toString()).size()); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.getUserPermissions. " + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.getUserPermissions. ", e); } } @@ -2142,7 +2142,7 @@ public class TestAccessController extends SecureTestUtil { grantOnTableUsingAccessControlClient(TEST_UTIL, conf, testGrantRevoke.getShortName(), TEST_TABLE.getTableName(), null, null, Permission.Action.READ); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.grant. " + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.grant. ", e); } // Now testGrantRevoke should be able to read also @@ -2153,7 +2153,7 @@ public class TestAccessController extends SecureTestUtil { revokeFromTableUsingAccessControlClient(TEST_UTIL, conf, testGrantRevoke.getShortName(), TEST_TABLE.getTableName(), null, null, Permission.Action.READ); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.revoke " + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.revoke ", e); } // Now testGrantRevoke shouldn't be able read @@ -2183,7 +2183,7 @@ public class TestAccessController extends SecureTestUtil { grantOnNamespaceUsingAccessControlClient(TEST_UTIL, conf, testNS.getShortName(), TEST_TABLE.getTableName().getNamespaceAsString(), Permission.Action.READ); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.grant. " + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.grant. ", e); } // Now testNS should be able to read also @@ -2194,7 +2194,7 @@ public class TestAccessController extends SecureTestUtil { revokeFromNamespaceUsingAccessControlClient(TEST_UTIL, conf, testNS.getShortName(), TEST_TABLE.getTableName().getNamespaceAsString(), Permission.Action.READ); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.revoke " + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.revoke ", e); } // Now testNS shouldn't be able read @@ -2427,8 +2427,7 @@ public class TestAccessController extends SecureTestUtil { try { return AccessControlClient.getUserPermissions(conf, regex); } catch (Throwable e) { - LOG.error("error during call of AccessControlClient.getUserPermissions. " - + e.getStackTrace()); + LOG.error("error during call of AccessControlClient.getUserPermissions.", e); return null; } } @@ -2438,8 +2437,10 @@ public class TestAccessController extends SecureTestUtil { @Test public void testAccessControlClientUserPerms() throws Exception { // adding default prefix explicitly as it is not included in the table name. - final String regex = TEST_TABLE.getTableName().getNamespaceAsString() + ":" - + TEST_TABLE.getTableName().getNameAsString(); + assertEquals(NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR, + TEST_TABLE.getTableName().getNamespaceAsString()); + final String regex = NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR + + TableName.NAMESPACE_DELIM + TEST_TABLE.getTableName().getNameAsString(); User testUserPerms = User.createUserForTesting(conf, "testUserPerms", new String[0]); assertNull(testUserPerms.runAs(getPrivilegedAction(regex))); // Grant TABLE ADMIN privs to testUserPerms @@ -2470,20 +2471,30 @@ public class TestAccessController extends SecureTestUtil { // creating the ns and table in it String ns = "testNamespace"; NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build(); - final TableName table2 = TableName.valueOf(ns + ":" + tableName); + final TableName table2 = TableName.valueOf(ns, tableName); TEST_UTIL.getMiniHBaseCluster().getMaster().createNamespace(desc); htd = new HTableDescriptor(table2); htd.addFamily(new HColumnDescriptor(family)); admin.createTable(htd); + TEST_UTIL.waitUntilAllRegionsAssigned(table2); + + // Verify that we can read sys-tables + assertEquals(1, SUPERUSER.runAs(getPrivilegedAction("hbase:acl")).size()); // Grant TABLE ADMIN privs to testUserPerms + assertEquals(null, testRegexHandler.runAs(getPrivilegedAction(".*"))); grantOnTable(TEST_UTIL, testRegexHandler.getShortName(), table1, null, null, Action.ADMIN); + assertEquals(2, testRegexHandler.runAs(getPrivilegedAction(".*")).size()); grantOnTable(TEST_UTIL, testRegexHandler.getShortName(), table2, null, null, Action.ADMIN); + assertEquals(4, testRegexHandler.runAs(getPrivilegedAction(".*")).size()); // USER_ADMIN, testUserPerms must have a row each. assertEquals(2, testRegexHandler.runAs(getPrivilegedAction(tableName)).size()); - assertEquals(2, testRegexHandler.runAs(getPrivilegedAction("default:" + tableName)).size()); - assertEquals(2, testRegexHandler.runAs(getPrivilegedAction(ns + ":" + tableName)).size()); + assertEquals(2, testRegexHandler.runAs(getPrivilegedAction( + NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR + TableName.NAMESPACE_DELIM + tableName) + ).size()); + assertEquals(2, testRegexHandler.runAs(getPrivilegedAction( + ns + TableName.NAMESPACE_DELIM + tableName)).size()); assertEquals(0, testRegexHandler.runAs(getPrivilegedAction("notMatchingAny")).size()); TEST_UTIL.deleteTable(table1);