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/07/15 08:14:10 UTC

[incubator-iotdb] 01/01: change lock way

This is an automated email from the ASF dual-hosted git repository.

jackietien pushed a commit to branch experiment/change_cache
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit b4b4e378e7ff1f5bd7ad0bd2c85f8577a26988e5
Author: JackieTien97 <Ja...@foxmail.com>
AuthorDate: Wed Jul 15 16:13:44 2020 +0800

    change lock way
---
 .../apache/iotdb/db/engine/cache/ChunkCache.java   | 52 ++++++--------
 .../iotdb/db/engine/cache/ChunkMetadataCache.java  | 33 ++++-----
 .../db/engine/cache/TimeSeriesMetadataCache.java   | 80 ++++++++++++----------
 3 files changed, 77 insertions(+), 88 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 d9ef0a9..f6e6f6a 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
@@ -21,7 +21,6 @@ package org.apache.iotdb.db.engine.cache;
 
 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;
 import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -91,43 +90,32 @@ public class ChunkCache {
 
     cacheRequestNum.incrementAndGet();
 
+    Chunk chunk;
+    lock.readLock().lock();
     try {
-      lock.readLock().lock();
-      if (lruCache.containsKey(chunkMetaData)) {
-        cacheHitNum.incrementAndGet();
-        printCacheLog(true);
-        Chunk chunk = lruCache.get(chunkMetaData);
-        return new Chunk(chunk.getHeader(), chunk.getData().duplicate(), chunk.getDeletedAt());
-      }
+      chunk = lruCache.get(chunkMetaData);
     } finally {
       lock.readLock().unlock();
     }
-
-    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());
-      }
+    if (chunk != null) {
+      cacheHitNum.incrementAndGet();
+      printCacheLog(true);
+    } else {
       printCacheLog(false);
-      Chunk chunk = reader.readMemChunk(chunkMetaData);
-      lruCache.put(chunkMetaData, chunk);
-      return new Chunk(chunk.getHeader(), chunk.getData().duplicate(), chunk.getDeletedAt());
-    } catch (IOException e) {
-      logger.error("something wrong happened while reading {}", reader.getFileName());
-      throw e;
-    } finally {
-      cacheLock.unlock();
+      try {
+        chunk = reader.readMemChunk(chunkMetaData);
+      } catch (IOException e) {
+        logger.error("something wrong happened while reading {}", reader.getFileName());
+        throw e;
+      }
+      lock.writeLock().lock();
+      try {
+        lruCache.put(chunkMetaData, chunk);
+      } finally {
+        lock.writeLock().unlock();
+      }
     }
+    return new Chunk(chunk.getHeader(), chunk.getData().duplicate(), chunk.getDeletedAt());
 
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
index 623dfec..4ff58e7 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/cache/ChunkMetadataCache.java
@@ -130,23 +130,18 @@ public class ChunkMetadataCache {
     cacheRequestNum.incrementAndGet();
 
     lock.readLock().lock();
+    List<ChunkMetadata> chunkMetadataList;
     try {
-      if (lruCache.containsKey(key)) {
-        cacheHitNum.incrementAndGet();
-        printCacheLog(true);
-        return new ArrayList<>(lruCache.get(key));
-      }
+      chunkMetadataList = lruCache.get(key);
     } finally {
       lock.readLock().unlock();
     }
 
-    lock.writeLock().lock();
-    try {
-      if (lruCache.containsKey(key)) {
-        printCacheLog(true);
-        cacheHitNum.incrementAndGet();
-        return new ArrayList<>(lruCache.get(key));
-      }
+
+    if (chunkMetadataList != null) {
+      printCacheLog(true);
+      cacheHitNum.incrementAndGet();
+    } else {
       printCacheLog(false);
       // bloom filter part
       TsFileSequenceReader tsFileReader = FileReaderManager.getInstance().get(filePath, true);
@@ -154,13 +149,15 @@ public class ChunkMetadataCache {
       if (bloomFilter != null && !bloomFilter.contains(seriesPath.getFullPath())) {
         return new ArrayList<>();
       }
-      List<ChunkMetadata> chunkMetaDataList = FileLoaderUtils
-          .getChunkMetadataList(seriesPath, filePath);
-      lruCache.put(key, chunkMetaDataList);
-      return new ArrayList<>(chunkMetaDataList);
-    } finally {
-      lock.writeLock().unlock();
+      chunkMetadataList = FileLoaderUtils.getChunkMetadataList(seriesPath, filePath);
+      lock.writeLock().lock();
+      try {
+        lruCache.put(key, chunkMetadataList);
+      } finally {
+        lock.writeLock().unlock();
+      }
     }
+    return new ArrayList<>(chunkMetadataList);
   }
 
   private void printCacheLog(boolean isHit) {
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java b/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
index aa3a846..89e43db 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/cache/TimeSeriesMetadataCache.java
@@ -112,51 +112,55 @@ public class TimeSeriesMetadataCache {
 
     cacheRequestNum.incrementAndGet();
 
+    TimeseriesMetadata timeseriesMetadata;
+    lock.readLock().lock();
     try {
-      lock.readLock().lock();
-      if (lruCache.containsKey(key)) {
-        cacheHitNum.incrementAndGet();
-        printCacheLog(true);
-        return new TimeseriesMetadata(lruCache.get(key));
-      }
+      timeseriesMetadata = lruCache.get(key);
     } finally {
       lock.readLock().unlock();
     }
 
-    try {
-      lock.writeLock().lock();
-      if (lruCache.containsKey(key)) {
-        cacheHitNum.incrementAndGet();
-        printCacheLog(true);
-        return new TimeseriesMetadata(lruCache.get(key));
-      }
-      printCacheLog(false);
-      // bloom filter part
-      TsFileSequenceReader reader = FileReaderManager.getInstance().get(key.filePath, true);
-      BloomFilter bloomFilter = reader.readBloomFilter();
-      if (bloomFilter != null && !bloomFilter
-          .contains(key.device + IoTDBConstant.PATH_SEPARATOR + key.measurement)) {
-        return null;
-      }
-      List<TimeseriesMetadata> timeSeriesMetadataList = reader
-          .readTimeseriesMetadata(key.device, allSensors);
-      // put TimeSeriesMetadata of all sensors used in this query into cache
-      timeSeriesMetadataList.forEach(timeseriesMetadata ->
-          lruCache.put(new TimeSeriesMetadataCacheKey(key.filePath, key.device,
-              timeseriesMetadata.getMeasurementId()), timeseriesMetadata));
-      TimeseriesMetadata metadata = lruCache.get(key);
-      if (metadata == null) {
-        return null;
-      } else {
-        return new TimeseriesMetadata(metadata);
+    if (timeseriesMetadata != null) {
+      cacheHitNum.incrementAndGet();
+      printCacheLog(true);
+    } else {
+      // allow for the parallelism of different devices
+      synchronized (key.device.intern()) {
+        // double check
+        lock.readLock().lock();
+        try {
+          timeseriesMetadata = lruCache.get(key);
+        } finally {
+          lock.readLock().unlock();
+        }
+        if (timeseriesMetadata != null) {
+          cacheHitNum.incrementAndGet();
+          printCacheLog(true);
+        } else {
+          printCacheLog(false);
+          // bloom filter part
+          TsFileSequenceReader reader = FileReaderManager.getInstance().get(key.filePath, true);
+          BloomFilter bloomFilter = reader.readBloomFilter();
+          if (bloomFilter != null && !bloomFilter
+              .contains(key.device + IoTDBConstant.PATH_SEPARATOR + key.measurement)) {
+            return null;
+          }
+          List<TimeseriesMetadata> timeSeriesMetadataList = reader
+              .readTimeseriesMetadata(key.device, allSensors);
+          // put TimeSeriesMetadata of all sensors used in this query into cache
+          lock.writeLock().lock();
+          try {
+            timeSeriesMetadataList.forEach(metadata ->
+                lruCache.put(new TimeSeriesMetadataCacheKey(key.filePath, key.device,
+                    metadata.getMeasurementId()), metadata));
+            timeseriesMetadata = lruCache.get(key);
+          } finally {
+            lock.writeLock().unlock();
+          }
+        }
       }
-    } catch (IOException e) {
-      logger.error("something wrong happened while reading {}", key.filePath);
-      throw e;
-    } finally {
-      lock.writeLock().unlock();
     }
-
+    return new TimeseriesMetadata(timeseriesMetadata);
   }