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 7eb47a957607ae..cc7412cb3f68e3 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 @@ -349,7 +349,7 @@ public MTMVRefreshSnapshot getRefreshSnapshot() { * * @return mvPartitionName ==> mvPartitionKeyDesc */ - public Map generateMvPartitionDescs() { + public Map generateMvPartitionDescs() throws AnalysisException { Map mtmvItems = getAndCopyPartitionItems(); Map result = Maps.newHashMap(); for (Entry 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 3aa8f61e905e48..04eed814488a51 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 @@ -111,6 +111,7 @@ import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; /** @@ -3126,8 +3127,10 @@ public PartitionType getPartitionType() { } @Override - public Map getAndCopyPartitionItems() { - readLock(); + public Map getAndCopyPartitionItems() throws AnalysisException { + if (!tryReadLock(1, TimeUnit.MINUTES)) { + throw new AnalysisException("get table read lock timeout, database=" + getDBName() + ",table=" + getName()); + } try { Map res = Maps.newHashMap(); for (Entry 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 f1aed5b6278960..c76a4185fca6c6 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 @@ private List, TRow>> getPartitionInfosInrernal() throws An // get info List, TRow>> partitionInfos = new ArrayList, TRow>>(); + Map> 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 partitionIds; @@ -258,16 +268,6 @@ private List, TRow>> getPartitionInfosInrernal() throws An } Joiner joiner = Joiner.on(", "); - Map> 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 @@ private List, TRow>> getPartitionInfosInrernal() throws An if (StringUtils.isEmpty(mtmvPartitionSyncErrorMsg)) { List 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 2a0863a6e61101..1cfb5e021a5309 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 static boolean isMTMVSync(MTMVRefreshContext context, Set * getPartitionsUnSyncTables * * @param mtmv - * @param partitionIds * @return partitionName ==> UnSyncTableNames * @throws AnalysisException */ - public static Map> getPartitionsUnSyncTables(MTMV mtmv, List partitionIds) + public static Map> getPartitionsUnSyncTables(MTMV mtmv) throws AnalysisException { + List partitionIds = mtmv.getPartitionIds(); Map> 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 516eb904e58463..0b7562747745f1 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 @@ -38,7 +38,7 @@ public interface MTMVRelatedTableIf extends TableIf { * * @return partitionId->PartitionItem */ - Map getAndCopyPartitionItems(); + Map getAndCopyPartitionItems() throws AnalysisException; /** * getPartitionType LIST/RANGE/UNPARTITIONED