From c48201b01072f7e07565688b4fa67d7224e6c015 Mon Sep 17 00:00:00 2001 From: Kangwei Zhu Date: Sun, 28 Sep 2025 18:54:54 -0400 Subject: [PATCH] HIVE-29231: Fix flaky TestEmbeddedHiveMetaStore.testDatabase by enforcing deterministic database lookup The test org.apache.hadoop.hive.metastore.TestEmbeddedHiveMetaStore.testDatabase(standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java) passed using normal maven-test, but showed Non-deterministic behavior under NonDex(https://github.com/TestingResearchIllinois/NonDex) and thus failed. NonDex is a tool for detecting hidden assumptions in code by exploring non-deterministic behaviors of specifications that allow multiple valid implementations. Some of the error messages are: ``` Build Failure observed: java.lang.AssertionError: first database is not testdb1 in list: [] ``` Steps to reproduce: ``` mvn -pl standalone-metastore/metastore-server edu.illinois:nondex-maven-plugin:2.2.1:nondex -Dtest=org.apache.hadoop.hive.metastore.TestEmbeddedHiveMetaStore#testDatabase ``` Root cause: The test asserted database existence using getDatabases(".*") which relies on cached database lists that may return stale results when nondex randomizes test execution. This led to nondeterministic test outcomes where databases existed but were not found in the cached list. Fix: Replace getDatabases(".*") with direct getDatabase(name) calls in TestHiveMetaStore class's testDatabase method. This ensures consistent behavior regardless of test shuffling. Additionally, I believe this improve the harness of tests without altering and damaging the core database operations being tested(add, find, drop). Confirm Fixed: re-run ``` mvn -pl standalone-metastore/metastore-server edu.illinois:nondex-maven-plugin:2.2.1:nondex -Dtest=org.apache.hadoop.hive.metastore.TestEmbeddedHiveMetaStore#testDatabase ``` And the result is Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, BUILD SUCCESS --- .../apache/hadoop/hive/metastore/TestHiveMetaStore.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java index 7abce0f58e17..d8d09bedeac9 100644 --- a/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java +++ b/standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java @@ -1225,10 +1225,11 @@ public void testDatabase() throws Throwable { assertEquals("location of the returned db is different from that of inserted db", warehouse.getDatabasePath(db2).toString(), db2.getLocationUri()); - List dbs = client.getDatabases(".*"); - - assertTrue("first database is not " + TEST_DB1_NAME, dbs.contains(TEST_DB1_NAME)); - assertTrue("second database is not " + TEST_DB2_NAME, dbs.contains(TEST_DB2_NAME)); + Database verifyDb1 = client.getDatabase(TEST_DB1_NAME); + assertNotNull("first database is not " + TEST_DB1_NAME, verifyDb1); + + Database verifyDb2 = client.getDatabase(TEST_DB2_NAME); + assertNotNull("second database is not " + TEST_DB2_NAME, verifyDb2); client.dropDatabase(TEST_DB1_NAME); client.dropDatabase(TEST_DB2_NAME);