This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new cab76c2337c [fix](mtmv) fix mtmv deadlock issue (#43376) (#43427)
cab76c2337c is described below
commit cab76c2337c4c3c632f5badb2db1d5920abd0c18
Author: zhangdong <[email protected]>
AuthorDate: Mon Nov 11 10:29:50 2024 +0800
[fix](mtmv) fix mtmv deadlock issue (#43376) (#43427)
pick from master #43376
Co-authored-by: zhangdong <[email protected]>
---
.../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 2f8f0eb7909..2f0610619be 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.Optional;
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 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: [email protected]
For additional commands, e-mail: [email protected]