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

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


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 11360b27a24 [fix](catalog) fix potential catalog cache dead lock 
#34609 (#34614)
11360b27a24 is described below

commit 11360b27a24a551d62d192111af384a12a4b93e5
Author: Mingyu Chen <morning...@163.com>
AuthorDate: Sat May 11 18:06:56 2024 +0800

    [fix](catalog) fix potential catalog cache dead lock #34609 (#34614)
    
    bp #34609
---
 .../java/org/apache/doris/datasource/ExternalCatalog.java | 15 ++++++++++-----
 .../org/apache/doris/datasource/ExternalDatabase.java     | 15 ++++++++++-----
 .../test/java/org/apache/doris/catalog/RefreshDbTest.java |  2 +-
 .../org/apache/doris/datasource/RefreshCatalogTest.java   |  2 +-
 4 files changed, 22 insertions(+), 12 deletions(-)

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 435722e06b6..2f8186db722 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
@@ -225,9 +225,7 @@ public abstract class ExternalCatalog
         initLocalObjects();
         if (!initialized) {
             if (useMetaCache.get()) {
-                if (metaCache != null) {
-                    metaCache.invalidateAll();
-                } else {
+                if (metaCache == null) {
                     metaCache = 
Env.getCurrentEnv().getExtMetaCacheMgr().buildMetaCache(
                             name,
                             OptionalLong.of(86400L),
@@ -344,7 +342,6 @@ public abstract class ExternalCatalog
                 dbId = dbNameToId.get(dbName);
                 tmpDbNameToId.put(dbName, dbId);
                 ExternalDatabase<? extends ExternalTable> db = 
idToDb.get(dbId);
-                db.setUnInitialized(invalidCacheInInit);
                 tmpIdToDb.put(dbId, db);
                 initCatalogLog.addRefreshDb(dbId);
             } else {
@@ -379,6 +376,15 @@ public abstract class ExternalCatalog
         synchronized (this.propLock) {
             this.convertedProperties = null;
         }
+        if (useMetaCache.isPresent()) {
+            if (useMetaCache.get() && metaCache != null) {
+                metaCache.invalidateAll();
+            } else if (!useMetaCache.get()) {
+                for (ExternalDatabase<? extends ExternalTable> db : 
idToDb.values()) {
+                    db.setUnInitialized(invalidCache);
+                }
+            }
+        }
         this.invalidCacheInInit = invalidCache;
         if (invalidCache) {
             
Env.getCurrentEnv().getExtMetaCacheMgr().invalidateCatalogCache(id);
@@ -586,7 +592,6 @@ public abstract class ExternalCatalog
             // Because replyInitCatalog can only be called when 
`use_meta_cache` is false.
             // And if `use_meta_cache` is false, getDbForReplay() will not 
return null
             Preconditions.checkNotNull(db.get());
-            db.get().setUnInitialized(invalidCacheInInit);
             tmpDbNameToId.put(db.get().getFullName(), db.get().getId());
             tmpIdToDb.put(db.get().getId(), db.get());
         }
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 6ab3421abc3..f34be46d4b2 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
@@ -118,6 +118,15 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
     public void setUnInitialized(boolean invalidCache) {
         this.initialized = false;
         this.invalidCacheInInit = invalidCache;
+        if (extCatalog.getUseMetaCache().isPresent()) {
+            if (extCatalog.getUseMetaCache().get() && metaCache != null) {
+                metaCache.invalidateAll();
+            } else if (!extCatalog.getUseMetaCache().get()) {
+                for (T table : idToTbl.values()) {
+                    table.unsetObjectCreated();
+                }
+            }
+        }
         if (invalidCache) {
             
Env.getCurrentEnv().getExtMetaCacheMgr().invalidateDbCache(extCatalog.getId(), 
name);
         }
@@ -131,9 +140,7 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
         extCatalog.makeSureInitialized();
         if (!initialized) {
             if (extCatalog.getUseMetaCache().get()) {
-                if (metaCache != null) {
-                    metaCache.invalidateAll();
-                } else {
+                if (metaCache == null) {
                     metaCache = 
Env.getCurrentEnv().getExtMetaCacheMgr().buildMetaCache(
                             name,
                             OptionalLong.of(86400L),
@@ -175,7 +182,6 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
             // So we need add a validation here to avoid table(s) not found, 
this is just a temporary solution
             // because later we will remove all the logics about 
InitCatalogLog/InitDatabaseLog.
             if (table.isPresent()) {
-                table.get().unsetObjectCreated();
                 tmpTableNameToId.put(table.get().getName(), 
table.get().getId());
                 tmpIdToTbl.put(table.get().getId(), table.get());
             }
@@ -206,7 +212,6 @@ public abstract class ExternalDatabase<T extends 
ExternalTable>
                     tblId = tableNameToId.get(tableName);
                     tmpTableNameToId.put(tableName, tblId);
                     T table = idToTbl.get(tblId);
-                    table.unsetObjectCreated();
                     tmpIdToTbl.put(tblId, table);
                     initDatabaseLog.addRefreshTable(tblId);
                 } else {
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/catalog/RefreshDbTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/catalog/RefreshDbTest.java
index 1358e032002..fd920e9632c 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/RefreshDbTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/RefreshDbTest.java
@@ -91,7 +91,7 @@ public class RefreshDbTest extends TestWithFeService {
         }
         long l3 = db1.getLastUpdateTime();
         Assertions.assertTrue(l3 == l2);
-        Assertions.assertTrue(table.isObjectCreated());
+        Assertions.assertFalse(table.isObjectCreated());
         test1.getDbNullable("db1").getTables();
         Assertions.assertFalse(table.isObjectCreated());
         try {
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 60345e9c3ad..f64e6523ebf 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
@@ -144,7 +144,7 @@ public class RefreshCatalogTest extends TestWithFeService {
         // not triggered init method
         long l3 = test2.getLastUpdateTime();
         Assertions.assertTrue(l3 == l2);
-        Assertions.assertTrue(table.isObjectCreated());
+        Assertions.assertFalse(table.isObjectCreated());
         test2.getDbNullable("db1").getTables();
         // Assertions.assertFalse(table.isObjectCreated());
         try {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to