--- .../java/org/apache/hadoop/hbase/TableName.java | 39 ++++++++++++++++-- .../master/handler/TestEnableTableHandler.java | 3 +- .../apache/hadoop/hbase/util/TestTableName.java | 47 +++++++++++++++++++++- 3 files changed, 83 insertions(+), 6 deletions(-) diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java index 198a5eb..739d83c 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java @@ -18,9 +18,13 @@ package org.apache.hadoop.hbase; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.KeyValue.KVComparator; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.classification.InterfaceStability; -import org.apache.hadoop.hbase.KeyValue.KVComparator; import org.apache.hadoop.hbase.util.Bytes; import java.nio.ByteBuffer; @@ -55,6 +59,7 @@ import java.util.concurrent.CopyOnWriteArraySet; @InterfaceAudience.Public @InterfaceStability.Evolving public final class TableName implements Comparable { + private static final Log LOG = LogFactory.getLog(TableName.class); /** See {@link #createTableNameIfNecessary(ByteBuffer, ByteBuffer)} */ private static final Set tableCache = new CopyOnWriteArraySet(); @@ -78,9 +83,11 @@ public final class TableName implements Comparable { "(?:(?:(?:"+VALID_NAMESPACE_REGEX+"\\"+NAMESPACE_DELIM+")?)" + "(?:"+VALID_TABLE_QUALIFIER_REGEX+"))"; - /** The hbase:meta table's name. */ - public static final TableName META_TABLE_NAME = - valueOf(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "meta"); + public static final String DEFAULT_META_TABLE_NAME_STR = "meta"; + public static final String META_TABLE_SUFFIX = "hbase.meta.table.suffix"; + + /** The meta table's name. */ + public static final TableName META_TABLE_NAME = getMetaTableName(HBaseConfiguration.create()); /** The Namespace table's name. */ public static final TableName NAMESPACE_TABLE_NAME = @@ -524,4 +531,28 @@ public final class TableName implements Comparable { } return KeyValue.COMPARATOR; } + + public static TableName getMetaTableName(Configuration conf) { + String metaTableName = DEFAULT_META_TABLE_NAME_STR; + String metaTableSuffix = conf.get(META_TABLE_SUFFIX, ""); + + if(isValidMetaTableSuffix(metaTableSuffix)) { + metaTableName = DEFAULT_META_TABLE_NAME_STR + "_" + metaTableSuffix; + } + return (valueOf(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, metaTableName)); + } + + public static boolean isValidMetaTableSuffix(String metaTableSuffix) { + if(StringUtils.isBlank(metaTableSuffix)) { + return false; + } + + try { + isLegalTableQualifierName(Bytes.toBytes(metaTableSuffix)); + } catch(IllegalArgumentException iae) { + LOG.warn("Invalid meta table suffix", iae); + return false; + } + return true; + } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java index 2871340..bc9d283 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/master/handler/TestEnableTableHandler.java @@ -66,7 +66,8 @@ public class TestEnableTableHandler { @Before public void setUp() throws Exception { - TEST_UTIL.getConfiguration().set("hbase.balancer.tablesOnMaster", "hbase:meta"); + TEST_UTIL.getConfiguration().set("hbase.balancer.tablesOnMaster", TableName.META_TABLE_NAME + .getNameAsString()); TEST_UTIL.getConfiguration(). setInt(HConstants.REGION_SERVER_HIGH_PRIORITY_HANDLER_COUNT, 10); TEST_UTIL.getConfiguration().set(CoprocessorHost.MASTER_COPROCESSOR_CONF_KEY, diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestTableName.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestTableName.java index 69f2d18..12ca56a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestTableName.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/util/TestTableName.java @@ -23,11 +23,15 @@ import java.util.Map; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import org.apache.hadoop.hbase.testclassification.MediumTests; +import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.testclassification.MediumTests; import org.junit.Test; import org.junit.experimental.categories.Category; import org.junit.rules.TestWatcher; @@ -61,6 +65,10 @@ public class TestTableName extends TestWatcher { String illegalTableNames[] = { ".dot_start_illegal", "-dash_start_illegal", "spaces not ok", "-dash-.start_illegal", "new.table with space", "01 .table", "ns:-illegaldash", "new:.illegaldot", "new:illegalcolon1:", "new:illegalcolon1:2"}; + String legalMetaTableSuffixNames[] = { "foo", "with-dash_under.dot", "_under_start_ok", + "with-dash.with_underscore", "02-01-2012.my_table_01-02", "xyz._mytable_", "9_9_0.table_02" + , "dot1.dot2.table", "new.-mytable", "with-dash.with.dot", "legal..t2", "legal..legal.t2", + "trailingdots..", "trailing.dots..."}; @Test(expected = IllegalArgumentException.class) @@ -176,6 +184,43 @@ public class TestTableName extends TestWatcher { } + + @Test + public void testEmptyMetaTableSuffix() { + assertFalse(TableName.isValidMetaTableSuffix(null)); + for (String tn : emptyNames) { + assertFalse(TableName.isValidMetaTableSuffix(tn)); + } + } + + @Test + public void testLegalMetaTableSuffix() { + for (String tn : legalMetaTableSuffixNames) { + assertTrue(TableName.isValidMetaTableSuffix(tn)); + } + } + + @Test + public void testIllegalMetaTableSuffix() { + for (String tn : illegalTableNames) { + assertFalse(TableName.isValidMetaTableSuffix(tn)); + } + } + + @Test + public void testMetaTableSuffixWithConfig() { + String metaTableNameWithSuffix = "hbase:meta_server1"; + Configuration conf = new Configuration(); + + // without setting suffix, meta table name should be "hbase:meta" + assertEquals(TableName.getMetaTableName(conf).getNameAsString(), TableName.valueOf( + NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, TableName.DEFAULT_META_TABLE_NAME_STR) + .getNameAsString()); + + conf.set(TableName.META_TABLE_SUFFIX, "server1"); + assertEquals(TableName.getMetaTableName(conf).getNameAsString(), metaTableNameWithSuffix); + } + private TableName validateNames(TableName expected, Names names) { assertEquals(expected.getNameAsString(), names.nn); assertArrayEquals(expected.getName(), names.nnb); -- 2.10.1 (Apple Git-78)