You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by sh...@apache.org on 2026/05/19 03:55:42 UTC
(iotdb) 02/02: add comment
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 <s1...@gmail.com>
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);