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 196d6a9 [IOTDB-2712]Remove reading merge.mods in inner compaction
recover (#5186)
196d6a9 is described below
commit 196d6a9da2adcca8b912d91125f6f4eb94850b44
Author: 周沛辰 <[email protected]>
AuthorDate: Thu Mar 10 15:36:14 2022 +0800
[IOTDB-2712]Remove reading merge.mods in inner compaction recover (#5186)
---
.../SizeTieredCompactionRecoverTask.java | 26 +---
.../db/engine/compaction/TsFileIdentifierUT.java | 6 +-
.../SizeTieredCompactionRecoverCompatibleTest.java | 147 ++++++++++++++++++++-
3 files changed, 148 insertions(+), 31 deletions(-)
diff --git
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
index 97ae5c1..af90f86 100644
---
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
+++
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTask.java
@@ -22,7 +22,6 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.engine.compaction.CompactionUtils;
import org.apache.iotdb.db.engine.compaction.TsFileIdentifier;
-import
org.apache.iotdb.db.engine.compaction.cross.rewrite.task.RewriteCrossCompactionRecoverTask;
import
org.apache.iotdb.db.engine.compaction.inner.InnerSpaceCompactionExceptionHandler;
import
org.apache.iotdb.db.engine.compaction.inner.utils.InnerSpaceCompactionUtils;
import org.apache.iotdb.db.engine.compaction.task.AbstractCompactionTask;
@@ -173,9 +172,6 @@ public class SizeTieredCompactionRecoverTask extends
SizeTieredCompactionTask {
true);
} else {
handleSuccess =
handleWithoutAllSourceFilesExist(sourceFileIdentifiers);
- if (logAnalyzer.isLogFromOld()) {
- appendCompactionModificationsFromOld(targetResource);
- }
}
}
} catch (IOException e) {
@@ -270,7 +266,7 @@ public class SizeTieredCompactionRecoverTask extends
SizeTieredCompactionTask {
handleSuccess = false;
}
}
- // delete remaining source files
+ // delete remaining source files and resource files
if (!InnerSpaceCompactionUtils.deleteTsFilesInDisk(
remainSourceTsFileResources, fullStorageGroupName)) {
LOGGER.error(
@@ -297,26 +293,6 @@ public class SizeTieredCompactionRecoverTask extends
SizeTieredCompactionTask {
return null;
}
- /**
- * Append compaction modifications from previous version (<0.13) to target
mods file.
- *
- * @param targetResource
- */
- private void appendCompactionModificationsFromOld(TsFileResource
targetResource)
- throws IOException {
- File compactionModsFileFromOld =
- new File(
- tsFileManager.getStorageGroupDir()
- + File.separator
- + IoTDBConstant.COMPACTION_MODIFICATION_FILE_NAME_FROM_OLD);
- if (compactionModsFileFromOld.exists()) {
- ModificationFile compactionModsFile =
- new ModificationFile(compactionModsFileFromOld.getPath());
- RewriteCrossCompactionRecoverTask.appendCompactionModificationsFromOld(
- targetResource, compactionModsFile);
- }
- }
-
/** Return whether compaction log file is from previous version (<0.13). */
private boolean isOldLog() {
return
compactionLogFile.getName().startsWith(tsFileManager.getStorageGroupName());
diff --git
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifierUT.java
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifierUT.java
index d2078b3..5824bf5 100644
---
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifierUT.java
+++
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/TsFileIdentifierUT.java
@@ -90,7 +90,7 @@ public class TsFileIdentifierUT {
@Test
public void testGetInfoFromInfoString() {
- String[] firstInfoArray = new String[] {"root.test.sg", "0", "0", "true",
"1-1-0-0.tsfile"};
+ String[] firstInfoArray = new String[] {"sequence", "root.test.sg", "0",
"0", "1-1-0-0.tsfile"};
String firstInfoString = String.join(INFO_SEPARATOR, firstInfoArray);
TsFileIdentifier firstInfo =
TsFileIdentifier.getFileIdentifierFromInfoString(firstInfoString);
Assert.assertEquals(firstInfo.getFilename(), "1-1-0-0.tsfile");
@@ -100,7 +100,7 @@ public class TsFileIdentifierUT {
Assert.assertTrue(firstInfo.isSequence());
String[] secondInfoArray =
- new String[] {"root.test.sg", "0", "425", "false",
"666-888-222-131.tsfile"};
+ new String[] {"unsequence", "root.test.sg", "0", "425",
"666-888-222-131.tsfile"};
String secondInfoString = String.join(INFO_SEPARATOR, secondInfoArray);
TsFileIdentifier secondInfo =
TsFileIdentifier.getFileIdentifierFromInfoString(secondInfoString);
@@ -110,7 +110,7 @@ public class TsFileIdentifierUT {
Assert.assertEquals(secondInfo.getLogicalStorageGroupName(),
"root.test.sg");
Assert.assertFalse(secondInfo.isSequence());
- String[] illegalInfoArray = new String[] {"0", "425", "false",
"666-888-222-131.tsfile"};
+ String[] illegalInfoArray = new String[] {"unsequence", "0", "425",
"666-888-222-131.tsfile"};
String illegalInfoString = String.join(INFO_SEPARATOR, illegalInfoArray);
try {
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
index e666d37..4d59def 100644
---
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
@@ -22,12 +22,15 @@ 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.compaction.utils.CompactionFileGeneratorUtils;
+import org.apache.iotdb.db.engine.compaction.utils.log.CompactionLogger;
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.apache.iotdb.tsfile.utils.Pair;
import org.junit.After;
import org.junit.Assert;
@@ -39,8 +42,12 @@ import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;
+import java.util.HashMap;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
+import static
org.apache.iotdb.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR;
+
/** This test is used to test the compatibility of compaction recovery with
0.12. */
public class SizeTieredCompactionRecoverCompatibleTest extends
AbstractCompactionTest {
@Override
@@ -56,7 +63,7 @@ public class SizeTieredCompactionRecoverCompatibleTest
extends AbstractCompactio
}
@Test
- public void testCompatibleWithFilePath() throws Exception {
+ public void testCompatibleWithAllSourceFilesExistWithFilePath() throws
Exception {
createFiles(6, 2, 3, 100, 0, 0, 50, 50, false, true);
registerTimeseriesInMManger(2, 3, false);
TsFileResource targetResource =
@@ -67,8 +74,18 @@ public class SizeTieredCompactionRecoverCompatibleTest
extends AbstractCompactio
targetFile.getChannel().truncate(fileLength - 20);
targetFile.close();
+ for (int i = 0; i < seqResources.size(); i++) {
+ Map<String, Pair<Long, Long>> deleteMap = new HashMap<>();
+ deleteMap.put(
+ COMPACTION_TEST_SG + PATH_SEPARATOR + "d0" + PATH_SEPARATOR + "s0",
+ new Pair(i * 10L, i * 10L + 10));
+ CompactionFileGeneratorUtils.generateMods(deleteMap,
seqResources.get(i), false);
+ }
+
File logFile =
- new File(targetResource.getTsFile().getParent(), "root.compactionTest"
+ ".compaction.log");
+ new File(
+ targetResource.getTsFile().getParent(),
+ "root.compactionTest" +
CompactionLogger.INNER_COMPACTION_LOG_NAME_SUFFIX_FROM_OLD);
BufferedWriter logWriter = new BufferedWriter(new FileWriter(logFile));
for (TsFileResource tsFileResource : seqResources) {
logWriter.write(
@@ -100,14 +117,82 @@ public class SizeTieredCompactionRecoverCompatibleTest
extends AbstractCompactio
for (TsFileResource resource : seqResources) {
Assert.assertTrue(resource.getTsFile().exists());
+ Assert.assertTrue(resource.resourceFileExists());
+ Assert.assertTrue(resource.getModFile().exists());
}
Assert.assertFalse(targetResource.getTsFile().exists());
+ Assert.assertFalse(targetResource.resourceFileExists());
+ Assert.assertFalse(targetResource.getModFile().exists());
Assert.assertFalse(logFile.exists());
}
@Test
- public void testCompatibleWithFileInfo() throws Exception {
+ public void testCompatibleWithSomeSourceFilesLostWithFilePath() 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);
+ InnerSpaceCompactionUtils.moveTargetFile(targetResource,
"root.compactionTest");
+
+ // first source file does not exist
+ seqResources.get(0).delete();
+
+ for (int i = 0; i < seqResources.size(); i++) {
+ Map<String, Pair<Long, Long>> deleteMap = new HashMap<>();
+ deleteMap.put(
+ COMPACTION_TEST_SG + PATH_SEPARATOR + "d0" + PATH_SEPARATOR + "s0",
+ new Pair(i * 10L, i * 10L + 10));
+ CompactionFileGeneratorUtils.generateMods(deleteMap,
seqResources.get(i), false);
+ }
+
+ File logFile =
+ new File(
+ targetResource.getTsFile().getParent(),
+ "root.compactionTest" +
CompactionLogger.INNER_COMPACTION_LOG_NAME_SUFFIX_FROM_OLD);
+ 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.assertFalse(resource.getTsFile().exists());
+ Assert.assertFalse(resource.resourceFileExists());
+ Assert.assertFalse(resource.getModFile().exists());
+ }
+
+ Assert.assertTrue(targetResource.getTsFile().exists());
+ Assert.assertTrue(targetResource.resourceFileExists());
+ Assert.assertFalse(logFile.exists());
+ }
+
+ @Test
+ public void testCompatibleWithAllSourceFilesExistWithFileInfo() throws
Exception {
createFiles(6, 2, 3, 100, 0, 0, 50, 50, false, true);
registerTimeseriesInMManger(2, 3, false);
TsFileResource targetResource =
@@ -150,4 +235,60 @@ public class SizeTieredCompactionRecoverCompatibleTest
extends AbstractCompactio
Assert.assertFalse(targetResource.getTsFile().exists());
Assert.assertFalse(logFile.exists());
}
+
+ @Test
+ public void testCompatibleWithSomeSourceFilesLostWithFileInfo() throws
Exception {
+ createFiles(6, 2, 3, 100, 0, 0, 50, 50, false, false);
+ registerTimeseriesInMManger(2, 3, false);
+ TsFileResource targetResource =
+
TsFileNameGenerator.getInnerCompactionTargetFileResource(unseqResources, true);
+ InnerSpaceCompactionUtils.compact(targetResource, unseqResources);
+ InnerSpaceCompactionUtils.moveTargetFile(targetResource,
"root.compactionTest");
+
+ // first source file does not exist
+ unseqResources.get(0).delete();
+
+ for (int i = 0; i < unseqResources.size(); i++) {
+ Map<String, Pair<Long, Long>> deleteMap = new HashMap<>();
+ deleteMap.put(
+ COMPACTION_TEST_SG + PATH_SEPARATOR + "d0" + PATH_SEPARATOR + "s0",
+ new Pair(i * 10L, i * 10L + 10));
+ CompactionFileGeneratorUtils.generateMods(deleteMap,
unseqResources.get(i), false);
+ }
+
+ File logFile =
+ new File(targetResource.getTsFile().getParent(), "root.compactionTest"
+ ".compaction.log");
+ BufferedWriter logWriter = new BufferedWriter(new FileWriter(logFile));
+ for (TsFileResource tsFileResource : unseqResources) {
+ 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(unseqResources, false);
+ SizeTieredCompactionRecoverTask recoverTask =
+ new SizeTieredCompactionRecoverTask(
+ "root.compactionTest",
+ "0",
+ 0,
+ logFile,
+ targetResource.getTsFile().getParent(),
+ true,
+ new AtomicInteger(0),
+ tsFileManager);
+ recoverTask.call();
+
+ for (TsFileResource resource : unseqResources) {
+ Assert.assertFalse(resource.getTsFile().exists());
+ Assert.assertFalse(resource.resourceFileExists());
+ Assert.assertFalse(resource.getModFile().exists());
+ }
+
+ Assert.assertTrue(targetResource.getTsFile().exists());
+ Assert.assertTrue(targetResource.resourceFileExists());
+ Assert.assertFalse(logFile.exists());
+ }
}