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 1a834815784 Fix read lock leak in disk usage statistics (#18807)
1a834815784 is described below

commit 1a834815784b24781d93e51cf85b7e76fdc8cfe2
Author: shuwenwei <[email protected]>
AuthorDate: Fri Oct 9 17:46:07 2026 +0800

    Fix read lock leak in disk usage statistics (#18807)
---
 .../dataregion/utils/DiskUsageStatisticUtil.java             | 12 ++++++------
 .../storageengine/dataregion/utils/TableDiskUsageTest.java   |  8 ++++++++
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
index 982c6d56aff..2f6c6ac816c 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/utils/DiskUsageStatisticUtil.java
@@ -53,6 +53,7 @@ import java.util.stream.Stream;
 public abstract class DiskUsageStatisticUtil implements Closeable {
 
   protected static final Logger logger = 
LoggerFactory.getLogger(DiskUsageStatisticUtil.class);
+  // Collected files retain a reader reference and its resource read lock 
until released.
   protected Queue<TsFileResource> resourcesWithReadLock;
   protected final long timePartition;
   protected final Iterator<TsFileResource> iterator;
@@ -100,9 +101,9 @@ public abstract class DiskUsageStatisticUtil implements 
Closeable {
         if (!resource.isClosed()) {
           continue;
         }
-        resource.readLock();
+        FileReaderManager.getInstance().increaseFileReaderReference(resource, 
true);
         if (resource.isDeleted() || !resource.isClosed()) {
-          resource.readUnlock();
+          
FileReaderManager.getInstance().decreaseFileReaderReference(resource, true);
           continue;
         }
         resourcesWithReadLock.add(resource);
@@ -118,7 +119,7 @@ public abstract class DiskUsageStatisticUtil implements 
Closeable {
       return;
     }
     for (TsFileResource resource : resourcesWithReadLock) {
-      resource.readUnlock();
+      FileReaderManager.getInstance().decreaseFileReaderReference(resource, 
true);
     }
     resourcesWithReadLock = null;
   }
@@ -127,10 +128,9 @@ public abstract class DiskUsageStatisticUtil implements 
Closeable {
     TsFileResource tsFileResource = iterator.next();
     if (tsFileResource.isDeleted() || 
calculateWithoutOpenFile(tsFileResource)) {
       iterator.remove();
-      tsFileResource.readUnlock();
+      
FileReaderManager.getInstance().decreaseFileReaderReference(tsFileResource, 
true);
       return;
     }
-    
FileReaderManager.getInstance().increaseFileReaderReference(tsFileResource, 
true);
     try {
       TsFileSequenceReader reader =
           FileReaderManager.getInstance()
@@ -146,7 +146,7 @@ public abstract class DiskUsageStatisticUtil implements 
Closeable {
           tsFileResource.getTsFile().getAbsolutePath(),
           e);
     } finally {
-      // this operation including readUnlock
+      // Release the reader reference registered during collection, including 
its read lock.
       
FileReaderManager.getInstance().decreaseFileReaderReference(tsFileResource, 
true);
       iterator.remove();
     }
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageTest.java
index 4f60753fabe..230be9289c2 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/utils/TableDiskUsageTest.java
@@ -240,6 +240,14 @@ public class TableDiskUsageTest extends 
AbstractCompactionTest {
 
     DataRegionTableSizeQueryContext context = new 
DataRegionTableSizeQueryContext(true);
     queryTableSize(context);
+    boolean writeLockAcquired = resource1.tryWriteLock();
+    try {
+      Assert.assertTrue("Disk usage statistics should release all read locks", 
writeLockAcquired);
+    } finally {
+      if (writeLockAcquired) {
+        resource1.writeUnlock();
+      }
+    }
     Assert.assertEquals(1, 
context.getTimePartitionTableSizeQueryContextMap().size());
     TimePartitionTableSizeQueryContext timePartitionContext =
         
context.getTimePartitionTableSizeQueryContextMap().values().iterator().next();

Reply via email to