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

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


The following commit(s) were added to refs/heads/rel/0.12 by this push:
     new adb5131  [IOTDB-2138] [To rel/0.12] Fix data loss after IoTDB recover 
(#4563)
adb5131 is described below

commit adb513100d24deed2f10291cb3e896582a8d046c
Author: liuxuxin <[email protected]>
AuthorDate: Tue Dec 14 13:56:17 2021 +0800

    [IOTDB-2138] [To rel/0.12] Fix data loss after IoTDB recover (#4563)
---
 .../level/LevelCompactionTsFileManagement.java     | 13 +++++--------
 .../engine/storagegroup/StorageGroupProcessor.java |  2 ++
 .../db/engine/storagegroup/TsFileResource.java     | 22 ++++++++++++++++++----
 3 files changed, 25 insertions(+), 12 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/level/LevelCompactionTsFileManagement.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/level/LevelCompactionTsFileManagement.java
index aabb674..0e1c12a 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/level/LevelCompactionTsFileManagement.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/level/LevelCompactionTsFileManagement.java
@@ -421,27 +421,24 @@ public class LevelCompactionTsFileManagement extends 
TsFileManagement {
         CompactionFileInfo targetFileInfo = logAnalyzer.getTargetFileInfo();
         String[] dataDirs = 
IoTDBDescriptor.getInstance().getConfig().getDataDirs();
         File targetFile = null;
-        boolean isSeq = logAnalyzer.isSeq();
         if (targetFileInfo == null || sourceFileInfo.isEmpty()) {
           return;
         }
         // get tsfile resource from list, as they have been recovered in 
StorageGroupProcessor
         TsFileResource targetResource = null;
+        File targetResourceFile = null;
         for (String dataDir : dataDirs) {
           if ((targetFile = targetFileInfo.getFile(dataDir)).exists()) {
             targetResource = new TsFileResource(targetFile);
+            targetResourceFile = new File(targetFile.getPath() + 
TsFileResource.RESOURCE_SUFFIX);
           }
         }
         if (targetResource != null) {
-          RestorableTsFileIOWriter writer = new 
RestorableTsFileIOWriter(targetFile);
-          if (writer.hasCrashed()) {
-            // target tsfile is not compeleted
-            writer.close();
-            logger.info(
-                "[Compaction][Recover] target file {} is not complete, remove 
it", targetResource);
+          if (!targetResourceFile.exists()) {
+            // target file resource has not been generated yet
+            // delete target file if exists
             targetResource.remove();
           } else {
-            writer.close();
             // complete compaction, delete source files
             logger.info(
                 "[Compaction][Recover] target file {} is compeleted, remove 
resource file",
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 7d103e7..8da66de 100755
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -673,6 +673,8 @@ public class StorageGroupProcessor {
       try {
         // this tsfile is not zero level, no need to perform redo wal
         if (TsFileResource.getMergeLevel(tsFileResource.getTsFile().getName()) 
> 0) {
+          writer =
+              recoverPerformer.recover(false, this::getWalDirectByteBuffer, 
this::releaseWalBuffer);
           tsFileResource.setClosed(true);
           tsFileManagement.add(tsFileResource, isSeq);
           continue;
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
index ab33b23..ee9cdc3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
@@ -32,7 +32,8 @@ import org.apache.iotdb.db.query.filter.TsFileFilter;
 import org.apache.iotdb.db.service.UpgradeSevice;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
-import org.apache.iotdb.tsfile.file.metadata.*;
+import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
+import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.statistics.Statistics;
 import org.apache.iotdb.tsfile.fileSystem.FSFactoryProducer;
@@ -51,9 +52,21 @@ import java.io.OutputStream;
 import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import java.util.*;
-
-import static org.apache.iotdb.db.conf.IoTDBConstant.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Random;
+import java.util.Set;
+
+import static org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
+import static org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_INDEX;
+import static 
org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_MERGECNT_INDEX;
+import static 
org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_SEPARATOR;
+import static 
org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_TIME_INDEX;
+import static 
org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_UNSEQMERGECNT_INDEX;
+import static 
org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SUFFIX_VERSION_INDEX;
 import static 
org.apache.iotdb.tsfile.common.constant.TsFileConstant.TSFILE_SUFFIX;
 
 @SuppressWarnings("java:S1135") // ignore todos
@@ -491,6 +504,7 @@ public class TsFileResource {
 
   public void removeResourceFile() {
     try {
+      fsFactory.deleteIfExists(fsFactory.getFile(file.getPath() + 
RESOURCE_SUFFIX + TEMP_SUFFIX));
       fsFactory.deleteIfExists(fsFactory.getFile(file.getPath() + 
RESOURCE_SUFFIX));
     } catch (IOException e) {
       logger.error("TsFileResource {} cannot be deleted: {}", file, 
e.getMessage());

Reply via email to