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 2021/12/03 11:41:15 UTC

[iotdb] branch master updated: [IOTDB-2074] Fix NullPointerException when recovering compaction in MacOS (#4519)

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 febdcb8  [IOTDB-2074] Fix NullPointerException when recovering compaction in MacOS (#4519)
febdcb8 is described below

commit febdcb8cde7231a0df7d1042f514860980652897
Author: 周沛辰 <45...@users.noreply.github.com>
AuthorDate: Fri Dec 3 19:38:25 2021 +0800

    [IOTDB-2074] Fix NullPointerException when recovering compaction in MacOS (#4519)
---
 .../engine/storagegroup/StorageGroupProcessor.java  |  5 +++++
 .../recover/SizeTieredCompactionRecoverTest.java    | 21 +++++++++++++++++++++
 2 files changed, 26 insertions(+)

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 43e3154..41edad5 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
@@ -113,6 +113,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.regex.Pattern;
 
 import static org.apache.iotdb.db.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
 import static org.apache.iotdb.db.engine.compaction.cross.inplace.task.CrossSpaceMergeTask.MERGE_SUFFIX;
@@ -555,6 +556,10 @@ public class StorageGroupProcessor {
         return;
       }
       for (File timePartitionDir : timePartitionDirs) {
+        if (!timePartitionDir.isDirectory()
+            || !Pattern.compile("[0-9]*").matcher(timePartitionDir.getName()).matches()) {
+          continue;
+        }
         File[] compactionLogs =
             InnerSpaceCompactionUtils.findInnerSpaceCompactionLogs(timePartitionDir.getPath());
         for (File compactionLog : compactionLogs) {
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverTest.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverTest.java
index b5a15f9..3b8d798 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/recover/SizeTieredCompactionRecoverTest.java
@@ -26,8 +26,11 @@ import org.apache.iotdb.db.engine.compaction.inner.sizetiered.SizeTieredCompacti
 import org.apache.iotdb.db.engine.compaction.inner.utils.InnerSpaceCompactionUtils;
 import org.apache.iotdb.db.engine.compaction.inner.utils.SizeTieredCompactionLogger;
 import org.apache.iotdb.db.engine.compaction.utils.CompactionFileGeneratorUtils;
+import org.apache.iotdb.db.engine.flush.TsFileFlushPolicy;
+import org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor;
 import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.exception.StorageGroupProcessorException;
 
 import org.apache.commons.io.FileUtils;
 import org.junit.After;
@@ -37,6 +40,7 @@ import org.junit.Test;
 
 import java.io.File;
 import java.io.FileOutputStream;
+import java.io.IOException;
 import java.lang.reflect.Field;
 import java.nio.channels.FileChannel;
 import java.util.ArrayList;
@@ -128,6 +132,23 @@ public class SizeTieredCompactionRecoverTest {
     dataDirsField.set(config, dataDirs);
   }
 
+  /** Test when a file that is not a directory exists under virtual storageGroup dir. */
+  @Test
+  public void testRecoverWithUncorrectTimePartionDir() {
+    try {
+      File timePartitionDir = new File(SEQ_FILE_DIR);
+      File f = new File(timePartitionDir.getParent() + File.separator + "test.tmp");
+      f.createNewFile();
+      new StorageGroupProcessor(
+          TestConstant.BASE_OUTPUT_PATH + File.separator + "data" + File.separator + "sequence",
+          "0",
+          new TsFileFlushPolicy.DirectFlushPolicy(),
+          COMPACTION_TEST_SG);
+    } catch (StorageGroupProcessorException | IOException e) {
+      Assert.fail(e.getMessage());
+    }
+  }
+
   /**
    * Test a compaction task in finished. The compaction log use file info to record files.
    *