This is an automated email from the ASF dual-hosted git repository.

morrysnow pushed a commit to branch branch-3.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.1 by this push:
     new b514d23eb57 branch-3.1: [fix](catalog) fix behavior of metadata sync 
between FE #53371 (#53581)
b514d23eb57 is described below

commit b514d23eb57eb5c2fa51faf30a81379e4c948be9
Author: Mingyu Chen (Rayner) <[email protected]>
AuthorDate: Sun Jul 20 19:42:18 2025 -0700

    branch-3.1: [fix](catalog) fix behavior of metadata sync between FE #53371 
(#53581)
    
    bp #53371
---
 .../doris/catalog/MysqlCompatibleDatabase.java     |   5 -
 .../org/apache/doris/catalog/RefreshManager.java   |  26 ++---
 .../apache/doris/datasource/ExternalCatalog.java   |  53 ++++++++-
 .../apache/doris/datasource/ExternalDatabase.java  | 130 ++++++++++++++-------
 .../apache/doris/datasource/ExternalObjectLog.java |   3 +-
 .../doris/datasource/hive/HMSExternalCatalog.java  |  19 ---
 .../doris/datasource/hive/HiveMetadataOps.java     |  21 ++--
 .../hive/event/MetastoreEventsProcessor.java       |   2 +-
 .../datasource/iceberg/IcebergMetadataCache.java   |  18 +++
 .../datasource/iceberg/IcebergMetadataOps.java     |  12 +-
 .../doris/datasource/metacache/MetaCache.java      |  22 ++++
 .../apache/doris/persist/TruncateTableInfo.java    |   2 +-
 .../main/java/org/apache/doris/qe/DdlExecutor.java |   3 +-
 .../hadoop/hive/metastore/HiveMetaStoreClient.java |   4 +
 .../doris/datasource/RefreshCatalogTest.java       |   6 +
 .../hive/test_hive_case_sensibility.out            | Bin 4125 -> 4398 bytes
 .../hive/test_hive_use_meta_cache.out              | Bin 2089 -> 2147 bytes
 .../hive/test_hive_use_meta_cache_false.out        | Bin 0 -> 1387 bytes
 .../hive/test_hive_use_meta_cache_true.out         | Bin 0 -> 1415 bytes
 .../test_meta_cache_select_without_refresh.out     | Bin 340 -> 361 bytes
 .../hive/test_hive_case_sensibility.groovy         |   4 +
 ...roovy => test_hive_use_meta_cache_false.groovy} |  40 +++++--
 ...groovy => test_hive_use_meta_cache_true.groovy} |  19 +--
 .../test_meta_cache_select_without_refresh.groovy  |   6 +-
 .../tvf/test_file_tvf_hdfs.groovy                  |  10 +-
 25 files changed, 267 insertions(+), 138 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
index 8bbdfe1d5fd..fd6fab1ab4e 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MysqlCompatibleDatabase.java
@@ -41,11 +41,6 @@ public abstract class MysqlCompatibleDatabase extends 
Database {
      */
     protected abstract void initTables();
 
-    @Override
-    public void unregisterTable(String name) {
-        // Do nothing
-    }
-
     /**
      * MysqlCompatibleDatabase will not be persisted to bdb.
      * It will be constructed everytime the fe starts. See
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
index ab0f093988d..685a1baee9c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
@@ -17,7 +17,6 @@
 
 package org.apache.doris.catalog;
 
-import org.apache.doris.analysis.RefreshCatalogStmt;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ThreadPoolManager;
 import org.apache.doris.common.UserException;
@@ -30,7 +29,6 @@ import org.apache.doris.datasource.ExternalTable;
 import org.apache.doris.datasource.InternalCatalog;
 import org.apache.doris.datasource.hive.HMSExternalTable;
 import org.apache.doris.persist.OperationType;
-import org.apache.doris.qe.DdlExecutor;
 
 import com.google.common.base.Strings;
 import com.google.common.collect.Maps;
@@ -74,13 +72,13 @@ public class RefreshManager {
     private void refreshCatalogInternal(CatalogIf catalog, boolean 
invalidCache) {
         String catalogName = catalog.getName();
         if (!catalogName.equals(InternalCatalog.INTERNAL_CATALOG_NAME)) {
-            ((ExternalCatalog) catalog).onRefreshCache(invalidCache);
+            ((ExternalCatalog) catalog).resetToUninitialized(invalidCache);
             LOG.info("refresh catalog {} with invalidCache {}", catalogName, 
invalidCache);
         }
     }
 
     // Refresh database
-    public void handleRefreshDb(String catalogName, String dbName, boolean 
invalidCache) throws DdlException {
+    public void handleRefreshDb(String catalogName, String dbName) throws 
DdlException {
         Env env = Env.getCurrentEnv();
         CatalogIf catalog = catalogName != null ? 
env.getCatalogMgr().getCatalog(catalogName) : env.getCurrentCatalog();
         if (catalog == null) {
@@ -90,9 +88,9 @@ public class RefreshManager {
             throw new DdlException("Only support refresh database in external 
catalog");
         }
         DatabaseIf db = catalog.getDbOrDdlException(dbName);
-        refreshDbInternal((ExternalDatabase) db, invalidCache);
+        refreshDbInternal((ExternalDatabase) db);
 
-        ExternalObjectLog log = 
ExternalObjectLog.createForRefreshDb(catalog.getId(), db.getFullName(), 
invalidCache);
+        ExternalObjectLog log = 
ExternalObjectLog.createForRefreshDb(catalog.getId(), db.getFullName());
         Env.getCurrentEnv().getEditLog().logRefreshExternalDb(log);
     }
 
@@ -111,17 +109,13 @@ public class RefreshManager {
         if (!db.isPresent()) {
             LOG.warn("failed to find db when replaying refresh db: {}", 
log.debugForRefreshDb());
         } else {
-            refreshDbInternal(db.get(), log.isInvalidCache());
+            refreshDbInternal(db.get());
         }
     }
 
-    private void refreshDbInternal(ExternalDatabase db, boolean invalidCache) {
-        db.setUnInitialized();
-        if (invalidCache) {
-            
Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(db.getCatalog().getId(),
 db.getFullName());
-        }
-        LOG.info("refresh database {} in catalog {} with invalidCache {}", 
db.getFullName(),
-                db.getCatalog().getName(), invalidCache);
+    private void refreshDbInternal(ExternalDatabase db) {
+        db.resetToUninitialized();
+        LOG.info("refresh database {} in catalog {}", db.getFullName(), 
db.getCatalog().getName());
     }
 
     // Refresh table
@@ -287,12 +281,12 @@ public class RefreshManager {
                          * {@link 
org.apache.doris.analysis.RefreshCatalogStmt#analyze(Analyzer)} is ok,
                          * because the default value of invalidCache is true.
                          * */
-                        RefreshCatalogStmt refreshCatalogStmt = new 
RefreshCatalogStmt(catalogName, null);
                         try {
-                            DdlExecutor.execute(Env.getCurrentEnv(), 
refreshCatalogStmt);
+                            
Env.getCurrentEnv().getRefreshManager().handleRefreshCatalog(catalogName, true);
                         } catch (Exception e) {
                             LOG.warn("failed to refresh catalog {}", 
catalogName, e);
                         }
+
                         // reset
                         timeGroup[1] = original;
                         refreshMap.put(catalogId, timeGroup);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
index f02d77e7e68..89585ece459 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java
@@ -344,6 +344,9 @@ public abstract class ExternalCatalog
 
     private void buildMetaCache() {
         if (metaCache == null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("buildMetaCache for catalog: {}:{}", this.name, 
this.id, new Exception());
+            }
             metaCache = 
Env.getCurrentEnv().getExtMetaCacheMgr().buildMetaCache(
                     name,
                     
OptionalLong.of(Config.external_cache_expire_time_seconds_after_access),
@@ -353,7 +356,7 @@ public abstract class ExternalCatalog
                     localDbName -> Optional.ofNullable(
                             buildDbForInit(null, localDbName, 
Util.genIdByName(name, localDbName), logType,
                                     true)),
-                    (key, value, cause) -> value.ifPresent(v -> 
v.setUnInitialized()));
+                    (key, value, cause) -> value.ifPresent(v -> 
v.resetToUninitialized()));
         }
     }
 
@@ -582,8 +585,9 @@ public abstract class ExternalCatalog
         refreshOnlyCatalogCache(invalidCache);
     }
 
-    public void onRefreshCache(boolean invalidCache) {
-        refreshOnlyCatalogCache(invalidCache);
+    // Only for hms event handling.
+    public void onRefreshCache() {
+        refreshOnlyCatalogCache(true);
     }
 
     private void refreshOnlyCatalogCache(boolean invalidCache) {
@@ -593,7 +597,7 @@ public abstract class ExternalCatalog
             } else if (!useMetaCache.get()) {
                 this.initialized = false;
                 for (ExternalDatabase<? extends ExternalTable> db : 
idToDb.values()) {
-                    db.setUnInitialized();
+                    db.resetToUninitialized();
                 }
             }
         }
@@ -806,7 +810,7 @@ public abstract class ExternalCatalog
         Env.getCurrentEnv().getAccessManager().removeAccessController(name);
     }
 
-    public void replayInitCatalog(InitCatalogLog log) {
+    public synchronized void replayInitCatalog(InitCatalogLog log) {
         // If the remote name is missing during upgrade, or
         // the refresh db's remote name is empty,
         // all databases in the Map will be reinitialized.
@@ -898,6 +902,10 @@ public abstract class ExternalCatalog
     public Optional<ExternalDatabase<? extends ExternalTable>> 
getDbForReplay(String dbName) {
         Preconditions.checkState(useMetaCache.isPresent(), name);
         if (useMetaCache.get()) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("getDbForReplay from metacache, db: {}.{}, catalog 
id: {}, is catalog init: {}",
+                        this.name, dbName, this.id, isInitialized());
+            }
             if (!isInitialized()) {
                 return Optional.empty();
             }
@@ -1176,8 +1184,29 @@ public abstract class ExternalCatalog
         }
     }
 
+    /**
+     * Unregisters a database from the catalog.
+     * Internally, remove the database meta from cache
+     *
+     * @param dbName
+     */
     public void unregisterDatabase(String dbName) {
-        throw new NotImplementedException("unregisterDatabase not 
implemented");
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("unregister database [{}]", dbName);
+        }
+        if (useMetaCache.get()) {
+            if (isInitialized()) {
+                metaCache.invalidate(dbName, Util.genIdByName(name, dbName));
+            }
+        } else {
+            Long dbId = dbNameToId.remove(dbName);
+            if (dbId == null) {
+                LOG.warn("unregister database {}.{} failed, not find in map. 
ignore.", this.name, dbName);
+            } else {
+                idToDb.remove(dbId);
+            }
+        }
+        Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(getId(), 
dbName);
     }
 
     public void registerDatabase(long dbId, String dbName) {
@@ -1448,5 +1477,17 @@ public abstract class ExternalCatalog
             throw e;
         }
     }
+
+    /**
+     * Resets the name list in meta cache.
+     * Usually used after creating database in catalog, so that user can see 
newly created db immediately.
+     */
+    public void resetMetaCacheNames() {
+        if (useMetaCache.isPresent() && useMetaCache.get() && metaCache != 
null) {
+            metaCache.resetNames();
+        } else {
+            resetToUninitialized(true);
+        }
+    }
 }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java
index aae378b75e7..ef6a42ac49d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDatabase.java
@@ -55,6 +55,7 @@ import com.google.gson.internal.LinkedTreeMap;
 import org.apache.commons.lang3.NotImplementedException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.DataInput;
 import java.io.DataOutput;
@@ -134,7 +135,11 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
         }
     }
 
-    public synchronized void setUnInitialized() {
+    public synchronized void resetToUninitialized() {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("resetToUninitialized db name {}, id {}, isInitializing: 
{}, initialized: {}",
+                    this.name, this.id, isInitializing, initialized, new 
Exception());
+        }
         this.initialized = false;
         this.lowerCaseToTableName = Maps.newConcurrentMap();
         if (extCatalog.getUseMetaCache().isPresent()) {
@@ -146,6 +151,7 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
                 }
             }
         }
+        
Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(getCatalog().getId(),
 getFullName());
     }
 
     public boolean isInitialized() {
@@ -181,28 +187,15 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
                 }
                 initialized = true;
             }
+        } catch (Exception e) {
+            LOG.warn("failed to init db {}, id {}, isInitializing: {}, 
initialized: {}",
+                    this.name, this.id, isInitializing, initialized, e);
+            initialized = false;
         } finally {
             isInitializing = false;
         }
     }
 
-    private void buildMetaCache() {
-        if (metaCache == null) {
-            metaCache = 
Env.getCurrentEnv().getExtMetaCacheMgr().buildMetaCache(
-                    name,
-                    
OptionalLong.of(Config.external_cache_expire_time_seconds_after_access),
-                    OptionalLong.of(Config.external_cache_refresh_time_minutes 
* 60L),
-                    Config.max_meta_object_cache_num,
-                    ignored -> listTableNames(),
-                    localTableName -> Optional.ofNullable(
-                            buildTableForInit(null, localTableName,
-                                    Util.genIdByName(extCatalog.getName(), 
name, localTableName),
-                                    extCatalog,
-                                    this, true)),
-                    (key, value, cause) -> 
value.ifPresent(ExternalTable::unsetObjectCreated));
-        }
-    }
-
     public void replayInitDb(InitDatabaseLog log, ExternalCatalog catalog) {
         // If the remote name is missing during upgrade, all tables in the Map 
will be reinitialized.
         if ((log.getCreateCount() > 0 && (log.getRemoteTableNames() == null || 
log.getRemoteTableNames().isEmpty()))
@@ -313,6 +306,26 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
         Env.getCurrentEnv().getEditLog().logInitExternalDb(initDatabaseLog);
     }
 
+    private void buildMetaCache() {
+        if (metaCache == null) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("buildMetaCache for database: {}:{}", this.name, 
this.id, new Exception());
+            }
+            metaCache = 
Env.getCurrentEnv().getExtMetaCacheMgr().buildMetaCache(
+                    name,
+                    
OptionalLong.of(Config.external_cache_expire_time_seconds_after_access),
+                    OptionalLong.of(Config.external_cache_refresh_time_minutes 
* 60L),
+                    Config.max_meta_object_cache_num,
+                    ignored -> listTableNames(),
+                    localTableName -> Optional.ofNullable(
+                            buildTableForInit(null, localTableName,
+                                    Util.genIdByName(extCatalog.getName(), 
name, localTableName),
+                                    extCatalog,
+                                    this, true)),
+                    (key, value, cause) -> 
value.ifPresent(ExternalTable::unsetObjectCreated));
+        }
+    }
+
     private List<Pair<String, String>> listTableNames() {
         List<Pair<String, String>> tableNames;
         lowerCaseToTableName.clear();
@@ -388,12 +401,12 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
             try {
                 List<String> tblNames = 
Lists.newArrayList(getTableNamesWithLock());
                 if (!tblNames.contains(localTableName)) {
-                    tblNames = listTableNames().stream()
-                            .map(Pair::value)
-                            .collect(Collectors.toList());
+                    // reset the table name list to ensure it is up-to-date
+                    resetMetaCacheNames();
+                    tblNames = Lists.newArrayList(getTableNamesWithLock());
                     if (!tblNames.contains(localTableName)) {
-                        LOG.warn("Table {} does not exist in the remote 
system. Skipping initialization.",
-                                localTableName);
+                        LOG.warn("Table {} does not exist in the remote 
database {}. Skipping initialization.",
+                                localTableName, this.name);
                         return null;
                     }
                 }
@@ -468,13 +481,21 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
      */
     public Optional<T> getTableForReplay(String tblName) {
         Preconditions.checkState(extCatalog.getUseMetaCache().isPresent(), 
extCatalog.getName() + "." + name);
+        String localName = getLocalTableName(tblName, true);
+        if (localName == null) {
+            return Optional.empty();
+        }
         if (extCatalog.getUseMetaCache().get()) {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("getTableForReplay from metacache, db: {}.{}, is db 
init: {}",
+                        this.extCatalog.getName(), this.name, isInitialized());
+            }
             if (!isInitialized()) {
                 return Optional.empty();
             }
-            return metaCache.tryGetMetaObj(tblName);
-        } else if (tableNameToId.containsKey(tblName)) {
-            return 
Optional.ofNullable(idToTbl.get(tableNameToId.get(tblName)));
+            return metaCache.tryGetMetaObj(localName);
+        } else if (tableNameToId.containsKey(localName)) {
+            return 
Optional.ofNullable(idToTbl.get(tableNameToId.get(localName)));
         } else {
             return Optional.empty();
         }
@@ -615,6 +636,32 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
     @Override
     public T getTableNullable(String tableName) {
         makeSureInitialized();
+        String finalName = getLocalTableName(tableName, false);
+        if (finalName == null) {
+            return null;
+        }
+        if (extCatalog.getUseMetaCache().get()) {
+            // must use full qualified name to generate id.
+            // otherwise, if 2 databases have the same table name, the id will 
be the same.
+            return metaCache.getMetaObj(finalName,
+                    Util.genIdByName(extCatalog.getName(), name, 
finalName)).orElse(null);
+        } else {
+            if (!tableNameToId.containsKey(finalName)) {
+                return null;
+            }
+            return idToTbl.get(tableNameToId.get(finalName));
+        }
+    }
+
+    /**
+     * Get the local table name based on the given table name.
+     *
+     * @param tableName
+     * @param isReplay, if true, only check local cache, will not visit remote 
system
+     * @return
+     */
+    @Nullable
+    private String getLocalTableName(String tableName, boolean isReplay) {
         String finalName = tableName;
         if (this.isStoredTableNamesLowerCase()) {
             finalName = tableName.toLowerCase();
@@ -622,13 +669,20 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
         if (this.isTableNamesCaseInsensitive()) {
             finalName = lowerCaseToTableName.get(tableName.toLowerCase());
             if (finalName == null) {
+                if (isReplay) {
+                    if (LOG.isDebugEnabled()) {
+                        LOG.debug("failed to get final table name from: 
{}.{}.{}, is replay = true",
+                                getCatalog().getName(), getFullName(), 
tableName);
+                    }
+                    return null;
+                }
                 // Here we need to execute listTableNames() once to fill in 
lowerCaseToTableName
                 // to prevent lowerCaseToTableName from being empty in some 
cases
                 listTableNames();
                 finalName = lowerCaseToTableName.get(tableName.toLowerCase());
                 if (finalName == null) {
                     if (LOG.isDebugEnabled()) {
-                        LOG.info("failed to get final table name from: 
{}.{}.{}",
+                        LOG.debug("failed to get final table name from: 
{}.{}.{}",
                                 getCatalog().getName(), getFullName(), 
tableName);
                     }
                     return null;
@@ -643,17 +697,7 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
             LOG.debug("get table {} from database: {}.{}, final name is: {}, 
catalog id: {}",
                     tableName, getCatalog().getName(), getFullName(), 
finalName, getCatalog().getId());
         }
-        if (extCatalog.getUseMetaCache().get()) {
-            // must use full qualified name to generate id.
-            // otherwise, if 2 databases have the same table name, the id will 
be the same.
-            return metaCache.getMetaObj(finalName,
-                    Util.genIdByName(extCatalog.getName(), name, 
finalName)).orElse(null);
-        } else {
-            if (!tableNameToId.containsKey(finalName)) {
-                return null;
-            }
-            return idToTbl.get(tableNameToId.get(finalName));
-        }
+        return finalName;
     }
 
     @Override
@@ -746,7 +790,7 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
     public void unregisterTable(String tableName) {
         makeSureInitialized();
         if (LOG.isDebugEnabled()) {
-            LOG.debug("try unregister table [{}]", tableName);
+            LOG.debug("unregister table {}.{}", this.name, tableName);
         }
         setLastUpdateTime(System.currentTimeMillis());
         // check if the table exists in cache, it not, does return
@@ -847,4 +891,12 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
         buildMetaCache();
         metaCache.addObjForTest(tbl.getId(), tbl.getName(), tbl);
     }
+
+    public void resetMetaCacheNames() {
+        if (extCatalog.getUseMetaCache().isPresent() && 
extCatalog.getUseMetaCache().get() && metaCache != null) {
+            metaCache.resetNames();
+        } else {
+            resetToUninitialized();
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalObjectLog.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalObjectLog.java
index 04d90c9a049..411d40c07d2 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalObjectLog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalObjectLog.java
@@ -62,11 +62,10 @@ public class ExternalObjectLog implements Writable {
 
     }
 
-    public static ExternalObjectLog createForRefreshDb(long catalogId, String 
dbName, boolean invalidCache) {
+    public static ExternalObjectLog createForRefreshDb(long catalogId, String 
dbName) {
         ExternalObjectLog externalObjectLog = new ExternalObjectLog();
         externalObjectLog.setCatalogId(catalogId);
         externalObjectLog.setDbName(dbName);
-        externalObjectLog.setInvalidCache(invalidCache);
         return externalObjectLog;
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalCatalog.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalCatalog.java
index 502c579fa0e..804e95b1ecd 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalCatalog.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HMSExternalCatalog.java
@@ -227,25 +227,6 @@ public class HMSExternalCatalog extends ExternalCatalog {
         return ((HiveMetadataOps) metadataOps).getClient();
     }
 
-    @Override
-    public void unregisterDatabase(String dbName) {
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("drop database [{}]", dbName);
-        }
-        if (useMetaCache.get()) {
-            if (isInitialized()) {
-                metaCache.invalidate(dbName, Util.genIdByName(name, dbName));
-            }
-        } else {
-            Long dbId = dbNameToId.remove(dbName);
-            if (dbId == null) {
-                LOG.warn("drop database [{}] failed", dbName);
-            }
-            idToDb.remove(dbId);
-        }
-        Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(getId(), 
dbName);
-    }
-
     @Override
     public void registerDatabase(long dbId, String dbName) {
         if (LOG.isDebugEnabled()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
index 8ea7b2fb27a..163cbcc51ce 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java
@@ -126,7 +126,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
 
     @Override
     public void afterCreateDb() {
-        catalog.onRefreshCache(true);
+        catalog.resetMetaCacheNames();
     }
 
     @Override
@@ -167,7 +167,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
 
     @Override
     public void afterDropDb(String dbName) {
-        catalog.onRefreshCache(true);
+        catalog.unregisterDatabase(dbName);
     }
 
     @Override
@@ -289,7 +289,7 @@ public class HiveMetadataOps implements ExternalMetadataOps 
{
     public void afterCreateTable(String dbName, String tblName) {
         Optional<ExternalDatabase<?>> db = catalog.getDbForReplay(dbName);
         if (db.isPresent()) {
-            db.get().setUnInitialized();
+            db.get().resetMetaCacheNames();
         }
         LOG.info("after create table {}.{}.{}, is db exists: {}",
                 getCatalog().getName(), dbName, tblName, db.isPresent());
@@ -321,11 +321,7 @@ public class HiveMetadataOps implements 
ExternalMetadataOps {
     public void afterDropTable(String dbName, String tblName) {
         Optional<ExternalDatabase<?>> db = catalog.getDbForReplay(dbName);
         if (db.isPresent()) {
-            Optional table = db.get().getTableForReplay(tblName);
-            if (table.isPresent()) {
-                
Env.getCurrentEnv().getRefreshManager().refreshTableInternal(db.get(), 
(ExternalTable) table.get(), 0);
-            }
-            db.get().setUnInitialized();
+            db.get().unregisterTable(tblName);
         }
         LOG.info("after drop table {}.{}.{}, is db exists: {}",
                 getCatalog().getName(), dbName, tblName, db.isPresent());
@@ -347,12 +343,11 @@ public class HiveMetadataOps implements 
ExternalMetadataOps {
             // Invalidate cache.
             Optional<ExternalDatabase<?>> db = catalog.getDbForReplay(dbName);
             if (db.isPresent()) {
-                Optional dorisTable = db.get().getTableForReplay(tblName);
-                if (dorisTable.isPresent()) {
-                    
Env.getCurrentEnv().getExtMetaCacheMgr().invalidateTableCache((ExternalTable) 
dorisTable.get());
+                Optional tbl = db.get().getTableForReplay(tblName);
+                if (tbl.isPresent()) {
+                    Env.getCurrentEnv().getRefreshManager()
+                            .refreshTableInternal(db.get(), (ExternalTable) 
tbl.get(), 0);
                 }
-                db.get().setLastUpdateTime(System.currentTimeMillis());
-                db.get().setUnInitialized();
             }
         } catch (Exception e) {
             LOG.warn("exception when calling afterTruncateTable for db: {}, 
table: {}, error: {}",
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventsProcessor.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventsProcessor.java
index 23bf324360b..f053ad5d46a 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventsProcessor.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/event/MetastoreEventsProcessor.java
@@ -128,7 +128,7 @@ public class MetastoreEventsProcessor extends MasterDaemon {
                 } catch (MetastoreNotificationFetchException e) {
                     LOG.warn("Failed to fetch hms events on {}. msg: ", 
hmsExternalCatalog.getName(), e);
                 } catch (Exception ex) {
-                    hmsExternalCatalog.onRefreshCache(true);
+                    hmsExternalCatalog.onRefreshCache();
                     updateLastSyncedEventId(hmsExternalCatalog, -1);
                     LOG.warn("Failed to process hive metastore [{}] events .",
                             hmsExternalCatalog.getName(), ex);
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataCache.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataCache.java
index 01e37a58520..f79c28b39b9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataCache.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataCache.java
@@ -39,6 +39,8 @@ import org.apache.iceberg.ManifestFiles;
 import org.apache.iceberg.Snapshot;
 import org.apache.iceberg.Table;
 import org.apache.iceberg.view.View;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.HashMap;
@@ -48,6 +50,7 @@ import java.util.OptionalLong;
 import java.util.concurrent.ExecutorService;
 
 public class IcebergMetadataCache {
+    private static final Logger LOG = 
LogManager.getLogger(IcebergMetadataCache.class);
 
     private final LoadingCache<IcebergMetadataCacheKey, List<Snapshot>> 
snapshotListCache;
     private final LoadingCache<IcebergMetadataCacheKey, Table> tableCache;
@@ -120,6 +123,9 @@ public class IcebergMetadataCache {
             throw new RuntimeException("Only support 'hms' and 'iceberg' type 
for iceberg table");
         }
         try {
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("load iceberg table {}", nameMapping, new 
Exception());
+            }
             return ((ExternalCatalog) 
catalog).getPreExecutionAuthenticator().execute(()
                     -> ops.loadTable(nameMapping.getRemoteDbName(), 
nameMapping.getRemoteTblName()));
         } catch (Exception e) {
@@ -160,6 +166,10 @@ public class IcebergMetadataCache {
                 .filter(entry -> entry.getKey().nameMapping.getCtlId() == 
catalogId)
                 .forEach(entry -> {
                     ManifestFiles.dropCache(entry.getValue().io());
+                    if (LOG.isDebugEnabled()) {
+                        LOG.info("invalidate iceberg table cache {} when 
invalidating catalog cache",
+                                entry.getKey().nameMapping, new Exception());
+                    }
                     tableCache.invalidate(entry.getKey());
                 });
 
@@ -191,6 +201,10 @@ public class IcebergMetadataCache {
                 })
                 .forEach(entry -> {
                     ManifestFiles.dropCache(entry.getValue().io());
+                    if (LOG.isDebugEnabled()) {
+                        LOG.info("invalidate iceberg table cache {}",
+                                entry.getKey().nameMapping, new Exception());
+                    }
                     tableCache.invalidate(entry.getKey());
                 });
 
@@ -223,6 +237,10 @@ public class IcebergMetadataCache {
                 })
                 .forEach(entry -> {
                     ManifestFiles.dropCache(entry.getValue().io());
+                    if (LOG.isDebugEnabled()) {
+                        LOG.info("invalidate iceberg table cache {} when 
invalidating db cache",
+                                entry.getKey().nameMapping, new Exception());
+                    }
                     tableCache.invalidate(entry.getKey());
                 });
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
index 5c34201b009..98c7c8048f0 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java
@@ -176,7 +176,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
 
     @Override
     public void afterCreateDb() {
-        dorisCatalog.onRefreshCache(true);
+        dorisCatalog.resetMetaCacheNames();
     }
 
     private boolean performCreateDb(String dbName, boolean ifNotExists, 
Map<String, String> properties)
@@ -248,7 +248,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
 
     @Override
     public void afterDropDb(String dbName) {
-        dorisCatalog.onRefreshCache(true);
+        dorisCatalog.unregisterDatabase(dbName);
     }
 
     @Override
@@ -312,7 +312,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
     public void afterCreateTable(String dbName, String tblName) {
         Optional<ExternalDatabase<?>> db = dorisCatalog.getDbForReplay(dbName);
         if (db.isPresent()) {
-            db.get().setUnInitialized();
+            db.get().resetMetaCacheNames();
         }
         LOG.info("after create table {}.{}.{}, is db exists: {}",
                 dorisCatalog.getName(), dbName, tblName, db.isPresent());
@@ -340,11 +340,7 @@ public class IcebergMetadataOps implements 
ExternalMetadataOps {
     public void afterDropTable(String dbName, String tblName) {
         Optional<ExternalDatabase<?>> db = dorisCatalog.getDbForReplay(dbName);
         if (db.isPresent()) {
-            Optional table = db.get().getTableForReplay(tblName);
-            if (table.isPresent()) {
-                
Env.getCurrentEnv().getRefreshManager().refreshTableInternal(db.get(), 
(ExternalTable) table.get(), 0);
-            }
-            db.get().setUnInitialized();
+            db.get().unregisterTable(tblName);
         }
         LOG.info("after drop table {}.{}.{}. is db exists: {}",
                 dorisCatalog.getName(), dbName, tblName, db.isPresent());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/metacache/MetaCache.java 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/metacache/MetaCache.java
index 3cc47d26d3d..a98dbc132e6 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/metacache/MetaCache.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/metacache/MetaCache.java
@@ -26,6 +26,8 @@ import com.github.benmanes.caffeine.cache.RemovalListener;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 
 import java.util.List;
 import java.util.Map;
@@ -36,6 +38,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.stream.Collectors;
 
 public class MetaCache<T> {
+    private static final Logger LOG = LogManager.getLogger(MetaCache.class);
     private LoadingCache<String, List<Pair<String, String>>> namesCache;
     //Pair<String, String> : <Remote name, Local name>
     private Map<Long, String> idToName = Maps.newConcurrentMap();
@@ -95,6 +98,10 @@ public class MetaCache<T> {
                 if (val != null && val.isPresent()) {
                     return val;
                 }
+                if (LOG.isDebugEnabled()) {
+                    LOG.debug("trigger getMetaObj in metacache {}, obj name: 
{}, id: {}",
+                            this.name, name, id, new Exception());
+                }
                 metaObjCache.invalidate(name);
                 val = metaObjCache.get(name);
                 idToName.put(id, name);
@@ -138,12 +145,19 @@ public class MetaCache<T> {
                 return v;
             }
         });
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("invalidate obj in metacache {}, obj name: {}, id: {}",
+                    name, localName, id, new Exception());
+        }
         metaObjCache.invalidate(localName);
         idToName.remove(id);
     }
 
     public void invalidateAll() {
         namesCache.invalidateAll();
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("invalidate all in metacache {}", name, new Exception());
+        }
         metaObjCache.invalidateAll();
         idToName.clear();
     }
@@ -158,4 +172,12 @@ public class MetaCache<T> {
         idToName.put(id, name);
         metaObjCache.put(name, Optional.of(db));
     }
+
+    /**
+     * Reset the names cache.
+     * Should only be used after creating new database/table
+     */
+    public void resetNames() {
+        namesCache.invalidateAll();
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/persist/TruncateTableInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/persist/TruncateTableInfo.java
index c9b000297db..be7df995919 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/TruncateTableInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/TruncateTableInfo.java
@@ -141,7 +141,7 @@ public class TruncateTableInfo implements Writable {
     public String toString() {
         return "TruncateTableInfo{"
                 + "ctl=" + ctl
-                + "dbId=" + dbId
+                + ", dbId=" + dbId
                 + ", db='" + db + '\''
                 + ", tblId=" + tblId
                 + ", table='" + table + '\''
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
index 472826450e8..93b187a0f60 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java
@@ -350,8 +350,7 @@ public class DdlExecutor {
                     refreshTableStmt.getTblName(), false);
         } else if (ddlStmt instanceof RefreshDbStmt) {
             RefreshDbStmt refreshDbStmt = (RefreshDbStmt) ddlStmt;
-            
env.getRefreshManager().handleRefreshDb(refreshDbStmt.getCatalogName(), 
refreshDbStmt.getDbName(),
-                    refreshDbStmt.isInvalidCache());
+            
env.getRefreshManager().handleRefreshDb(refreshDbStmt.getCatalogName(), 
refreshDbStmt.getDbName());
         } else if (ddlStmt instanceof AlterResourceStmt) {
             env.getResourceMgr().alterResource((AlterResourceStmt) ddlStmt);
         } else if (ddlStmt instanceof AlterColocateGroupStmt) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
 
b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
index 5c86d9025e8..30af287bca1 100644
--- 
a/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/hadoop/hive/metastore/HiveMetaStoreClient.java
@@ -643,6 +643,10 @@ public class HiveMetaStoreClient implements 
IMetaStoreClient, AutoCloseable {
     isConnected = false;
     TTransportException tte = null;
     MetaException lastException = null;
+
+    if (LOG.isDebugEnabled()) {
+      LOG.debug("HiveMetaStoreClient open() called with conf: " + 
conf.toString());
+    }
     boolean useSSL = MetastoreConf.getBoolVar(conf, ConfVars.USE_SSL);
     boolean useSasl = MetastoreConf.getBoolVar(conf, ConfVars.USE_THRIFT_SASL);
     boolean useFramedTransport = MetastoreConf.getBoolVar(conf, 
ConfVars.USE_THRIFT_FRAMED_TRANSPORT);
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/RefreshCatalogTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/RefreshCatalogTest.java
index 39a6394477e..6329de3c886 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/datasource/RefreshCatalogTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/datasource/RefreshCatalogTest.java
@@ -148,6 +148,7 @@ public class RefreshCatalogTest extends TestWithFeService {
         // when use_meta_cache is true, the table will be recreated after 
refresh.
         // so we need to get table again
         table = (TestExternalTable) 
test2.getDbNullable("db1").getTable("tbl11").get();
+        Assertions.assertTrue(((ExternalCatalog) test2).isInitialized());
         Assertions.assertFalse(table.isObjectCreated());
         test2.getDbNullable("db1").getTables();
         Assertions.assertFalse(table.isObjectCreated());
@@ -156,6 +157,10 @@ public class RefreshCatalogTest extends TestWithFeService {
         } catch (Exception e) {
             // Do nothing
         }
+        // after refresh, the catalog will be set to uninitialized
+        Assertions.assertFalse(((ExternalCatalog) test2).isInitialized());
+        // call get table to trigger catalog initialization
+        table = (TestExternalTable) 
test2.getDbNullable("db1").getTable("tbl11").get();
         Assertions.assertTrue(((ExternalCatalog) test2).isInitialized());
     }
 
@@ -231,3 +236,4 @@ public class RefreshCatalogTest extends TestWithFeService {
         }
     }
 }
+
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_case_sensibility.out 
b/regression-test/data/external_table_p0/hive/test_hive_case_sensibility.out
index 8270e6e2bde..5ce72113334 100644
Binary files 
a/regression-test/data/external_table_p0/hive/test_hive_case_sensibility.out 
and 
b/regression-test/data/external_table_p0/hive/test_hive_case_sensibility.out 
differ
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache.out 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache.out
index 7f28eae6135..3a4fbd9190a 100644
Binary files 
a/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache.out and 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache.out 
differ
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_false.out
 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_false.out
new file mode 100644
index 00000000000..3df89cd3b33
Binary files /dev/null and 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_false.out
 differ
diff --git 
a/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_true.out 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_true.out
new file mode 100644
index 00000000000..5c0701b852a
Binary files /dev/null and 
b/regression-test/data/external_table_p0/hive/test_hive_use_meta_cache_true.out 
differ
diff --git 
a/regression-test/data/external_table_p0/lower_case/test_meta_cache_select_without_refresh.out
 
b/regression-test/data/external_table_p0/lower_case/test_meta_cache_select_without_refresh.out
index 7669a50d30c..af3b52782d0 100644
Binary files 
a/regression-test/data/external_table_p0/lower_case/test_meta_cache_select_without_refresh.out
 and 
b/regression-test/data/external_table_p0/lower_case/test_meta_cache_select_without_refresh.out
 differ
diff --git 
a/regression-test/suites/external_table_p0/hive/test_hive_case_sensibility.groovy
 
b/regression-test/suites/external_table_p0/hive/test_hive_case_sensibility.groovy
index caea986adec..bdf8ee094ed 100644
--- 
a/regression-test/suites/external_table_p0/hive/test_hive_case_sensibility.groovy
+++ 
b/regression-test/suites/external_table_p0/hive/test_hive_case_sensibility.groovy
@@ -267,7 +267,11 @@ suite("test_hive_case_sensibility", 
"p0,external,doris,external_docker,external_
                 } else {
                     sql """truncate table CASE_TBL12;"""
                 }
+                // before truncate, see in show tables
+                qt_before_truncate_show_table """show tables like 
"%case_tbl12%""""
                 sql """truncate table case_tbl12;"""
+                // after truncate, should also see in show tables
+                qt_after_truncate_show_table """show tables like 
"%case_tbl12%""""
                 qt_sql20 """select * from case_tbl12;""" // empty
 
                 // 6. drop table
diff --git 
a/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy 
b/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_false.groovy
similarity index 85%
copy from 
regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy
copy to 
regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_false.groovy
index 76b19cf6b9e..cd5abf4fcba 100644
--- 
a/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy
+++ 
b/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_false.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_docker_hive") {
+suite("test_hive_use_meta_cache_false", 
"p0,external,hive,external_docker,external_docker_hive") {
 
     String enabled = context.config.otherConfigs.get("enableHiveTest")
     if (enabled == null || !enabled.equalsIgnoreCase("true")) {
@@ -23,6 +23,27 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
         return;
     }
 
+    def allFrontends = sql """show frontends;"""
+    logger.info("allFrontends: " + allFrontends)
+    def frontendCounts = allFrontends.size()
+    def isMaster = true
+
+    for (def i = 0; i < frontendCounts; i++) {
+        def currentFrontend = allFrontends[i]
+        def isCurrent = currentFrontend[18]
+        if (isCurrent.equals("Yes")) {
+            isMaster = (currentFrontend[8].equals("true"))
+            break
+        }
+    }
+
+    logger.info("connect to master:: " + isMaster)
+    if (!isMaster) {
+        // use_meta_cache = false with connection to non master
+        // will cause the result unstable, so skip it
+        return;
+    }
+
     for (String hivePrefix : ["hive2", "hive3"]) {
         setHivePrefix(hivePrefix)
         try {
@@ -42,11 +63,11 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 );"""
                 
                 // create from Doris, the cache will be filled immediately
-                String database= "test_use_meta_cache_db"
-                String table = "test_use_meta_cache_tbl"
-                String database_hive = "test_use_meta_cache_db_hive"
-                String table_hive = "test_use_meta_cache_tbl_hive"
-                String partitioned_table_hive = 
"test_use_meta_cache_partitioned_tbl_hive"
+                String database= "test_use_meta_cache_db_${use_meta_cache}"
+                String table = "test_use_meta_cache_tbl_${use_meta_cache}"
+                String database_hive = 
"test_use_meta_cache_db_hive_${use_meta_cache}"
+                String table_hive = 
"test_use_meta_cache_tbl_hive_${use_meta_cache}"
+                String partitioned_table_hive = 
"test_use_meta_cache_partitioned_tbl_hive_${use_meta_cache}"
 
                 sql "switch ${catalog}"
                 sql "drop database if exists ${database} force"
@@ -76,6 +97,7 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 } else {
                     // if not use meta cache, can not use
                     sql "refresh catalog ${catalog}"
+                    sql "show databases"
                     sql "use ${database_hive}"
                 }
 
@@ -89,13 +111,14 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 if (use_meta_cache) {
                     // but can select
                     sql "select * from ${table_hive}"
-                    // still not see
+                    // after select, the names cache is refresh, so can see
                     order_qt_sql06 "show tables"
                     sql "refresh database ${database_hive}"
                 } else {
                     // if not use meta cache, can not select
                     sql "refresh database ${database_hive}"
                     sql "select * from ${table_hive}"
+                    // after select, the names cache is refresh, so can see
                     order_qt_sql06 "show tables"
                 }
                 // can see
@@ -128,6 +151,8 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 // can see because partition file listing is not cached
                 order_qt_sql09 "show partitions from ${partitioned_table_hive}"
 
+                // before drop table, we can see the tables
+                order_qt_sql091 "show tables"
                 // drop tables
                 hive_docker "drop table 
${database_hive}.${partitioned_table_hive}"
                 hive_docker "drop table ${database_hive}.${table_hive}"
@@ -145,7 +170,6 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 // can not see
                 order_qt_sql13 "show databases like '%${database_hive}%'";
             }
-            test_use_meta_cache(true)
             test_use_meta_cache(false)
         } finally {
         }
diff --git 
a/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy 
b/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_true.groovy
similarity index 92%
rename from 
regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy
rename to 
regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_true.groovy
index 76b19cf6b9e..7bf9eee738f 100644
--- 
a/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache.groovy
+++ 
b/regression-test/suites/external_table_p0/hive/test_hive_use_meta_cache_true.groovy
@@ -15,7 +15,7 @@
 // specific language governing permissions and limitations
 // under the License.
 
-suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_docker_hive") {
+suite("test_hive_use_meta_cache_true", 
"p0,external,hive,external_docker,external_docker_hive") {
 
     String enabled = context.config.otherConfigs.get("enableHiveTest")
     if (enabled == null || !enabled.equalsIgnoreCase("true")) {
@@ -42,11 +42,11 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 );"""
                 
                 // create from Doris, the cache will be filled immediately
-                String database= "test_use_meta_cache_db"
-                String table = "test_use_meta_cache_tbl"
-                String database_hive = "test_use_meta_cache_db_hive"
-                String table_hive = "test_use_meta_cache_tbl_hive"
-                String partitioned_table_hive = 
"test_use_meta_cache_partitioned_tbl_hive"
+                String database= "test_use_meta_cache_db_${use_meta_cache}"
+                String table = "test_use_meta_cache_tbl_${use_meta_cache}"
+                String database_hive = 
"test_use_meta_cache_db_hive_${use_meta_cache}"
+                String table_hive = 
"test_use_meta_cache_tbl_hive_${use_meta_cache}"
+                String partitioned_table_hive = 
"test_use_meta_cache_partitioned_tbl_hive_${use_meta_cache}"
 
                 sql "switch ${catalog}"
                 sql "drop database if exists ${database} force"
@@ -76,6 +76,7 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 } else {
                     // if not use meta cache, can not use
                     sql "refresh catalog ${catalog}"
+                    sql "show databases"
                     sql "use ${database_hive}"
                 }
 
@@ -89,13 +90,14 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 if (use_meta_cache) {
                     // but can select
                     sql "select * from ${table_hive}"
-                    // still not see
+                    // after select, the names cache is refresh, so can see
                     order_qt_sql06 "show tables"
                     sql "refresh database ${database_hive}"
                 } else {
                     // if not use meta cache, can not select
                     sql "refresh database ${database_hive}"
                     sql "select * from ${table_hive}"
+                    // after select, the names cache is refresh, so can see
                     order_qt_sql06 "show tables"
                 }
                 // can see
@@ -128,6 +130,8 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 // can see because partition file listing is not cached
                 order_qt_sql09 "show partitions from ${partitioned_table_hive}"
 
+                // before drop table, we can see the tables
+                order_qt_sql091 "show tables"
                 // drop tables
                 hive_docker "drop table 
${database_hive}.${partitioned_table_hive}"
                 hive_docker "drop table ${database_hive}.${table_hive}"
@@ -146,7 +150,6 @@ suite("test_hive_use_meta_cache", 
"p0,external,hive,external_docker,external_doc
                 order_qt_sql13 "show databases like '%${database_hive}%'";
             }
             test_use_meta_cache(true)
-            test_use_meta_cache(false)
         } finally {
         }
     }
diff --git 
a/regression-test/suites/external_table_p0/lower_case/test_meta_cache_select_without_refresh.groovy
 
b/regression-test/suites/external_table_p0/lower_case/test_meta_cache_select_without_refresh.groovy
index c2073f9864c..0be1ea92563 100644
--- 
a/regression-test/suites/external_table_p0/lower_case/test_meta_cache_select_without_refresh.groovy
+++ 
b/regression-test/suites/external_table_p0/lower_case/test_meta_cache_select_without_refresh.groovy
@@ -91,11 +91,7 @@ suite("test_meta_cache_select_without_refresh", 
"p0,external,doris,external_dock
 
     sql """insert into internal.external_lower_select_without_refresh.TABLE2 
values(1, 'TABLE2')"""
 
-    test {
-        sql """select * from 
test_meta_cache_lower_true_select_without_refresh.external_lower_select_without_refresh.table2;"""
-
-        exception "Table [table2] does not exist in database 
[external_lower_select_without_refresh]."
-    }
+    qt_sql """select * from 
test_meta_cache_lower_true_select_without_refresh.external_lower_select_without_refresh.table2;"""
 
     qt_test_meta_cache_lower_false_select_without_refresh_select_table2 
"select * from 
test_meta_cache_lower_false_select_without_refresh.external_lower_select_without_refresh.TABLE2;"
 
diff --git 
a/regression-test/suites/external_table_p0/tvf/test_file_tvf_hdfs.groovy 
b/regression-test/suites/external_table_p0/tvf/test_file_tvf_hdfs.groovy
index d5d9f3ca032..b2704a2cf46 100644
--- a/regression-test/suites/external_table_p0/tvf/test_file_tvf_hdfs.groovy
+++ b/regression-test/suites/external_table_p0/tvf/test_file_tvf_hdfs.groovy
@@ -333,9 +333,9 @@ 
suite("test_file_tvf_hdfs","external,hive,tvf,external_docker") {
             // test create view from tvf and alter view from tvf
             uri = "${defaultFS}" + 
"/user/doris/preinstalled_data/csv_format_test/all_types.csv"
             format = "csv"
-            sql """ DROP VIEW IF EXISTS test_hdfs_tvf_create_view;"""
+            sql """ DROP VIEW IF EXISTS test_file_tvf_hdfs_create_view;"""
             sql """
-                create view test_hdfs_tvf_create_view as
+                create view test_file_tvf_hdfs_create_view as
                 select * from FILE(
                         "uri" = "${uri}",
                         "hadoop.username" = "${hdfsUserName}",
@@ -343,10 +343,10 @@ 
suite("test_file_tvf_hdfs","external,hive,tvf,external_docker") {
                         "format" = "${format}") order by c1;
                 """
 
-            order_qt_create_view """ select * from test_hdfs_tvf_create_view 
order by c1 limit 20; """
+            order_qt_create_view """ select * from 
test_file_tvf_hdfs_create_view order by c1 limit 20; """
 
             sql """
-                alter view test_hdfs_tvf_create_view as
+                alter view test_file_tvf_hdfs_create_view as
                 select c1 from FILE(
                         "uri" = "${uri}",
                         "hadoop.username" = "${hdfsUserName}",
@@ -354,7 +354,7 @@ 
suite("test_file_tvf_hdfs","external,hive,tvf,external_docker") {
                         "format" = "${format}") order by c1;
                 """
 
-            order_qt_alter_view """ select * from test_hdfs_tvf_create_view 
order by c1 limit 20; """
+            order_qt_alter_view """ select * from 
test_file_tvf_hdfs_create_view order by c1 limit 20; """
         } finally {
         }
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to