You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by qi...@apache.org on 2020/04/08 10:00:28 UTC

[incubator-iotdb] branch master updated: not delete incompatible file in file level api (#1007)

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/incubator-iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 48b0360  not delete incompatible file in file level api (#1007)
48b0360 is described below

commit 48b03607f64eb54327e79aae03c81523e31577af
Author: Jialin Qiao <qj...@mails.tsinghua.edu.cn>
AuthorDate: Wed Apr 8 18:00:16 2020 +0800

    not delete incompatible file in file level api (#1007)
    
    * not delete incompatible file in file level api
---
 .../writelog/recover/TsFileRecoverPerformer.java   | 23 +++++++++++++---------
 ...tion.java => NotCompatibleTsFileException.java} |  4 ++--
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |  3 +--
 .../write/writer/RestorableTsFileIOWriter.java     |  6 +++---
 .../iotdb/tsfile/write/TsFileIOWriterTest.java     |  3 +--
 .../write/writer/RestorableTsFileIOWriterTest.java | 10 +++++++---
 6 files changed, 28 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..999ac28 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,6 @@ 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.file.MetaMarker;
 import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
@@ -230,7 +229,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 {
     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..6e13ba5 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,6 @@ 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.file.MetaMarker;
 import org.apache.iotdb.tsfile.file.footer.ChunkGroupFooter;
 import org.apache.iotdb.tsfile.file.header.ChunkHeader;
@@ -81,7 +80,7 @@ public class TsFileIOWriterTest {
   }
 
   @Test
-  public void endFileTest() throws IOException, NotCompatibleException {
+  public void endFileTest() throws IOException {
     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