This is an automated email from the ASF dual-hosted git repository. qiaojialin pushed a commit to branch fix_imcompatible_file in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git
commit 9ff06605458e8f1aa9b57028db6c3f769f5585e5 Author: qiaojialin <[email protected]> AuthorDate: Wed Apr 8 15:20:38 2020 +0800 not delete incompatible file in file level api --- .../writelog/recover/TsFileRecoverPerformer.java | 23 +++++++++++++--------- ...tion.java => NotCompatibleTsFileException.java} | 4 ++-- .../iotdb/tsfile/read/TsFileSequenceReader.java | 4 ++-- .../write/writer/RestorableTsFileIOWriter.java | 6 +++--- .../iotdb/tsfile/write/TsFileIOWriterTest.java | 4 ++-- .../write/writer/RestorableTsFileIOWriterTest.java | 10 +++++++--- 6 files changed, 30 insertions(+), 21 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java index f126c78..aff32c8 100644 --- a/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java +++ b/server/src/main/java/org/apache/iotdb/db/writelog/recover/TsFileRecoverPerformer.java @@ -37,6 +37,7 @@ import org.apache.iotdb.db.engine.version.VersionController; import org.apache.iotdb.db.exception.StorageGroupProcessorException; import org.apache.iotdb.db.utils.FileLoaderUtils; import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager; +import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException; import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.TimeseriesMetadata; import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; @@ -55,7 +56,7 @@ public class TsFileRecoverPerformer { private static final Logger logger = LoggerFactory.getLogger(TsFileRecoverPerformer.class); - private String insertFilePath; + private String filePath; private String logNodePrefix; private VersionController versionController; private TsFileResource resource; @@ -64,7 +65,7 @@ public class TsFileRecoverPerformer { public TsFileRecoverPerformer(String logNodePrefix, VersionController versionController, TsFileResource currentTsFileResource, boolean acceptUnseq, boolean isLastFile) { - this.insertFilePath = currentTsFileResource.getPath(); + this.filePath = currentTsFileResource.getPath(); this.logNodePrefix = logNodePrefix; this.versionController = versionController; this.resource = currentTsFileResource; @@ -80,15 +81,19 @@ public class TsFileRecoverPerformer { */ public RestorableTsFileIOWriter recover() throws StorageGroupProcessorException { - File insertFile = FSFactoryProducer.getFSFactory().getFile(insertFilePath); - if (!insertFile.exists()) { - logger.error("TsFile {} is missing, will skip its recovery.", insertFilePath); + File file = FSFactoryProducer.getFSFactory().getFile(filePath); + if (!file.exists()) { + logger.error("TsFile {} is missing, will skip its recovery.", filePath); return null; } // remove corrupted part of the TsFile RestorableTsFileIOWriter restorableTsFileIOWriter; try { - restorableTsFileIOWriter = new RestorableTsFileIOWriter(insertFile); + restorableTsFileIOWriter = new RestorableTsFileIOWriter(file); + } catch (NotCompatibleTsFileException e) { + boolean result = file.delete(); + logger.warn("TsFile {} is incompatible. Delete it successfully {}", filePath, result); + throw new StorageGroupProcessorException(e); } catch (IOException e) { throw new StorageGroupProcessorException(e); } @@ -115,7 +120,7 @@ public class TsFileRecoverPerformer { return restorableTsFileIOWriter; } catch (IOException e) { throw new StorageGroupProcessorException( - "recover the resource file failed: " + insertFilePath + "recover the resource file failed: " + filePath + RESOURCE_SUFFIX + e); } } else { @@ -130,7 +135,7 @@ public class TsFileRecoverPerformer { // clean logs try { MultiFileLogNodeManager.getInstance() - .deleteNode(logNodePrefix + SystemFileFactory.INSTANCE.getFile(insertFilePath).getName()); + .deleteNode(logNodePrefix + SystemFileFactory.INSTANCE.getFile(filePath).getName()); } catch (IOException e) { throw new StorageGroupProcessorException(e); } @@ -187,7 +192,7 @@ public class TsFileRecoverPerformer { private void redoLogs(RestorableTsFileIOWriter restorableTsFileIOWriter) throws StorageGroupProcessorException { IMemTable recoverMemTable = new PrimitiveMemTable(); - LogReplayer logReplayer = new LogReplayer(logNodePrefix, insertFilePath, resource.getModFile(), + LogReplayer logReplayer = new LogReplayer(logNodePrefix, filePath, resource.getModFile(), versionController, resource, recoverMemTable, acceptUnseq); logReplayer.replayLogs(); try { diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleException.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleTsFileException.java similarity index 87% rename from tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleException.java rename to tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleTsFileException.java index 0ff3a5d..649d9b2 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleException.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/exception/NotCompatibleTsFileException.java @@ -18,11 +18,11 @@ */ package org.apache.iotdb.tsfile.exception; -public class NotCompatibleException extends TsFileRuntimeException { +public class NotCompatibleTsFileException extends TsFileRuntimeException { private static final long serialVersionUID = -3765109817887078265L; - public NotCompatibleException(String message) { + public NotCompatibleTsFileException(String message) { super(message); } } diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java index b7122b8..d4ef435 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/TsFileSequenceReader.java @@ -22,7 +22,7 @@ import org.apache.iotdb.tsfile.common.conf.TSFileConfig; import org.apache.iotdb.tsfile.common.conf.TSFileDescriptor; import org.apache.iotdb.tsfile.compress.IUnCompressor; import org.apache.iotdb.tsfile.encoding.common.EndianType; -import org.apache.iotdb.tsfile.exception.NotCompatibleException; +import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException; import org.apache.iotdb.tsfile.file.MetaMarker; import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter; import org.apache.iotdb.tsfile.file.header.ChunkHeader; @@ -230,7 +230,7 @@ public class TsFileSequenceReader implements AutoCloseable { /** * this function reads version number and checks compatibility of TsFile. */ - public String readVersionNumber() throws IOException, NotCompatibleException { + public String readVersionNumber() throws IOException, NotCompatibleTsFileException { ByteBuffer versionNumberBytes = ByteBuffer .allocate(TSFileConfig.VERSION_NUMBER.getBytes().length); tsFileInput.read(versionNumberBytes, TSFileConfig.MAGIC_STRING.getBytes().length); diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java index 9f88c05..3af18fc 100644 --- a/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java +++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriter.java @@ -29,6 +29,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.iotdb.tsfile.common.conf.TSFileConfig; +import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException; import org.apache.iotdb.tsfile.file.metadata.ChunkGroupMetadata; import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.TsFileMetadata; @@ -93,9 +94,8 @@ public class RestorableTsFileIOWriter extends TsFileIOWriter { totalChunkNum = reader.getTotalChunkNum(); if (truncatedPosition == TsFileCheckStatus.INCOMPATIBLE_FILE) { out.close(); - boolean result = file.delete(); - logger.warn("TsFile {} is incompatible. Delete it successfully {}", file.getAbsolutePath(), result); - throw new IOException(String.format("%s is not in TsFile format.", file.getAbsolutePath())); + throw new NotCompatibleTsFileException( + String.format("%s is not in TsFile format.", file.getAbsolutePath())); } else if (truncatedPosition == TsFileCheckStatus.ONLY_MAGIC_HEAD) { crashed = true; out.truncate( diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIOWriterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIOWriterTest.java index 32a77b7..c79fd77 100644 --- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIOWriterTest.java +++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/TsFileIOWriterTest.java @@ -22,7 +22,7 @@ import java.io.File; import java.io.IOException; import org.apache.iotdb.tsfile.common.conf.TSFileConfig; import org.apache.iotdb.tsfile.constant.TestConstant; -import org.apache.iotdb.tsfile.exception.NotCompatibleException; +import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException; import org.apache.iotdb.tsfile.file.MetaMarker; import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter; import org.apache.iotdb.tsfile.file.header.ChunkHeader; @@ -81,7 +81,7 @@ public class TsFileIOWriterTest { } @Test - public void endFileTest() throws IOException, NotCompatibleException { + public void endFileTest() throws IOException, NotCompatibleTsFileException { TsFileSequenceReader reader = new TsFileSequenceReader(tsfile); // magic_string diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java index db873ba..51fee77 100644 --- a/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java +++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/write/writer/RestorableTsFileIOWriterTest.java @@ -27,10 +27,10 @@ import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.iotdb.tsfile.constant.TestConstant; +import org.apache.iotdb.tsfile.exception.NotCompatibleTsFileException; import org.apache.iotdb.tsfile.file.MetaMarker; import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata; import org.apache.iotdb.tsfile.file.metadata.enums.CompressionType; @@ -59,13 +59,17 @@ public class RestorableTsFileIOWriterTest { private static final String FILE_NAME = TestConstant.BASE_OUTPUT_PATH.concat("test.ts"); private static FSFactory fsFactory = FSFactoryProducer.getFSFactory(); - @Test(expected = IOException.class) + @Test(expected = NotCompatibleTsFileException.class) public void testBadHeadMagic() throws Exception { File file = fsFactory.getFile(FILE_NAME); FileWriter fWriter = new FileWriter(file); fWriter.write("Tsfile"); fWriter.close(); - new RestorableTsFileIOWriter(file); + try { + new RestorableTsFileIOWriter(file); + } finally { + assertTrue(file.delete()); + } } @Test
