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