diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 759822a..bab4c57 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -596,6 +596,12 @@ public class HBaseAdmin implements Admin { if(desc.getTableName() == null) { throw new IllegalArgumentException("TableName cannot be null"); } + String tableName = desc.getTableName().getNameAsString(); + if (HConstants.HBASE_NON_TABLE_DIRS.contains(tableName)) { + LOG.info("Is not allowed create tables names with: " + + HConstants.HBASE_NON_TABLE_DIRS); + throw new IllegalArgumentException("Table name: " + tableName + ", not valid."); + } if(splitKeys != null && splitKeys.length > 0) { Arrays.sort(splitKeys, Bytes.BYTES_COMPARATOR); // Verify there are no duplicate split keys diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java index 82c2123..7dd2b4c 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin.java @@ -345,6 +345,24 @@ public class TestAdmin { } @Test (timeout=300000) + public void testCreateTableWithInvalidName() throws IOException, + IllegalArgumentException { + int quantityTablesBefore = admin.listTableNames().length; + for (String tableName : HConstants.HBASE_NON_TABLE_DIRS) { + try { + LOG.info("Test creation invalid table name: " + tableName); + TEST_UTIL.createTable(Bytes.toBytes(tableName), + HConstants.CATALOG_FAMILY).close(); + } catch (IllegalArgumentException iae) { + LOG.info("Invalid table name: " + tableName + " not created."); + continue; + } + } + int quantityTablesAfter = admin.listTableNames().length; + assertEquals(quantityTablesBefore, quantityTablesAfter); + } + + @Test (timeout=300000) public void testGetTableDescriptor() throws IOException { HColumnDescriptor fam1 = new HColumnDescriptor("fam1"); HColumnDescriptor fam2 = new HColumnDescriptor("fam2"); diff --git hbase-shell/src/main/ruby/hbase.rb hbase-shell/src/main/ruby/hbase.rb index 3c09c4d..786481c 100644 --- hbase-shell/src/main/ruby/hbase.rb +++ hbase-shell/src/main/ruby/hbase.rb @@ -40,6 +40,7 @@ module HBaseConstants VERSIONS = org.apache.hadoop.hbase.HConstants::VERSIONS IN_MEMORY = org.apache.hadoop.hbase.HConstants::IN_MEMORY METADATA = org.apache.hadoop.hbase.HConstants::METADATA + HBASE_NON_TABLE_DIRS = org.apache.hadoop.hbase.HConstants::HBASE_NON_TABLE_DIRS STOPROW = "STOPROW" STARTROW = "STARTROW" ENDROW = STOPROW diff --git hbase-shell/src/main/ruby/hbase/admin.rb hbase-shell/src/main/ruby/hbase/admin.rb index 5cb7903..16ce3f1 100644 --- hbase-shell/src/main/ruby/hbase/admin.rb +++ hbase-shell/src/main/ruby/hbase/admin.rb @@ -196,6 +196,13 @@ module Hbase def create(table_name, *args) # Fail if table name is not a string raise(ArgumentError, "Table name must be of type String") unless table_name.kind_of?(String) + # Check allowed table name + is_invalid_table_name = HBASE_NON_TABLE_DIRS.include? table_name + if is_invalid_table_name + error_msg = "Is not allowed create tables names with: " + HBASE_NON_TABLE_DIRS.to_s + print error_msg + raise(ArgumentError, "Table name: " + table_name + ", not valid.") + end # Flatten params array args = args.flatten.compact