This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 7923eb9e96e Fix concurrent bug in QueryContext
7923eb9e96e is described below
commit 7923eb9e96e251390959060f4f2b7acfc29edae1
Author: Beyyes <[email protected]>
AuthorDate: Sun Jan 28 14:43:27 2024 +0800
Fix concurrent bug in QueryContext
---
.../execution/fragment/QueryContext.java | 26 ++++++++++++----------
1 file changed, 14 insertions(+), 12 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java
index 07ed3582aad..a749aa1657c 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/QueryContext.java
@@ -32,11 +32,11 @@ import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
/** QueryContext contains the shared information with in a query. */
public class QueryContext {
@@ -49,7 +49,7 @@ public class QueryContext {
* Modifications, and we do not want it to create multiple copies within a
query.
*/
private final Map<String, PatternTreeMap<Modification, ModsSerializer>>
fileModCache =
- new HashMap<>();
+ new ConcurrentHashMap<>();
protected long queryId;
@@ -62,7 +62,7 @@ public class QueryContext {
private volatile boolean isInterrupted = false;
- private final Set<TsFileID> nonExistentModFiles = new HashSet<>();
+ private final Set<TsFileID> nonExistentModFiles = new
CopyOnWriteArraySet<>();
public QueryContext() {}
@@ -95,14 +95,16 @@ public class QueryContext {
}
PatternTreeMap<Modification, ModsSerializer> allModifications =
- fileModCache.get(modFile.getFilePath());
- if (allModifications == null) {
- allModifications = PatternTreeMapFactory.getModsPatternTreeMap();
- for (Modification modification : modFile.getModificationsIter()) {
- allModifications.append(modification.getPath(), modification);
- }
- fileModCache.put(modFile.getFilePath(), allModifications);
- }
+ fileModCache.computeIfAbsent(
+ modFile.getFilePath(),
+ k -> {
+ PatternTreeMap<Modification, ModsSerializer> modifications =
+ PatternTreeMapFactory.getModsPatternTreeMap();
+ for (Modification modification : modFile.getModificationsIter())
{
+ modifications.append(modification.getPath(), modification);
+ }
+ return modifications;
+ });
return ModificationFile.sortAndMerge(allModifications.getOverlapped(path));
}