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