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 <[email protected]> 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); }
