This is an automated email from the ASF dual-hosted git repository.
morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 1602f70d1df [fix](analyze) avoid
java.util.ConcurrentModificationException (#33674)
1602f70d1df is described below
commit 1602f70d1df24770451b51f0191e079ba3b63c02
Author: Mingyu Chen <[email protected]>
AuthorDate: Tue Apr 16 11:53:04 2024 +0800
[fix](analyze) avoid java.util.ConcurrentModificationException (#33674)
```
java.util.ConcurrentModificationException: null
at
java.util.TreeMap$ValueSpliterator.forEachRemaining(TreeMap.java:3226) ~[?:?]
at
java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?]
at
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
~[?:?]
at
java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
~[?:?]
at
java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
at
java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[?:?]
at
org.apache.doris.statistics.AnalysisManager.findShowAnalyzeResult(AnalysisManager.java:552)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.statistics.AnalysisManager.showAnalysisJob(AnalysisManager.java:533)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.ShowExecutor.handleShowAnalyze(ShowExecutor.java:2772)
~[doris-fe.jar:1.2-SNAPSHOT]
at org.apache.doris.qe.ShowExecutor.execute(ShowExecutor.java:447)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.StmtExecutor.handleShow(StmtExecutor.java:2738)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.StmtExecutor.executeByLegacy(StmtExecutor.java:1010)
~[doris-fe.jar:1.2-SNAPSHOT]
at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:624)
~[doris-fe.jar:1.2-SNAPSHOT]
at org.apache.doris.qe.StmtExecutor.execute(StmtExecutor.java:526)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.ConnectProcessor.executeQuery(ConnectProcessor.java:333)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.ConnectProcessor.handleQuery(ConnectProcessor.java:228)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.MysqlConnectProcessor.handleQuery(MysqlConnectProcessor.java:176)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.MysqlConnectProcessor.dispatch(MysqlConnectProcessor.java:205)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.qe.MysqlConnectProcessor.processOnce(MysqlConnectProcessor.java:258)
~[doris-fe.jar:1.2-SNAPSHOT]
at
org.apache.doris.mysql.ReadListener.lambda$handleEvent$0(ReadListener.java:52)
~[doris-fe.jar:1.2-SNAPSHOT]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
~[?:?]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
~[?:?]
at java.lang.Thread.run(Thread.java:840) ~[?:?]
```
Due to the `Collections.synchronizedNavigableMap`'s java doc:
```
In order to guarantee serial access, it is critical that all access to the
backing navigable map is accomplished through the returned navigable map (or
its views).
It is imperative that the user manually synchronize on the returned
navigable map when traversing any of its collection views, or the collections
views of any of its subMap, headMap or tailMap views, via Iterator, Spliterator
or Stream
```
---
.../main/java/org/apache/doris/statistics/AnalysisManager.java | 8 ++++----
1 file changed, 4 insertions(+), 4 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 985f98ad90b..f13ba61f2a5 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
@@ -530,10 +530,10 @@ public class AnalysisManager implements Writable {
}
public List<AnalysisInfo> showAnalysisJob(ShowAnalyzeStmt stmt) {
- return findShowAnalyzeResult(analysisJobInfoMap.values(), stmt);
+ return findShowAnalyzeResult(stmt);
}
- protected List<AnalysisInfo>
findShowAnalyzeResult(Collection<AnalysisInfo> analysisInfos, ShowAnalyzeStmt
stmt) {
+ private List<AnalysisInfo> findShowAnalyzeResult(ShowAnalyzeStmt stmt) {
String state = stmt.getStateValue();
TableName tblName = stmt.getDbTableName();
TableIf tbl = null;
@@ -541,8 +541,8 @@ public class AnalysisManager implements Writable {
tbl = StatisticsUtil.findTable(tblName.getCtl(), tblName.getDb(),
tblName.getTbl());
}
long tblId = tbl == null ? -1 : tbl.getId();
- synchronized (analysisInfos) {
- return analysisInfos.stream()
+ synchronized (analysisJobInfoMap) {
+ return analysisJobInfoMap.values().stream()
.filter(a -> stmt.getJobId() == 0 || a.jobId ==
stmt.getJobId())
.filter(a -> state == null ||
a.state.equals(AnalysisState.valueOf(state)))
.filter(a -> tblName == null || a.tblId == tblId)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]