You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2020/02/26 13:08:41 UTC
[incubator-iotdb] branch FileClosedDebug updated: final bug
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch FileClosedDebug
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
The following commit(s) were added to refs/heads/FileClosedDebug by this push:
new 962ebe9 final bug
962ebe9 is described below
commit 962ebe9b37df8b2ec4113c94b3d8e92fae6f8165
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Wed Feb 26 21:08:26 2020 +0800
final bug
---
.../apache/iotdb/db/engine/cache/ChunkCache.java | 29 +++++++++++++++-------
.../iotdb/db/query/control/FileReaderManager.java | 26 ++++++++++++++++---
.../iotdb/db/query/reader/series/SeriesReader.java | 8 +++---
.../iotdb/tsfile/read/TsFileSequenceReader.java | 6 -----
.../tsfile/read/reader/DefaultTsFileInput.java | 23 +----------------
5 files changed, 47 insertions(+), 45 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
index 24a5ad1..fa286c4 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkCache.java
@@ -29,6 +29,7 @@ import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -84,16 +85,26 @@ public class ChunkCache {
lock.readLock().unlock();
}
- lock.writeLock().lock();
- if (lruCache.containsKey(chunkMetaData)) {
- lock.readLock().lock();
- lock.writeLock().unlock();
- cacheHitNum.incrementAndGet();
- printCacheLog(true);
- Chunk chunk = lruCache.get(chunkMetaData);
- lock.readLock().unlock();
- return new Chunk(chunk.getHeader(), chunk.getData().duplicate(), chunk.getDeletedAt(), reader.getEndianType());
+ Lock cacheLock = lock.writeLock();
+ try {
+ cacheLock.lock();
+ if (lruCache.containsKey(chunkMetaData)) {
+ try {
+ cacheLock = lock.readLock();
+ cacheLock.lock();
+ } finally {
+ lock.writeLock().unlock();
+ }
+ cacheHitNum.incrementAndGet();
+ printCacheLog(true);
+ Chunk chunk = lruCache.get(chunkMetaData);
+ return new Chunk(chunk.getHeader(), chunk.getData().duplicate(), chunk.getDeletedAt(), reader.getEndianType());
+ }
+ } finally {
+ cacheLock.unlock();
}
+
+
printCacheLog(false);
Chunk chunk = reader.readMemChunk(chunkMetaData);
lruCache.put(chunkMetaData, chunk);
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 47e66a0..b1cd0b8 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
@@ -93,12 +93,12 @@ public class FileReaderManager implements IService {
closedReferenceMap.remove(seqFile);
TsFileSequenceReader reader = closedFileReaderMap.remove(seqFile);
if (reader != null) {
- reader.close("Merge");
+ reader.close();
}
unclosedReferenceMap.remove(seqFile);
reader = unclosedFileReaderMap.remove(seqFile);
if (reader != null) {
- reader.close("Merge");
+ reader.close();
}
}
@@ -124,7 +124,7 @@ public class FileReaderManager implements IService {
if (refAtom != null && refAtom.get() == 0) {
try {
- reader.close("no reference");
+ reader.close();
} catch (IOException e) {
logger.error("Can not close TsFileSequenceReader {} !", reader.getFileName(), e);
}
@@ -204,6 +204,26 @@ public class FileReaderManager implements IService {
* integration tests will not conflict with each other.
*/
public synchronized void closeAndRemoveAllOpenedReaders() throws IOException {
+ Iterator<Map.Entry<TsFileResource, TsFileSequenceReader>> iterator = closedFileReaderMap.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<TsFileResource, TsFileSequenceReader> entry = iterator.next();
+ entry.getValue().close();
+ if (resourceLogger.isInfoEnabled()) {
+ resourceLogger.info("{} closedTsFileReader is closed.", entry.getValue().getFileName());
+ }
+ closedReferenceMap.remove(entry.getKey());
+ iterator.remove();
+ }
+ iterator = unclosedFileReaderMap.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry<TsFileResource, TsFileSequenceReader> entry = iterator.next();
+ entry.getValue().close();
+ if (resourceLogger.isInfoEnabled()) {
+ resourceLogger.info("{} unclosedTsFileReader is closed.", entry.getValue().getFileName());
+ }
+ unclosedReferenceMap.remove(entry.getKey());
+ iterator.remove();
+ }
for (Map.Entry<TsFileResource, TsFileSequenceReader> entry : closedFileReaderMap.entrySet()) {
entry.getValue().close();
if (resourceLogger.isInfoEnabled()) {
diff --git a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
index f9da1c6..8b1f795 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/reader/series/SeriesReader.java
@@ -390,11 +390,9 @@ public class SeriesReader {
}
for (ChunkMetaData data : currentChunkMetaDataList) {
- if (data.getChunkLoader() == null) {
- TsFileSequenceReader tsFileSequenceReader = FileReaderManager.getInstance()
- .get(resource, resource.isClosed());
- data.setChunkLoader(new DiskChunkLoader(tsFileSequenceReader));
- }
+ TsFileSequenceReader tsFileSequenceReader = FileReaderManager.getInstance()
+ .get(resource, resource.isClosed());
+ data.setChunkLoader(new DiskChunkLoader(tsFileSequenceReader));
}
List<ReadOnlyMemChunk> memChunks = resource.getReadOnlyMemChunk();
if (memChunks != null) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
index 62f52cd..6fd2e43 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java
@@ -471,12 +471,6 @@ public class TsFileSequenceReader implements AutoCloseable {
deviceMetadataMap = null;
}
- public void close(String reason) throws IOException {
- logger.error("{} reader is closed by {}", file, reason);
- this.tsFileInput.close();
- deviceMetadataMap = null;
- }
-
public String getFileName() {
return this.file;
}
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/DefaultTsFileInput.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/DefaultTsFileInput.java
index 42da61d..d20a313 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/DefaultTsFileInput.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/reader/DefaultTsFileInput.java
@@ -18,9 +18,6 @@
*/
package org.apache.iotdb.tsfile.read.reader;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;
@@ -31,16 +28,10 @@ import java.nio.file.StandardOpenOption;
public class DefaultTsFileInput implements TsFileInput {
- private static final Logger LOGGER = LoggerFactory
- .getLogger(DefaultTsFileInput.class);
-
- FileChannel channel;
-
- private Path path;
+ private FileChannel channel;
public DefaultTsFileInput(Path file) throws IOException {
channel = FileChannel.open(file, StandardOpenOption.READ);
- path = file;
}
@Override
@@ -66,10 +57,6 @@ public class DefaultTsFileInput implements TsFileInput {
@Override
public int read(ByteBuffer dst, long position) throws IOException {
-// if (!channel.isOpen()) {
-// LOGGER.error("File is closed while reading {}", path.toString());
-// channel = FileChannel.open(path, StandardOpenOption.READ);
-// }
return channel.read(dst, position);
}
@@ -95,14 +82,6 @@ public class DefaultTsFileInput implements TsFileInput {
@Override
public void close() throws IOException {
- LOGGER.error("{} FileChannel is closed", path);
-// Throwable ex = new Throwable();
-// StackTraceElement[] stackElements = ex.getStackTrace();
-// if (stackElements != null) {
-// for (StackTraceElement stackElement : stackElements) {
-// LOGGER.error("Class Name: {}, Function Name: {}, Line: {}", stackElement.getClassName(), stackElement.getMethodName(), stackElement.getLineNumber());
-// }
-// }
channel.close();
}