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

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


The following commit(s) were added to refs/heads/master by this push:
     new 2442b9fc188 [fix](mtmv) fix mtmv deadlock issue (#43376)
2442b9fc188 is described below

commit 2442b9fc188b7ab10d755c811df187bb1c5987a4
Author: zhangdong <493738...@qq.com>
AuthorDate: Thu Nov 7 16:53:00 2024 +0800

    [fix](mtmv) fix mtmv deadlock issue (#43376)
    
    mtmv deadlock when
    
    - table1 is olapTable
    - mv1 is MTMV create by table1
    - mv2 is MTMV create by table1
    
    reason:
    - mtmv-task-thread-1: refresh mv1,  blocked write lock :mv1
    - show partitions: hold read lock: mv1 ,block read lock: table1
    - insert into table1: block write lock: table1
    - mtmv-task-thread-2: refresh mv2, hold read lock: table1, blocked read
    lock :mv1
    
    Problem Summary:
    
    show partitions: not hold readLock of olapTable and MTMV at same time
    getAndCopyPartitionItems: set max wait time
    
    
    Co-authored-by: zhangdong <zhangd...@selectdb.com>
---
 .../main/java/org/apache/doris/catalog/MTMV.java   |  2 +-
 .../java/org/apache/doris/catalog/OlapTable.java   |  7 +++--
 .../doris/common/proc/PartitionsProcDir.java       | 31 +++++++++++++---------
 .../org/apache/doris/mtmv/MTMVPartitionUtil.java   |  4 +--
 .../org/apache/doris/mtmv/MTMVRelatedTableIf.java  |  2 +-
 5 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java
index 93d9a8d8dfb..b0d25ad2b25 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MTMV.java
@@ -358,7 +358,7 @@ public class MTMV extends OlapTable {
      *
      * @return mvPartitionName ==> mvPartitionKeyDesc
      */
-    public Map<String, PartitionKeyDesc> generateMvPartitionDescs() {
+    public Map<String, PartitionKeyDesc> generateMvPartitionDescs() throws 
AnalysisException {
         Map<String, PartitionItem> mtmvItems = getAndCopyPartitionItems();
         Map<String, PartitionKeyDesc> result = Maps.newHashMap();
         for (Entry<String, PartitionItem> entry : mtmvItems.entrySet()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
index 28a9dfce15e..8a9ce4a2a2a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java
@@ -113,6 +113,7 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -3259,8 +3260,10 @@ public class OlapTable extends Table implements 
MTMVRelatedTableIf, GsonPostProc
     }
 
     @Override
-    public Map<String, PartitionItem> getAndCopyPartitionItems() {
-        readLock();
+    public Map<String, PartitionItem> getAndCopyPartitionItems() throws 
AnalysisException {
+        if (!tryReadLock(1, TimeUnit.MINUTES)) {
+            throw new AnalysisException("get table read lock timeout, 
database=" + getDBName() + ",table=" + getName());
+        }
         try {
             Map<String, PartitionItem> res = Maps.newHashMap();
             for (Entry<Long, PartitionItem> entry : 
getPartitionInfo().getIdToItem(false).entrySet()) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java 
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
index f1aed5b6278..c76a4185fca 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/common/proc/PartitionsProcDir.java
@@ -241,6 +241,16 @@ public class PartitionsProcDir implements ProcDirInterface 
{
 
         // get info
         List<Pair<List<Comparable>, TRow>> partitionInfos = new 
ArrayList<Pair<List<Comparable>, TRow>>();
+        Map<Long, List<String>> partitionsUnSyncTables = null;
+        String mtmvPartitionSyncErrorMsg = null;
+        if (olapTable instanceof MTMV) {
+            try {
+                partitionsUnSyncTables = MTMVPartitionUtil
+                        .getPartitionsUnSyncTables((MTMV) olapTable);
+            } catch (AnalysisException e) {
+                mtmvPartitionSyncErrorMsg = e.getMessage();
+            }
+        }
         olapTable.readLock();
         try {
             List<Long> partitionIds;
@@ -258,16 +268,6 @@ public class PartitionsProcDir implements ProcDirInterface 
{
             }
 
             Joiner joiner = Joiner.on(", ");
-            Map<Long, List<String>> partitionsUnSyncTables = null;
-            String mtmvPartitionSyncErrorMsg = null;
-            if (olapTable instanceof MTMV) {
-                try {
-                    partitionsUnSyncTables = MTMVPartitionUtil
-                            .getPartitionsUnSyncTables((MTMV) olapTable, 
partitionIds);
-                } catch (AnalysisException e) {
-                    mtmvPartitionSyncErrorMsg = e.getMessage();
-                }
-            }
             for (Long partitionId : partitionIds) {
                 Partition partition = olapTable.getPartition(partitionId);
 
@@ -363,11 +363,16 @@ public class PartitionsProcDir implements 
ProcDirInterface {
                     if (StringUtils.isEmpty(mtmvPartitionSyncErrorMsg)) {
                         List<String> partitionUnSyncTables = 
partitionsUnSyncTables.getOrDefault(partitionId,
                                 Lists.newArrayList());
-                        boolean isSync = 
CollectionUtils.isEmpty(partitionUnSyncTables);
+                        boolean isSync = 
partitionsUnSyncTables.containsKey(partitionId) && CollectionUtils.isEmpty(
+                                partitionUnSyncTables);
                         partitionInfo.add(isSync);
                         trow.addToColumnValue(new TCell().setBoolVal(isSync));
-                        partitionInfo.add(partitionUnSyncTables.toString());
-                        trow.addToColumnValue(new 
TCell().setStringVal(partitionUnSyncTables.toString()));
+                        // The calculation logic of partitionsUnSyncTables is 
not protected in the current lock,
+                        // so the obtained partition list may not be 
consistent with here
+                        String unSyncTables = 
partitionsUnSyncTables.containsKey(partitionId)
+                                ? partitionUnSyncTables.toString() : "not 
sure, please try again";
+                        partitionInfo.add(unSyncTables);
+                        trow.addToColumnValue(new 
TCell().setStringVal(unSyncTables));
                     } else {
                         partitionInfo.add(false);
                         trow.addToColumnValue(new TCell().setBoolVal(false));
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
index 2a0863a6e61..1cfb5e021a5 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVPartitionUtil.java
@@ -231,12 +231,12 @@ public class MTMVPartitionUtil {
      * getPartitionsUnSyncTables
      *
      * @param mtmv
-     * @param partitionIds
      * @return partitionName ==> UnSyncTableNames
      * @throws AnalysisException
      */
-    public static Map<Long, List<String>> getPartitionsUnSyncTables(MTMV mtmv, 
List<Long> partitionIds)
+    public static Map<Long, List<String>> getPartitionsUnSyncTables(MTMV mtmv)
             throws AnalysisException {
+        List<Long> partitionIds = mtmv.getPartitionIds();
         Map<Long, List<String>> res = Maps.newHashMap();
         MTMVRefreshContext context = MTMVRefreshContext.buildContext(mtmv);
         for (Long partitionId : partitionIds) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelatedTableIf.java 
b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelatedTableIf.java
index c40485db223..4a8b14603ce 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelatedTableIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/mtmv/MTMVRelatedTableIf.java
@@ -40,7 +40,7 @@ public interface MTMVRelatedTableIf extends TableIf {
      *
      * @return partitionName->PartitionItem
      */
-    Map<String, PartitionItem> getAndCopyPartitionItems();
+    Map<String, PartitionItem> getAndCopyPartitionItems() throws 
AnalysisException;
 
     /**
      * getPartitionType LIST/RANGE/UNPARTITIONED


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

Reply via email to