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

jiangtian 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 a5d33b20c21 fix deletion file handler leak (#16332)
a5d33b20c21 is described below

commit a5d33b20c21cf720fe14a0a9ed2b7044957ed24f
Author: Peng Junzhi <[email protected]>
AuthorDate: Wed Sep 3 04:22:59 2025 -0500

    fix deletion file handler leak (#16332)
---
 .../deletion/persist/PageCacheDeletionBuffer.java  | 24 ++++++++++++++++------
 .../consensus/deletion/recover/DeletionReader.java |  2 +-
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
index bf334b0ed8f..f401cbbc76a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/persist/PageCacheDeletionBuffer.java
@@ -184,12 +184,18 @@ public class PageCacheDeletionBuffer implements 
DeletionBuffer {
     pendingDeletionsInOneTask.forEach(DeletionResource::onPersistSucceed);
   }
 
-  private void closeCurrentLoggingFile() throws IOException {
+  private void closeCurrentLoggingFile(boolean notifySuccess) throws 
IOException {
     LOGGER.info("Deletion persist-{}: current file has been closed", 
dataRegionId);
     // Close old resource to fsync.
-    this.logStream.close();
-    this.logChannel.close();
-    pendingDeletionsInOneTask.forEach(DeletionResource::onPersistSucceed);
+    if (this.logStream != null) {
+      this.logStream.close();
+    }
+    if (this.logChannel != null) {
+      this.logChannel.close();
+    }
+    if (notifySuccess) {
+      pendingDeletionsInOneTask.forEach(DeletionResource::onPersistSucceed);
+    }
   }
 
   private void resetTaskAttribute() {
@@ -271,6 +277,12 @@ public class PageCacheDeletionBuffer implements 
DeletionBuffer {
         Thread.currentThread().interrupt();
       }
     }
+    // close file handler
+    try {
+      closeCurrentLoggingFile(false);
+    } catch (IOException e) {
+      LOGGER.error("Fail to close current logging file when closing", e);
+    }
     // clean buffer
     MmapUtil.clean(serializeBuffer);
     serializeBuffer = null;
@@ -370,7 +382,7 @@ public class PageCacheDeletionBuffer implements 
DeletionBuffer {
           deletionResources.add(deletionResource);
           // 2. fsync immediately and roll to a new file.
           appendCurrentBatch();
-          closeCurrentLoggingFile();
+          closeCurrentLoggingFile(true);
           resetTaskAttribute();
           switchLoggingFile();
           return;
@@ -384,7 +396,7 @@ public class PageCacheDeletionBuffer implements 
DeletionBuffer {
       // Persist deletions; Defensive programming here, just in case.
       if (totalSize.get() > 0) {
         appendCurrentBatch();
-        closeCurrentLoggingFile();
+        closeCurrentLoggingFile(true);
         resetTaskAttribute();
         switchLoggingFile();
       }
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/recover/DeletionReader.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/recover/DeletionReader.java
index 22c4b7ca41d..943693e7b00 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/recover/DeletionReader.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/consensus/deletion/recover/DeletionReader.java
@@ -95,7 +95,7 @@ public class DeletionReader implements Closeable {
 
   @Override
   public void close() throws IOException {
-    this.fileInputStream.close();
     this.fileChannel.close();
+    this.fileInputStream.close();
   }
 }

Reply via email to