You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2017/09/07 19:54:39 UTC

hbase git commit: Add support for specifying custom meta table suffix

Repository: hbase
Updated Branches:
  refs/heads/HBASE-18477 e0d0beceb -> 8e866d6ee


Add support for specifying custom meta table suffix

Signed-off-by: tedyu <yu...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8e866d6e
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8e866d6e
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8e866d6e

Branch: refs/heads/HBASE-18477
Commit: 8e866d6eebc07572da6dec69f2229ac9452694b3
Parents: e0d0bec
Author: Ajay Jadhav <ja...@amazon.com>
Authored: Fri Sep 1 17:14:57 2017 -0700
Committer: tedyu <yu...@gmail.com>
Committed: Thu Sep 7 12:52:48 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/hadoop/hbase/TableName.java | 43 +++++++++++++++++--
 .../org/apache/hadoop/hbase/TestTableName.java  | 45 +++++++++++++++++++-
 2 files changed, 82 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8e866d6e/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java
----------------------------------------------------------------------
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 3477098..e838146 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
@@ -24,9 +24,15 @@ import java.util.Arrays;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 
+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.util.Bytes;
-import org.apache.hadoop.hbase.KeyValue.KVComparator;
+
+import org.apache.hadoop.hbase.shaded.com.google.common.annotations.VisibleForTesting;
 
 /**
  * Immutable POJO class for representing a table name.
@@ -54,6 +60,7 @@ import org.apache.hadoop.hbase.KeyValue.KVComparator;
  */
 @InterfaceAudience.Public
 public final class TableName implements Comparable<TableName> {
+  private static final Log LOG = LogFactory.getLog(TableName.class);
 
   /** See {@link #createTableNameIfNecessary(ByteBuffer, ByteBuffer)} */
   private static final Set<TableName> tableCache = new CopyOnWriteArraySet<>();
@@ -77,9 +84,11 @@ public final class TableName implements Comparable<TableName> {
       "(?:(?:(?:"+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 =
@@ -551,4 +560,30 @@ public final class TableName implements Comparable<TableName> {
     }
     return KeyValue.COMPARATOR;
   }
+
+  @VisibleForTesting
+  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));
+  }
+
+  @VisibleForTesting
+  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;
+  }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/8e866d6e/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTableName.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTableName.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTableName.java
index 54e25e8..69f9014 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTableName.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestTableName.java
@@ -23,12 +23,14 @@ 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.conf.Configuration;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.MediumTests;
-import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -63,7 +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)
   public void testInvalidNamespace() {
@@ -178,6 +183,42 @@ 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);