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

xingtanzjr pushed a commit to branch rel/1.1
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/rel/1.1 by this push:
     new 1ba56299057 Fix a concurrent bug when recover last flush time and 
compact (#10839) (#10850)
1ba56299057 is described below

commit 1ba56299057309c464e93c4b5839fafb52842565
Author: Haonan <[email protected]>
AuthorDate: Mon Aug 14 17:29:41 2023 +0800

    Fix a concurrent bug when recover last flush time and compact (#10839) 
(#10850)
---
 .../db/engine/storagegroup/HashLastFlushTimeMap.java    | 14 +-------------
 .../iotdb/db/engine/storagegroup/TsFileManager.java     | 17 +++++++++++++++++
 2 files changed, 18 insertions(+), 13 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/HashLastFlushTimeMap.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/HashLastFlushTimeMap.java
index 1dfb5a9a9de..db42b87baeb 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/HashLastFlushTimeMap.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/HashLastFlushTimeMap.java
@@ -23,9 +23,7 @@ import org.slf4j.Logger;
 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 {
 
@@ -225,19 +223,9 @@ public class HashLastFlushTimeMap implements 
ILastFlushTimeMap {
   }
 
   private long recoverFlushTime(long partitionId, String devicePath) {
-    List<TsFileResource> tsFileResourceList =
-        tsFileManager.getOrCreateSequenceListByTimePartition(partitionId);
-
-    for (int i = tsFileResourceList.size() - 1; i >= 0; i--) {
-      Set<String> deviceSet = tsFileResourceList.get(i).getDevices();
-      if (deviceSet.contains(devicePath)) {
-        return tsFileResourceList.get(i).getEndTime(devicePath);
-      }
-    }
-
     long memCost = HASHMAP_NODE_BASIC_SIZE + 2L * devicePath.length();
     memCostForEachPartition.compute(partitionId, (k, v) -> v == null ? memCost 
: v + memCost);
-    return Long.MIN_VALUE;
+    return tsFileManager.recoverFlushTimeFromTsFileResource(partitionId, 
devicePath);
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
index c8ff4534099..a903aef42ff 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileManager.java
@@ -103,6 +103,23 @@ public class TsFileManager {
     }
   }
 
+  public long recoverFlushTimeFromTsFileResource(long partitionId, String 
devicePath) {
+    writeLock("recoverFlushTimeFromTsFileResource");
+    try {
+      List<TsFileResource> tsFileResourceList =
+          sequenceFiles.computeIfAbsent(partitionId, l -> new 
TsFileResourceList());
+      for (int i = tsFileResourceList.size() - 1; i >= 0; i--) {
+        Set<String> deviceSet = tsFileResourceList.get(i).getDevices();
+        if (deviceSet.contains(devicePath)) {
+          return tsFileResourceList.get(i).getEndTime(devicePath);
+        }
+      }
+    } finally {
+      writeUnlock();
+    }
+    return Long.MIN_VALUE;
+  }
+
   public Iterator<TsFileResource> getIterator(boolean sequence) {
     readLock();
     try {

Reply via email to