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