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

Reply via email to