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

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


The following commit(s) were added to refs/heads/master by this push:
     new 238f230  [IOTDB-2581] Fix compaction recover in 0.13.0 is not 
compatible with 0.12.5 (#5099)
238f230 is described below

commit 238f230a83d604d179deb36a176deee80c98374f
Author: Liu Xuxin <[email protected]>
AuthorDate: Fri Feb 25 20:54:13 2022 +0800

    [IOTDB-2581] Fix compaction recover in 0.13.0 is not compatible with 0.12.5 
(#5099)
---
 .../db/engine/compaction/TsFileIdentifier.java     |  12 +-
 .../inner/utils/SizeTieredCompactionLogger.java    |   4 +-
 .../SizeTieredCompactionRecoverCompatibleTest.java | 157 +++++++++++++++++++++
 3 files changed, 166 insertions(+), 7 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifier.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifier.java
index daf8808..a93c34e 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifier.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifier.java
@@ -36,16 +36,18 @@ public class TsFileIdentifier {
   private final boolean sequence;
   private final String filename;
   public static final String INFO_SEPARATOR = " ";
+  // Notice: Do not change the offset of info
   public static final int FILE_NAME_OFFSET_IN_PATH = 1;
   public static final int TIME_PARTITION_OFFSET_IN_PATH = 2;
   public static final int VIRTUAL_SG_OFFSET_IN_PATH = 3;
   public static final int LOGICAL_SG_OFFSET_IN_PATH = 4;
   public static final int SEQUENCE_OFFSET_IN_PATH = 5;
+
   public static final int LOGICAL_SG_OFFSET_IN_LOG = 0;
   public static final int VIRTUAL_SG_OFFSET_IN_LOG = 1;
   public static final int TIME_PARTITION_OFFSET_IN_LOG = 2;
-  public static final int SEQUENCE_OFFSET_IN_LOG = 3;
-  public static final int FILE_NAME_OFFSET_IN_LOG = 4;
+  public static final int FILE_NAME_OFFSET_IN_LOG = 3;
+  public static final int SEQUENCE_OFFSET_IN_LOG = 4;
 
   private TsFileIdentifier(
       String logicalStorageGroupName,
@@ -105,7 +107,7 @@ public class TsFileIdentifier {
         splittedFileInfo[LOGICAL_SG_OFFSET_IN_LOG],
         splittedFileInfo[VIRTUAL_SG_OFFSET_IN_LOG],
         splittedFileInfo[TIME_PARTITION_OFFSET_IN_LOG],
-        Boolean.parseBoolean(splittedFileInfo[SEQUENCE_OFFSET_IN_LOG]),
+        splittedFileInfo[SEQUENCE_OFFSET_IN_LOG].equals("sequence"),
         splittedFileInfo[FILE_NAME_OFFSET_IN_LOG]);
   }
 
@@ -119,9 +121,9 @@ public class TsFileIdentifier {
         INFO_SEPARATOR,
         timePartitionId,
         INFO_SEPARATOR,
-        sequence,
+        filename,
         INFO_SEPARATOR,
-        filename);
+        sequence ? "sequence" : "unsequence");
   }
 
   @Override
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SizeTieredCompactionLogger.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SizeTieredCompactionLogger.java
index 687449f..bc8d36b 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SizeTieredCompactionLogger.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/SizeTieredCompactionLogger.java
@@ -32,8 +32,8 @@ public class SizeTieredCompactionLogger {
   public static final String COMPACTION_LOG_NAME = ".compaction.log";
   public static final String SOURCE_NAME = "source";
   public static final String TARGET_NAME = "target";
-  public static final String SOURCE_INFO = "source_info";
-  public static final String TARGET_INFO = "target_info";
+  public static final String SOURCE_INFO = "info-source";
+  public static final String TARGET_INFO = "info-target";
   public static final String SEQUENCE_NAME = "sequence";
   public static final String UNSEQUENCE_NAME = "unsequence";
 
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverCompatibleTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverCompatibleTest.java
new file mode 100644
index 0000000..e9bd9f8
--- /dev/null
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverCompatibleTest.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.engine.compaction.recover;
+
+import org.apache.iotdb.db.engine.compaction.AbstractCompactionTest;
+import 
org.apache.iotdb.db.engine.compaction.inner.sizetiered.SizeTieredCompactionRecoverTask;
+import 
org.apache.iotdb.db.engine.compaction.inner.utils.InnerSpaceCompactionUtils;
+import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
+import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
+import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.exception.metadata.MetadataException;
+import org.apache.iotdb.tsfile.exception.write.WriteProcessException;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/** This test is used to test the compatibility of compaction recovery with 
0.12. */
+public class SizeTieredCompactionRecoverCompatibleTest extends 
AbstractCompactionTest {
+  @Override
+  @Before
+  public void setUp() throws IOException, MetadataException, 
WriteProcessException {
+    super.setUp();
+  }
+
+  @Override
+  @After
+  public void tearDown() throws StorageEngineException, IOException {
+    super.tearDown();
+  }
+
+  @Test
+  public void testCompatibleWithFilePath() throws Exception {
+    createFiles(6, 2, 3, 100, 0, 0, 50, 50, false, true);
+    registerTimeseriesInMManger(2, 3, false);
+    TsFileResource targetResource =
+        TsFileNameGenerator.getInnerCompactionTargetFileResource(seqResources, 
true);
+    InnerSpaceCompactionUtils.compact(targetResource, seqResources);
+    RandomAccessFile targetFile = new 
RandomAccessFile(targetResource.getTsFile(), "rw");
+    long fileLength = targetFile.length();
+    targetFile.getChannel().truncate(fileLength - 20);
+    targetFile.close();
+
+    File logFile =
+        new File(
+            targetResource.getTsFile().getParent(),
+            targetResource.getTsFile().getName() + ".compaction.log");
+    BufferedWriter logWriter = new BufferedWriter(new FileWriter(logFile));
+    for (TsFileResource tsFileResource : seqResources) {
+      logWriter.write(
+          String.format(
+              "info-source\nroot.compactionTest 0 0 %s sequence\n",
+              tsFileResource.getTsFile().getName()));
+    }
+    logWriter.write("sequence\n");
+    logWriter.write(
+        String.format(
+            "info-target\nroot.compactionTest 0 0 %s sequence\n",
+            targetResource.getTsFile().getName()));
+    logWriter.close();
+
+    TsFileManager tsFileManager =
+        new TsFileManager("root.compactionTest", "0", 
targetResource.getTsFile().getParent());
+    tsFileManager.addAll(seqResources, true);
+    SizeTieredCompactionRecoverTask recoverTask =
+        new SizeTieredCompactionRecoverTask(
+            "root.compactionTest",
+            "0",
+            0,
+            logFile,
+            targetResource.getTsFile().getParent(),
+            true,
+            new AtomicInteger(0),
+            tsFileManager);
+    recoverTask.call();
+
+    for (TsFileResource resource : seqResources) {
+      Assert.assertTrue(resource.getTsFile().exists());
+    }
+
+    Assert.assertFalse(targetResource.getTsFile().exists());
+    Assert.assertFalse(logFile.exists());
+  }
+
+  @Test
+  public void testCompatibleWithFileInfo() throws Exception {
+    createFiles(6, 2, 3, 100, 0, 0, 50, 50, false, true);
+    registerTimeseriesInMManger(2, 3, false);
+    TsFileResource targetResource =
+        TsFileNameGenerator.getInnerCompactionTargetFileResource(seqResources, 
true);
+    InnerSpaceCompactionUtils.compact(targetResource, seqResources);
+    RandomAccessFile targetFile = new 
RandomAccessFile(targetResource.getTsFile(), "rw");
+    long fileLength = targetFile.length();
+    targetFile.getChannel().truncate(fileLength - 20);
+    targetFile.close();
+
+    File logFile =
+        new File(
+            targetResource.getTsFile().getParent(),
+            targetResource.getTsFile().getName() + ".compaction.log");
+    BufferedWriter logWriter = new BufferedWriter(new FileWriter(logFile));
+    for (TsFileResource tsFileResource : seqResources) {
+      logWriter.write(String.format("source\n%s\n", 
tsFileResource.getTsFile().getAbsolutePath()));
+    }
+    logWriter.write("sequence\n");
+    logWriter.write(String.format("target\n%s\n", 
targetResource.getTsFile().getAbsolutePath()));
+    logWriter.close();
+
+    TsFileManager tsFileManager =
+        new TsFileManager("root.compactionTest", "0", 
targetResource.getTsFile().getParent());
+    tsFileManager.addAll(seqResources, true);
+    SizeTieredCompactionRecoverTask recoverTask =
+        new SizeTieredCompactionRecoverTask(
+            "root.compactionTest",
+            "0",
+            0,
+            logFile,
+            targetResource.getTsFile().getParent(),
+            true,
+            new AtomicInteger(0),
+            tsFileManager);
+    recoverTask.call();
+
+    for (TsFileResource resource : seqResources) {
+      Assert.assertTrue(resource.getTsFile().exists());
+    }
+
+    Assert.assertFalse(targetResource.getTsFile().exists());
+    Assert.assertFalse(logFile.exists());
+  }
+}

Reply via email to