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

yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.0 by this push:
     new 13b157ce286 branch-4.0: [Fix](partition) fix concurrent visit of 
partition items #59848 (#59891)
13b157ce286 is described below

commit 13b157ce286c1d77c4bd2cee67809b11a457798e
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Jan 15 18:07:05 2026 +0800

    branch-4.0: [Fix](partition) fix concurrent visit of partition items #59848 
(#59891)
    
    Cherry-picked from #59848
    
    Co-authored-by: zclllyybb <[email protected]>
---
 .../main/java/org/apache/doris/catalog/OlapTable.java |  2 +-
 .../java/org/apache/doris/catalog/PartitionInfo.java  |  4 +++-
 .../apache/doris/clone/DynamicPartitionScheduler.java | 19 ++++++++++++-------
 3 files changed, 16 insertions(+), 9 deletions(-)

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 0ac334fd2b3..4aac2062ee3 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
@@ -181,7 +181,7 @@ public class OlapTable extends Table implements 
MTMVRelatedTableIf, GsonPostProc
     private KeysType keysType;
     @Setter
     @SerializedName(value = "pi", alternate = {"partitionInfo"})
-    private PartitionInfo partitionInfo;
+    private PartitionInfo partitionInfo; // should modify only under table's 
lock
     @SerializedName(value = "itp", alternate = {"idToPartition"})
     @Getter
     protected ConcurrentHashMap<Long, Partition> idToPartition = new 
ConcurrentHashMap<>();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
index 6b00bd39fca..89e6c637a3a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/PartitionInfo.java
@@ -46,7 +46,7 @@ import java.util.Set;
 import java.util.stream.Collectors;
 
 /*
- * Repository of a partition's related infos
+ * Repository of a partition's related infos. should modify only under table's 
lock.
  */
 public class PartitionInfo {
     private static final Logger LOG = 
LogManager.getLogger(PartitionInfo.class);
@@ -137,6 +137,7 @@ public class PartitionInfo {
         return sb.toString();
     }
 
+    // need read lock of table
     public Map<Long, PartitionItem> getIdToItem(boolean isTemp) {
         if (isTemp) {
             return idToTempItem;
@@ -196,6 +197,7 @@ public class PartitionInfo {
         }
     }
 
+    // need write lock of table
     public PartitionItem handleNewSinglePartitionDesc(SinglePartitionDesc desc,
                                                       long partitionId, 
boolean isTemp) throws DdlException {
         Preconditions.checkArgument(desc.isAnalyzed());
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
 
b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
index 7f93e1660d0..de63ce1745c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
@@ -205,13 +205,18 @@ public class DynamicPartitionScheduler extends 
MasterDaemon {
     }
 
     public static List<Partition> getHistoricalPartitions(OlapTable table, 
String nowPartitionName) {
-        RangePartitionInfo info = (RangePartitionInfo) 
(table.getPartitionInfo());
-        List<Map.Entry<Long, PartitionItem>> idToItems = new 
ArrayList<>(info.getIdToItem(false).entrySet());
-        idToItems.sort(Comparator.comparing(o -> ((RangePartitionItem) 
o.getValue()).getItems().upperEndpoint()));
-        return idToItems.stream()
-                .map(entry -> table.getPartition(entry.getKey()))
-                .filter(partition -> partition != null && 
!partition.getName().equals(nowPartitionName))
-                .collect(Collectors.toList());
+        table.readLock();
+        try {
+            RangePartitionInfo info = (RangePartitionInfo) 
(table.getPartitionInfo());
+            List<Map.Entry<Long, PartitionItem>> idToItems = new 
ArrayList<>(info.getIdToItem(false).entrySet());
+            idToItems.sort(Comparator.comparing(o -> ((RangePartitionItem) 
o.getValue()).getItems().upperEndpoint()));
+            return idToItems.stream()
+                    .map(entry -> table.getPartition(entry.getKey()))
+                    .filter(partition -> partition != null && 
!partition.getName().equals(nowPartitionName))
+                    .collect(Collectors.toList());
+        } finally {
+            table.readUnlock();
+        }
     }
 
     public static List<Partition> filterDataPartitions(List<Partition> 
partitions, List<Long> visibleVersions) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to