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

jackietien pushed a commit to branch TimeSeriesMetadataCacheBug
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/TimeSeriesMetadataCacheBug by 
this push:
     new 45e4b7c  fix bug
45e4b7c is described below

commit 45e4b7c4836f5c31da7e9b87b999bed3859fcf32
Author: JackieTien97 <[email protected]>
AuthorDate: Wed Dec 23 16:01:17 2020 +0800

    fix bug
---
 .../db/engine/cache/TimeSeriesMetadataCache.java   | 15 ++++++----
 .../iotdb/tsfile/read/TsFileSequenceReader.java    | 34 ++++++++++++++++++++++
 2 files changed, 44 insertions(+), 5 deletions(-)

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 3e00ea0..e49c12f 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
@@ -134,6 +134,12 @@ public class TimeSeriesMetadataCache {
       cacheHitNum.incrementAndGet();
       printCacheLog(true);
     } else {
+      if (config.isDebugOn()) {
+        DEBUG_LOGGER.info(
+            "Cache miss: " + key.device + "." + key.measurement + " metadata 
in file: "
+                + key.filePath);
+        DEBUG_LOGGER.info("Device: " + key.device + " all sensors: " + 
allSensors);
+      }
       // allow for the parallelism of different devices in different files
       synchronized (devices
           .computeIfAbsent(key.device + SEPARATOR + key.filePath, 
WeakReference::new)) {
@@ -148,20 +154,19 @@ public class TimeSeriesMetadataCache {
           cacheHitNum.incrementAndGet();
           printCacheLog(true);
         } else {
-          printCacheLog(false);
+          Path path = new Path(key.device, key.measurement);
           // 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)) {
-
+          if (bloomFilter != null && 
!bloomFilter.contains(path.getFullPath())) {
             if (config.isDebugOn()) {
               DEBUG_LOGGER.info("TimeSeries meta data " + key + " is filter by 
bloomFilter!");
             }
             return null;
           }
+          printCacheLog(false);
           List<TimeseriesMetadata> timeSeriesMetadataList = reader
-              .readTimeseriesMetadata(key.device, allSensors);
+              .readTimeseriesMetadata(path, allSensors);
           // put TimeSeriesMetadata of all sensors used in this query into 
cache
           lock.writeLock().lock();
           try {
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 432b70b..6d79f9b 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
@@ -331,6 +331,40 @@ public class TsFileSequenceReader implements AutoCloseable 
{
     return searchResult >= 0 ? timeseriesMetadataList.get(searchResult) : null;
   }
 
+  /**
+   * Find the leaf node that contains path, return all the sensors in that 
leaf node which are also
+   * in allSensors set
+   */
+  public List<TimeseriesMetadata> readTimeseriesMetadata(Path path, 
Set<String> allSensors)
+      throws IOException {
+    readFileMetadata();
+    MetadataIndexNode deviceMetadataIndexNode = 
tsFileMetaData.getMetadataIndex();
+    Pair<MetadataIndexEntry, Long> metadataIndexPair = getMetadataAndEndOffset(
+        deviceMetadataIndexNode, path.getDevice(), 
MetadataIndexNodeType.INTERNAL_DEVICE, true);
+    if (metadataIndexPair == null) {
+      return null;
+    }
+    ByteBuffer buffer = readData(metadataIndexPair.left.getOffset(), 
metadataIndexPair.right);
+    MetadataIndexNode metadataIndexNode = deviceMetadataIndexNode;
+    if 
(!metadataIndexNode.getNodeType().equals(MetadataIndexNodeType.LEAF_MEASUREMENT))
 {
+      metadataIndexNode = MetadataIndexNode.deserializeFrom(buffer);
+      metadataIndexPair = getMetadataAndEndOffset(metadataIndexNode,
+          path.getMeasurement(), MetadataIndexNodeType.INTERNAL_MEASUREMENT, 
false);
+    }
+    if (metadataIndexPair == null) {
+      return null;
+    }
+    List<TimeseriesMetadata> timeseriesMetadataList = new ArrayList<>();
+    buffer = readData(metadataIndexPair.left.getOffset(), 
metadataIndexPair.right);
+    while (buffer.hasRemaining()) {
+      TimeseriesMetadata timeseriesMetadata = 
TimeseriesMetadata.deserializeFrom(buffer);
+      if (allSensors.contains(timeseriesMetadata.getMeasurementId())) {
+        timeseriesMetadataList.add(timeseriesMetadata);
+      }
+    }
+    return timeseriesMetadataList;
+  }
+
   public List<TimeseriesMetadata> readTimeseriesMetadata(String device, 
Set<String> measurements)
       throws IOException {
     readFileMetadata();

Reply via email to