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]