This is an automated email from the ASF dual-hosted git repository. xiangweiwei pushed a commit to branch closeReader in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit c977c58f60a56bd8c38a3585f80f13f9d544dbcd Author: Alima777 <[email protected]> AuthorDate: Fri Nov 26 15:59:04 2021 +0800 close TsFileSequenceReader immediately if ref is zero --- .../iotdb/db/query/control/FileReaderManager.java | 32 ++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/query/control/FileReaderManager.java b/server/src/main/java/org/apache/iotdb/db/query/control/FileReaderManager.java index 01cde88..0b3eeb1 100644 --- a/server/src/main/java/org/apache/iotdb/db/query/control/FileReaderManager.java +++ b/server/src/main/java/org/apache/iotdb/db/query/control/FileReaderManager.java @@ -211,14 +211,42 @@ public class FileReaderManager implements IService { void decreaseFileReaderReference(TsFileResource tsFile, boolean isClosed) { synchronized (this) { if (!isClosed && unclosedReferenceMap.containsKey(tsFile.getTsFilePath())) { - unclosedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet(); + if (unclosedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet() == 0) { + closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), false); + } } else if (closedReferenceMap.containsKey(tsFile.getTsFilePath())) { - closedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet(); + if (closedReferenceMap.get(tsFile.getTsFilePath()).decrementAndGet() == 0) { + closeUnUsedReaderAndRemoveRef(tsFile.getTsFilePath(), true); + } } } tsFile.readUnlock(); } + private void closeUnUsedReaderAndRemoveRef(String tsFilePath, boolean isClosed) { + Map<String, TsFileSequenceReader> readerMap = + isClosed ? closedFileReaderMap : unclosedFileReaderMap; + Map<String, AtomicInteger> refMap = isClosed ? closedReferenceMap : unclosedReferenceMap; + synchronized (this) { + // check ref num again + if (refMap.get(tsFilePath).get() != 0) { + return; + } + + TsFileSequenceReader reader = readerMap.get(tsFilePath); + try { + reader.close(); + } catch (IOException e) { + logger.error("Can not close TsFileSequenceReader {} !", reader.getFileName(), e); + } + readerMap.remove(tsFilePath); + refMap.remove(tsFilePath); + if (resourceLogger.isDebugEnabled()) { + resourceLogger.debug("{} TsFileReader is closed because of no reference.", tsFilePath); + } + } + } + /** * Only for <code>EnvironmentUtils.cleanEnv</code> method. To make sure that unit tests and * integration tests will not conflict with each other.
