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));
   }
 

Reply via email to