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();