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/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 01894c8 [Bug] Fix bug that wrong usage for HashBasedTable iterator
may cause ConcurrentModificationException (#4631)
01894c8 is described below
commit 01894c82fef86b3baf9108d58257922baeb7d97b
Author: caiconghui <[email protected]>
AuthorDate: Sun Sep 20 20:58:08 2020 +0800
[Bug] Fix bug that wrong usage for HashBasedTable iterator may cause
ConcurrentModificationException (#4631)
Fix bug that wrong usage for HashBasedTable iterator may cause
ConcurrentModificationException
---
.../java/org/apache/doris/clone/TabletChecker.java | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
index 952f564..e97eff8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
@@ -317,12 +317,12 @@ public class TabletChecker extends MasterDaemon {
// 1. timeout
// 2. meta not found
private void removePriosIfNecessary() {
- com.google.common.collect.Table<Long, Long, Set<PrioPart>> copiedPrio
= null;
+ com.google.common.collect.Table<Long, Long, Set<PrioPart>> copiedPrios
= null;
synchronized (prios) {
- copiedPrio = HashBasedTable.create(prios);
+ copiedPrios = HashBasedTable.create(prios);
}
-
- Iterator<Map.Entry<Long, Map<Long, Set<PrioPart>>>> iter =
copiedPrio.rowMap().entrySet().iterator();
+ List<Pair<Long, Long>> deletedPrios = Lists.newArrayList();
+ Iterator<Map.Entry<Long, Map<Long, Set<PrioPart>>>> iter =
copiedPrios.rowMap().entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<Long, Map<Long, Set<PrioPart>>> dbEntry = iter.next();
long dbId = dbEntry.getKey();
@@ -340,7 +340,7 @@ public class TabletChecker extends MasterDaemon {
long tblId = tblEntry.getKey();
OlapTable tbl = (OlapTable) db.getTable(tblId);
if (tbl == null) {
- jter.remove();
+ deletedPrios.add(Pair.create(dbId, tblId));
continue;
}
@@ -348,7 +348,7 @@ public class TabletChecker extends MasterDaemon {
parts = parts.stream().filter(p ->
(tbl.getPartition(p.partId) != null && !p.isTimeout())).collect(
Collectors.toSet());
if (parts.isEmpty()) {
- jter.remove();
+ deletedPrios.add(Pair.create(dbId, tblId));
}
}
@@ -359,8 +359,10 @@ public class TabletChecker extends MasterDaemon {
db.readUnlock();
}
}
-
- prios = copiedPrio;
+ for (Pair<Long, Long> prio : deletedPrios) {
+ copiedPrios.remove(prio.first, prio.second);
+ }
+ prios = copiedPrios;
}
/*
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]