You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ha...@apache.org on 2023/08/02 09:13:21 UTC

[iotdb] 01/03: Fix last flush map bug

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

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

commit e21eadb0909d867b1823f90615c5ac64304192aa
Author: HTHou <hh...@outlook.com>
AuthorDate: Wed Aug 2 16:04:16 2023 +0800

    Fix last flush map bug
---
 .../iotdb/db/storageengine/dataregion/DataRegion.java       |  2 +-
 .../db/storageengine/dataregion/HashLastFlushTimeMap.java   |  6 ++++--
 .../execute/performer/impl/FastCompactionPerformer.java     |  2 +-
 .../db/storageengine/dataregion/tsfile/TsFileResource.java  | 13 +++++++------
 .../dataregion/tsfile/timeindex/DeviceTimeIndex.java        |  4 ++--
 .../dataregion/tsfile/timeindex/FileTimeIndex.java          |  4 ++--
 .../dataregion/tsfile/timeindex/ITimeIndex.java             |  7 ++++---
 7 files changed, 21 insertions(+), 17 deletions(-)

diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 7ba71add820..db5d0168d20 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -1943,7 +1943,7 @@ public class DataRegion implements IDataRegionForQuery {
         deviceEndTime = startAndEndTime.getRight();
       } else {
         String deviceId = device.getFullPath();
-        if (!tsFileResource.mayContainsDevice(deviceId)) {
+        if (tsFileResource.definitelyNotContains(deviceId)) {
           // resource does not contain this device
           continue;
         }
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/HashLastFlushTimeMap.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/HashLastFlushTimeMap.java
index cfa4975c453..c1dca62f747 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/HashLastFlushTimeMap.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/HashLastFlushTimeMap.java
@@ -28,6 +28,7 @@ import org.slf4j.LoggerFactory;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class HashLastFlushTimeMap implements ILastFlushTimeMap {
 
@@ -231,8 +232,9 @@ public class HashLastFlushTimeMap implements ILastFlushTimeMap {
         tsFileManager.getOrCreateSequenceListByTimePartition(partitionId);
 
     for (int i = tsFileResourceList.size() - 1; i >= 0; i--) {
-      if (tsFileResourceList.get(i).timeIndex.mayContainsDevice(devicePath)) {
-        return tsFileResourceList.get(i).timeIndex.getEndTime(devicePath);
+      Set<String> deviceSet = tsFileResourceList.get(i).getDevices();
+      if (deviceSet.contains(devicePath)) {
+        return tsFileResourceList.get(i).getEndTime(devicePath);
       }
     }
 
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
index 35bb32eea71..64a9ceb45bb 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/performer/impl/FastCompactionPerformer.java
@@ -120,7 +120,7 @@ public class FastCompactionPerformer
         // actually exist but the judgment return device being existed.
         sortedSourceFiles.addAll(seqFiles);
         sortedSourceFiles.addAll(unseqFiles);
-        sortedSourceFiles.removeIf(x -> !x.mayContainsDevice(device));
+        sortedSourceFiles.removeIf(x -> x.definitelyNotContains(device));
         sortedSourceFiles.sort(Comparator.comparingLong(x -> x.getStartTime(device)));
 
         boolean isAligned = deviceInfo.right;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
index 32c8fa9ab26..b8073a57100 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
@@ -96,7 +96,7 @@ public class TsFileResource {
   protected TsFileResource next;
 
   /** time index */
-  public ITimeIndex timeIndex;
+  private ITimeIndex timeIndex;
 
   @SuppressWarnings("squid:S3077")
   private volatile ModificationFile modFile;
@@ -492,11 +492,12 @@ public class TsFileResource {
   }
 
   /**
-   * Whether this TsFileResource contains this device, if false, it must not contain this device, if
-   * true, it may or may not contain this device
+   * Whether this TsFile definitely not contains this device, if ture, it must not contain this
+   * device, if false, it may or may not contain this device Notice: using method be CAREFULLY and
+   * you really understand the meaning!!!!!
    */
-  public boolean mayContainsDevice(String device) {
-    return timeIndex.mayContainsDevice(device);
+  public boolean definitelyNotContains(String device) {
+    return timeIndex.definitelyNotContains(device);
   }
 
   /**
@@ -800,7 +801,7 @@ public class TsFileResource {
 
   /** @return true if the device is contained in the TsFile */
   public boolean isSatisfied(String deviceId, Filter timeFilter, boolean isSeq, boolean debug) {
-    if (!mayContainsDevice(deviceId)) {
+    if (definitelyNotContains(deviceId)) {
       if (debug) {
         DEBUG_LOGGER.info(
             "Path: {} file {} is not satisfied because of no device!", deviceId, file);
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
index f1324582d9b..48980c4db02 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/DeviceTimeIndex.java
@@ -362,8 +362,8 @@ public class DeviceTimeIndex implements ITimeIndex {
   }
 
   @Override
-  public boolean mayContainsDevice(String device) {
-    return deviceToIndex.containsKey(device);
+  public boolean definitelyNotContains(String device) {
+    return !deviceToIndex.containsKey(device);
   }
 
   @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
index 954459135fa..53f82435f57 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/FileTimeIndex.java
@@ -224,8 +224,8 @@ public class FileTimeIndex implements ITimeIndex {
   }
 
   @Override
-  public boolean mayContainsDevice(String device) {
-    return true;
+  public boolean definitelyNotContains(String device) {
+    return false;
   }
 
   @Override
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
index f867ac32a6f..cdba125f040 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/timeindex/ITimeIndex.java
@@ -188,10 +188,11 @@ public interface ITimeIndex {
   int compareDegradePriority(ITimeIndex timeIndex);
 
   /**
-   * Whether this TsFile contains this device, if false, it must not contain this device, if true,
-   * it may or may not contain this device
+   * Whether this TsFile definitely not contains this device, if ture, it must not contain this
+   * device, if false, it may or may not contain this device Notice: using method be CAREFULLY and
+   * you really understand the meaning!!!!!
    */
-  boolean mayContainsDevice(String device);
+  boolean definitelyNotContains(String device);
 
   /**
    * @return null if the deviceId doesn't exist, otherwise index 0 is startTime, index 1 is endTime