You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2021/11/26 07:59:49 UTC
[iotdb] 01/01: close TsFileSequenceReader immediately if ref is zero
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 <wx...@gmail.com>
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.