This is an automated email from the ASF dual-hosted git repository.
JackieTien97 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 2a654e66745 Fix deleteDirectoryIfExists when root Path is not exist
(#18593)
2a654e66745 is described below
commit 2a654e6674576b7f6d7138ab8a0aa06daac26fa9
Author: Weihao Li <[email protected]>
AuthorDate: Wed Sep 9 15:42:28 2026 +0800
Fix deleteDirectoryIfExists when root Path is not exist (#18593)
---
.../iotdb/db/queryengine/common/MPPQueryContext.java | 9 +++++++++
.../db/queryengine/plan/execution/QueryExecution.java | 18 ++++++++++--------
.../spill/AbstractDeviceEntryMaterializer.java | 5 ++++-
.../metadata/spill/DeviceEntrySortedMaterializer.java | 4 +++-
.../metadata/spill/DeviceEntrySpillManager.java | 5 +++++
.../metadata/spill/DeviceEntryMaterializerTest.java | 16 +++++++++++++---
6 files changed, 44 insertions(+), 13 deletions(-)
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
index 16c31d5b2f7..c08dbae23a0 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/MPPQueryContext.java
@@ -137,6 +137,7 @@ public class MPPQueryContext implements IAuditEntity {
private DeviceEntryIOContext deviceEntryIOContext;
private final AtomicBoolean deviceEntryDiskIOMetricsRecorded = new
AtomicBoolean();
+ private boolean deviceEntrySpilled;
// To avoid query front-end from consuming too much memory, it needs to
reserve memory when
// constructing some Expression and PlanNode.
@@ -416,6 +417,14 @@ public class MPPQueryContext implements IAuditEntity {
return deviceEntryIOContext;
}
+ public void setDeviceEntrySpilled() {
+ deviceEntrySpilled = true;
+ }
+
+ public boolean isDeviceEntrySpilled() {
+ return deviceEntrySpilled;
+ }
+
public void addFailedEndPoint(TEndPoint endPoint) {
this.endPointBlackList.add(endPoint);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
index 40f5231a81f..5a094814607 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/QueryExecution.java
@@ -439,14 +439,16 @@ public class QueryExecution implements IQueryExecution {
cleanUpResultHandle();
}
context.releaseExternalTsFileQueryResources();
- try {
-
DeviceEntrySpillManager.getInstance().deregisterQuery(context.getQueryId().getId());
- } catch (Exception e) {
- LOGGER.warn(
- String.format(
- DataNodeQueryMessages
-
.LOG_FAILED_TO_CLEAN_DEVICEENTRY_SPILL_DIRECTORY_FOR_QUERY_ARG_53D9C1FC,
- context.getQueryId().getId()));
+ if (context.isDeviceEntrySpilled()) {
+ try {
+
DeviceEntrySpillManager.getInstance().deregisterQuery(context.getQueryId().getId());
+ } catch (Exception e) {
+ LOGGER.warn(
+ String.format(
+ DataNodeQueryMessages
+
.LOG_FAILED_TO_CLEAN_DEVICEENTRY_SPILL_DIRECTORY_FOR_QUERY_ARG_53D9C1FC,
+ context.getQueryId().getId()));
+ }
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/AbstractDeviceEntryMaterializer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/AbstractDeviceEntryMaterializer.java
index a41ee527929..da21c4a7155 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/AbstractDeviceEntryMaterializer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/AbstractDeviceEntryMaterializer.java
@@ -211,6 +211,9 @@ public abstract class AbstractDeviceEntryMaterializer
implements AutoCloseable {
if (ownerDirectory == null) {
ownerDirectory = DeviceEntrySpillManager.getInstance().register(queryId,
planNodeId);
ownerRegistered = true;
+ if (queryContext != null) {
+ queryContext.setDeviceEntrySpilled();
+ }
}
return ownerDirectory;
}
@@ -244,7 +247,7 @@ public abstract class AbstractDeviceEntryMaterializer
implements AutoCloseable {
@Override
public void close() throws IOException {
- if (!finished) {
+ if (isSpilled() && !finished) {
cleanupOwnerDirectory();
}
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySortedMaterializer.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySortedMaterializer.java
index 791c8857092..554951491d4 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySortedMaterializer.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySortedMaterializer.java
@@ -203,7 +203,9 @@ public final class DeviceEntrySortedMaterializer extends
AbstractDeviceEntryMate
return dataSet;
} catch (IOException | RuntimeException e) {
try {
- cleanupOwnerDirectory();
+ if (isSpilled()) {
+ cleanupOwnerDirectory();
+ }
} catch (IOException cleanupException) {
e.addSuppressed(cleanupException);
}
diff --git
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySpillManager.java
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySpillManager.java
index ebd4218672a..0525f9d6efd 100644
---
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySpillManager.java
+++
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntrySpillManager.java
@@ -165,6 +165,11 @@ public final class DeviceEntrySpillManager {
}
private void deleteDirectoryIfExists(Path directory) throws IOException {
+ // Avoid most concurrent conflicts when query with device entry spilled
fails
+ if (!Files.exists(directory)) {
+ return;
+ }
+
Files.walkFileTree(
directory,
new SimpleFileVisitor<>() {
diff --git
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntryMaterializerTest.java
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntryMaterializerTest.java
index d314851f9b6..7971b7599d3 100644
---
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntryMaterializerTest.java
+++
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/spill/DeviceEntryMaterializerTest.java
@@ -70,14 +70,21 @@ public class DeviceEntryMaterializerTest {
@Test
public void testKeepSmallDataSetInline() throws Exception {
List<DeviceEntry> expected = createEntries(3);
+ MPPQueryContext queryContext = new MPPQueryContext(new
QueryId("20260909_023029_00001"));
try (DeviceEntryMaterializer materializer =
- new DeviceEntryMaterializer("q-inline", new PlanNodeId("scan-0"),
Long.MAX_VALUE, true)) {
+ new DeviceEntryMaterializer(
+ "20260909_023029_00001",
+ new PlanNodeId("scan-0"),
+ Long.MAX_VALUE,
+ true,
+ queryContext)) {
for (DeviceEntry entry : expected) {
materializer.append(entry);
}
try (DeviceEntryDataSet dataSet = materializer.finish()) {
assertFalse(dataSet.isSpilled());
assertEquals(expected, dataSet.getInlineEntries());
+ assertFalse(queryContext.isDeviceEntrySpilled());
}
}
}
@@ -85,9 +92,11 @@ public class DeviceEntryMaterializerTest {
@Test
public void testSpillAndReadMultipleSegments() throws Exception {
List<DeviceEntry> expected = createEntries(20);
+ MPPQueryContext queryContext = new MPPQueryContext(new
QueryId("20260909_023029_00001"));
DeviceEntryDataSet dataSet;
try (DeviceEntryMaterializer materializer =
- new DeviceEntryMaterializer("q-spill", new PlanNodeId("scan-0"), 128,
true)) {
+ new DeviceEntryMaterializer(
+ "20260909_023029_00001", new PlanNodeId("scan-0"), 128, true,
queryContext)) {
for (DeviceEntry entry : expected) {
materializer.append(entry);
}
@@ -96,6 +105,7 @@ public class DeviceEntryMaterializerTest {
}
assertTrue(dataSet.isSpilled());
+ assertTrue(queryContext.isDeviceEntrySpilled());
assertEquals(expected.size(), dataSet.getEntryCount());
List<DeviceEntry> actual = new ArrayList<>();
try (DeviceEntryReader reader = dataSet.openReader()) {
@@ -106,7 +116,7 @@ public class DeviceEntryMaterializerTest {
assertEquals(expected, actual);
dataSet.close();
-
assertFalse(Files.exists(queryDirectory.resolve("device-entry/q-spill/scan-0")));
+
assertFalse(Files.exists(queryDirectory.resolve("device-entry/20260909_023029_00001/scan-0")));
}
@Test