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 982c6d56aff5b..2f6c6ac816c3a 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 @@ 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 resourcesWithReadLock; protected final long timePartition; protected final Iterator iterator; @@ -100,9 +101,9 @@ protected void acquireReadLocks(List resources) { 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 @@ protected void releaseReadLocks() { return; } for (TsFileResource resource : resourcesWithReadLock) { - resource.readUnlock(); + FileReaderManager.getInstance().decreaseFileReaderReference(resource, true); } resourcesWithReadLock = null; } @@ -127,10 +128,9 @@ public void calculateNextFile() { 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 void calculateNextFile() { 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 4f60753fabe6b..230be9289c21e 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 void testCalculateTableSizeFromFile() throws Exception { 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();