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

yiguolei 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 6fe00c7244a [fix](mtmv) fix mtmv deadlock issue (#43376) (#43428)
6fe00c7244a is described below

commit 6fe00c7244ae2d5a52d8e35d1e121d8d932edf27
Author: zhangdong <[email protected]>
AuthorDate: Sat Nov 16 20:49:09 2024 +0800

    [fix](mtmv) fix mtmv deadlock issue (#43376) (#43428)
    
    pick: https://github.com/apache/doris/pull/43376
---
 .../main/java/org/apache/doris/catalog/MTMV.java   |  2 +-
 .../java/org/apache/doris/catalog/OlapTable.java   |  8 ++++--
 .../doris/common/proc/PartitionsProcDir.java       | 31 +++++++++++++---------
 .../org/apache/doris/mtmv/MTMVPartitionUtil.java   |  4 +--
 .../org/apache/doris/mtmv/MTMVRelatedTableIf.java  |  2 +-
 5 files changed, 28 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 d32853b112b..80d7f48a9ee 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
@@ -351,7 +351,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 8c7e8b59646..343d3a3ca8d 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
@@ -106,6 +106,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -3010,8 +3011,11 @@ public class OlapTable extends Table implements 
MTMVRelatedTableIf {
     }
 
     @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=" + 
getQualifiedDbName() + ",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 d0771f3be1c..2d8ed1295b3 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 453014f26d1..14b0f89ac76 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: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to