You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by an...@apache.org on 2026/03/13 20:01:16 UTC
(hbase) 08/26: HBASE-29597 Supply meta table name for replica to the tests in TestMe… (#7325)
This is an automated email from the ASF dual-hosted git repository.
andor pushed a commit to branch HBASE-29081_rebased
in repository https://gitbox.apache.org/repos/asf/hbase.git
commit 9e17aff3ac055b8e2268a0557014df2746199f3b
Author: Abhishek Kothalikar <99...@users.noreply.github.com>
AuthorDate: Fri Sep 19 22:26:27 2025 +0530
HBASE-29597 Supply meta table name for replica to the tests in TestMe… (#7325)
* HBASE-29597 Supply meta table name for replica to the tests in TestMetaTableForReplica class
* HBASE-29597 Supply meta table name for replica to the tests in TestMetaTableForReplica class
---
.../hadoop/hbase/TestMetaTableForReplica.java | 76 ++++++++++++++++++++--
1 file changed, 69 insertions(+), 7 deletions(-)
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableForReplica.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableForReplica.java
index d4e3d2c8ce0..7c937eb5c05 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableForReplica.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableForReplica.java
@@ -18,11 +18,15 @@
package org.apache.hadoop.hbase;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
+import java.lang.invoke.MethodHandles;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
@@ -55,6 +59,8 @@ public class TestMetaTableForReplica {
private static final Logger LOG = LoggerFactory.getLogger(TestMetaTableForReplica.class);
private static final HBaseTestingUtil UTIL = new HBaseTestingUtil();
private static Connection connection;
+ private static Field metaTableName;
+ private static Object originalMetaTableName;
@Rule
public TestName name = new TestName();
@@ -66,9 +72,11 @@ public class TestMetaTableForReplica {
c.setInt("hbase.ipc.client.connect.max.retries", 1);
c.setInt(HConstants.ZK_SESSION_TIMEOUT, 1000);
// Start cluster having non-default hbase meta table name
- c.setStrings(HConstants.HBASE_META_TABLE_SUFFIX, "test");
UTIL.startMiniCluster(3);
connection = ConnectionFactory.createConnection(c);
+ // Save the original value of META_TABLE_NAME before any test runs.x
+ metaTableName = TableName.class.getDeclaredField("META_TABLE_NAME");
+ originalMetaTableName = metaTableName.get(null);
}
@AfterClass
@@ -84,18 +92,23 @@ public class TestMetaTableForReplica {
}
@Test
- public void testNameOfMetaForReplica() {
+ public void testMetaTableNameForReplicaWithoutSuffix() throws IOException {
+ testNameOfMetaForReplica();
+ testGetNonExistentRegionFromMetaFromReplica();
+ testGetExistentRegionFromMetaFromReplica();
+ }
+
+ private void testNameOfMetaForReplica() {
// Check the correctness of the meta table for replica
String metaTableName = TableName.META_TABLE_NAME.getNameWithNamespaceInclAsString();
assertNotNull(metaTableName);
- // Check if name of the meta table for replica is not same as default table
+ // Check if name of the meta table for replica is same as the default meta table
assertEquals(0,
TableName.META_TABLE_NAME.compareTo(TableName.getDefaultNameOfMetaForReplica()));
}
- @Test
- public void testGetNonExistentRegionFromMetaFromReplica() throws IOException {
+ private void testGetNonExistentRegionFromMetaFromReplica() throws IOException {
final String name = this.name.getMethodName();
LOG.info("Started " + name);
Pair<RegionInfo, ServerName> pair =
@@ -104,11 +117,60 @@ public class TestMetaTableForReplica {
LOG.info("Finished " + name);
}
- @Test
- public void testGetExistentRegionFromMetaFromReplica() throws IOException {
+ private void testGetExistentRegionFromMetaFromReplica() throws IOException {
final TableName tableName = TableName.valueOf(name.getMethodName());
LOG.info("Started " + tableName);
UTIL.createTable(tableName, HConstants.CATALOG_FAMILY);
assertEquals(1, MetaTableAccessor.getTableRegions(connection, tableName).size());
}
+
+ @Test
+ public void testMetaTableNameForReplicaWithSuffix() throws Exception {
+ // This test actively changes the META_TABLE_NAME to a non-default value and verifies it.
+ Configuration conf = HBaseConfiguration.create();
+ String suffix = "replica1";
+ conf.set(HConstants.HBASE_META_TABLE_SUFFIX, suffix);
+
+ // Re-initialize the static final META_TABLE_NAME for the testing to a non-default value.
+ TableName expectedMetaTableName = TableName.initializeHbaseMetaTableName(conf);
+ setStaticFinalField(metaTableName, expectedMetaTableName);
+
+ TableName currentMetaName = TableName.META_TABLE_NAME;
+ TableName defaultMetaName = TableName.getDefaultNameOfMetaForReplica();
+
+ // The current meta table name is not the default one.
+ assertNotEquals("META_TABLE_NAME should not be the default. ", defaultMetaName,
+ currentMetaName);
+
+ // The current meta table name has the configured suffix.
+ assertEquals("META_TABLE_NAME should have the configured suffix", expectedMetaTableName,
+ currentMetaName);
+
+ // restore default value of META_TABLE_NAME
+ setDefaultMetaTableName();
+ }
+
+ private static void setDefaultMetaTableName() throws Exception {
+ if (originalMetaTableName != null) {
+ setStaticFinalField(metaTableName, originalMetaTableName);
+ }
+ }
+
+ /**
+ * A helper method to modify a static final field using reflection. This is necessary for testing
+ * code that reads a configuration only once during class loading.
+ * @param field The field to modify.
+ * @param newValue The new value to set.
+ * @throws Exception if reflection fails.
+ */
+ private static void setStaticFinalField(Field field, Object newValue) throws Exception {
+ field.setAccessible(true);
+ // Using MethodHandles to get a trusted lookup with the necessary permissions to modify it.
+ // NOTE: For this to work, the JVM running the test must be started with arguments like:
+ // --add-opens=java.base/java.lang.reflect=ALL-UNNAMED
+ var lookup = MethodHandles.privateLookupIn(Field.class, MethodHandles.lookup());
+ var handle = lookup.findVarHandle(Field.class, "modifiers", int.class);
+ handle.set(field, field.getModifiers() & ~Modifier.FINAL);
+ field.set(null, newValue);
+ }
}