From 86922eb08ba5b1f00966f22e0e0e4bb26fde1956 Mon Sep 17 00:00:00 2001 From: Kota-SH Date: Thu, 12 Mar 2026 19:05:36 -0400 Subject: [PATCH] HBASE-29992: Implement regex check for configured replica suffix --- .../org/apache/hadoop/hbase/TableName.java | 6 +++++ .../apache/hadoop/hbase/TestTableName.java | 24 +++++++++++++++++++ 2 files changed, 30 insertions(+) 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 73008c7ad5fd..263ed91103e3 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 @@ -70,6 +70,7 @@ public final class TableName implements Comparable { // with NAMESPACE_DELIM as delimiter public static final String VALID_USER_TABLE_REGEX = "(?:(?:(?:" + VALID_NAMESPACE_REGEX + "\\" + NAMESPACE_DELIM + ")?)" + "(?:" + VALID_TABLE_QUALIFIER_REGEX + "))"; + public static final String VALID_META_TABLE_SUFFIX_REGEX = "[a-zA-Z0-9]+"; /** * The name of hbase meta table could either be hbase:meta_xxx or 'hbase:meta' otherwise. Config @@ -96,6 +97,11 @@ public static TableName initializeHbaseMetaTableName(Configuration conf) { if (Strings.isNullOrEmpty(suffix_val)) { return valueOf(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "meta"); } else { + if (!suffix_val.matches(VALID_META_TABLE_SUFFIX_REGEX)) { + throw new IllegalArgumentException("Invalid value '" + suffix_val + "' for config '" + + HConstants.HBASE_META_TABLE_SUFFIX + "'. Suffix must only contain ASCII letters and " + + "digits matching: " + VALID_META_TABLE_SUFFIX_REGEX); + } return valueOf(NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR, "meta_" + suffix_val); } } 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 d9281d8953e8..7c5f7664d023 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 @@ -25,6 +25,7 @@ import java.nio.ByteBuffer; import java.util.HashMap; import java.util.Map; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.testclassification.MiscTests; import org.apache.hadoop.hbase.testclassification.SmallTests; import org.apache.hadoop.hbase.util.Bytes; @@ -164,4 +165,27 @@ private TableName validateNames(TableName expected, Names names) { assertArrayEquals(expected.getNamespace(), names.nsb); return expected; } + + @Test + public void testValidMetaTableSuffix() { + String[] validSuffixes = { "REPL1", "123", "123abc" }; + for (String suffix : validSuffixes) { + Configuration conf = HBaseConfiguration.create(); + conf.set(HConstants.HBASE_META_TABLE_SUFFIX, suffix); + TableName metaTableName = TableName.initializeHbaseMetaTableName(conf); + assertEquals("hbase:meta_" + suffix, metaTableName.getNameAsString()); + } + } + + @Test + public void testInvalidMetaTableSuffix() { + String[] invalidSuffixes = { "test_1", "test-1", "test.1", "test 1", "_test", + "-test", ".test", "has!special", "has:colon", " " }; + for (String suffix : invalidSuffixes) { + Configuration conf = HBaseConfiguration.create(); + conf.set(HConstants.HBASE_META_TABLE_SUFFIX, suffix); + assertThrows("Expected IllegalArgumentException for suffix: " + suffix, + IllegalArgumentException.class, () -> TableName.initializeHbaseMetaTableName(conf)); + } + } }