This is an automated email from the ASF dual-hosted git repository.

shuwenwei pushed a commit to branch fixBug0518
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5f48bb191fe9a3c48e4dcf5a466916667e268d03
Author: shuwenwei <[email protected]>
AuthorDate: Tue May 19 10:01:35 2026 +0800

    add comment
---
 .../db/queryengine/execution/fragment/QueryContext.java |  4 ++--
 .../schemaregion/utils/ResourceByPathUtils.java         | 17 ++++++++++++++---
 .../dataregion/memtable/AlignedReadOnlyMemChunk.java    |  2 +-
 .../dataregion/memtable/ReadOnlyMemChunk.java           |  2 +-
 .../fragment/FragmentInstanceExecutionTest.java         |  6 +++---
 .../dataregion/memtable/PrimitiveMemTableTest.java      |  2 +-
 6 files changed, 22 insertions(+), 11 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 5330903412b..d3edbe2e0d0 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
@@ -267,8 +267,8 @@ public class QueryContext {
     this.ignoreAllNullRows = ignoreAllNullRows;
   }
 
-  public void addTVListToSet(Map<TVList, Integer> tvListMap) {
-    tvListSet.addAll(tvListMap.keySet());
+  public void addTVListToSet(Set<TVList> set) {
+    tvListSet.addAll(set);
   }
 
   public void addRowLevelFilteredCount(long count) {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
index 2c7397c0be6..b9cf97d76f7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/schemaengine/schemaregion/utils/ResourceByPathUtils.java
@@ -188,11 +188,22 @@ public abstract class ResourceByPathUtils {
           tvListQueryMap.put(list, list.rowCount());
         } else {
           TVList workingListForFlushSort = 
memChunk.initWorkingListForFlushIfNecessary(list, true);
-          // The flush list shares value arrays with the original list, so 
keep the original list
-          // referenced by this query until the query finishes.
+          /*
+           * The query will read from workingListForFlushSort, but 
cloneForFlushSort() only clones
+           * times and indices. The value arrays and bitmaps are still shared 
with the original
+           * list.
+           *
+           * Therefore, this query must also hold the original list until it 
finishes. Adding
+           * context to list.getQueryContextSet() lets flush/query cleanup see 
that the original
+           * list is still in use. Adding list to context.tvListSet makes
+           * releaseTVListOwnedByQuery() remove this context from the original 
list later.
+           *
+           * Do not put the original list into tvListQueryMap here. The actual 
read path must use
+           * workingListForFlushSort to avoid sorting the original list in 
place.
+           */
           list.getQueryContextSet().add(context);
+          context.addTVListToSet(Collections.singleton(list));
           workingListForFlushSort.getQueryContextSet().add(context);
-          context.addTVListToSet(Collections.singletonMap(list, 0));
           tvListQueryMap.put(workingListForFlushSort, 
workingListForFlushSort.rowCount());
         }
       } else {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
index 05c1602bf2a..01a61eee5cc 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/AlignedReadOnlyMemChunk.java
@@ -109,7 +109,7 @@ public class AlignedReadOnlyMemChunk extends 
ReadOnlyMemChunk {
     this.valueStatisticsList = new ArrayList<>();
     this.alignedTvListQueryMap = alignedTvListQueryMap;
     this.columnIndexList = columnIndexList;
-    this.context.addTVListToSet(alignedTvListQueryMap);
+    this.context.addTVListToSet(alignedTvListQueryMap.keySet());
   }
 
   @Override
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java
index 496035e91ad..4c32be0e798 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/memtable/ReadOnlyMemChunk.java
@@ -128,7 +128,7 @@ public class ReadOnlyMemChunk {
     this.deletionList = deletionList;
     this.tvListQueryMap = tvListQueryMap;
     this.pageStatisticsList = new ArrayList<>();
-    this.context.addTVListToSet(tvListQueryMap);
+    this.context.addTVListToSet(tvListQueryMap.keySet());
   }
 
   public void sortTvLists() {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecutionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecutionTest.java
index 99a94eb02a3..133333c2916 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecutionTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecutionTest.java
@@ -44,7 +44,7 @@ import 
org.apache.iotdb.db.storageengine.dataregion.memtable.ReadOnlyMemChunk;
 import org.apache.iotdb.db.utils.datastructure.AlignedTVList;
 import org.apache.iotdb.db.utils.datastructure.TVList;
 
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.IDeviceID;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -134,13 +134,13 @@ public class FragmentInstanceExecutionTest {
         FragmentInstanceExecution execution1 =
             createFragmentInstanceExecution(1, instanceNotificationExecutor);
         FragmentInstanceContext fragmentInstanceContext1 = 
execution1.getFragmentInstanceContext();
-        fragmentInstanceContext1.addTVListToSet(ImmutableMap.of(tvList, 0));
+        fragmentInstanceContext1.addTVListToSet(ImmutableSet.of(tvList));
         tvList.getQueryContextSet().add(fragmentInstanceContext1);
 
         FragmentInstanceExecution execution2 =
             createFragmentInstanceExecution(2, instanceNotificationExecutor);
         FragmentInstanceContext fragmentInstanceContext2 = 
execution2.getFragmentInstanceContext();
-        fragmentInstanceContext2.addTVListToSet(ImmutableMap.of(tvList, 0));
+        fragmentInstanceContext2.addTVListToSet(ImmutableSet.of(tvList));
         tvList.getQueryContextSet().add(fragmentInstanceContext2);
 
         // mock flush's behavior
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java
index 92ec98b796e..65621034e06 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/memtable/PrimitiveMemTableTest.java
@@ -824,7 +824,7 @@ public class PrimitiveMemTableTest {
     list.getQueryContextSet().add(queryContext);
     Map<TVList, Integer> tvlistMap = new HashMap<>();
     tvlistMap.put(list, 100);
-    queryContext.addTVListToSet(tvlistMap);
+    queryContext.addTVListToSet(tvlistMap.keySet());
 
     // fragment instance execution
     IDriverScheduler scheduler = Mockito.mock(IDriverScheduler.class);

Reply via email to