From 3efab570df1f2a5a22bf7e323a25359607114761 Mon Sep 17 00:00:00 2001 From: Jibing-Li <64681310+Jibing-Li@users.noreply.github.com> Date: Thu, 30 May 2024 14:27:44 +0800 Subject: [PATCH] [fix](stats) Add synchronize for some analysis maps to avoid ConcurrentModificationException (#35591) Add synchronized for analysis related maps to avoid ConcurrentModificationException. For example, modify the map while writing image will throw ConcurrentModificationException. --- .../doris/statistics/AnalysisManager.java | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java index c20657e8c6..06f6ca331b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/AnalysisManager.java @@ -935,8 +935,12 @@ public class AnalysisManager implements Writable { @Override public void write(DataOutput out) throws IOException { - writeJobInfo(out, analysisJobInfoMap); - writeJobInfo(out, analysisTaskInfoMap); + synchronized (analysisJobInfoMap) { + writeJobInfo(out, analysisJobInfoMap); + } + synchronized (analysisTaskInfoMap) { + writeJobInfo(out, analysisTaskInfoMap); + } writeTableStats(out); } @@ -948,9 +952,11 @@ public class AnalysisManager implements Writable { } private void writeTableStats(DataOutput out) throws IOException { - out.writeInt(idToTblStats.size()); - for (Entry entry : idToTblStats.entrySet()) { - entry.getValue().write(out); + synchronized (idToTblStats) { + out.writeInt(idToTblStats.size()); + for (Entry entry : idToTblStats.entrySet()) { + entry.getValue().write(out); + } } } @@ -997,7 +1003,9 @@ public class AnalysisManager implements Writable { } public void replayUpdateTableStatsStatus(TableStatsMeta tableStats) { - idToTblStats.put(tableStats.tblId, tableStats); + synchronized (idToTblStats) { + idToTblStats.put(tableStats.tblId, tableStats); + } } public void logCreateTableStats(TableStatsMeta tableStats) { @@ -1042,7 +1050,9 @@ public class AnalysisManager implements Writable { } public void removeTableStats(long tableId) { - idToTblStats.remove(tableId); + synchronized (idToTblStats) { + idToTblStats.remove(tableId); + } } public ColStatsMeta findColStatsMeta(long tblId, String indexName, String colName) {