You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/07/09 13:05:34 UTC

[incubator-iotdb] 03/05: add dynamic para ut test

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

lta pushed a commit to branch dynamic_parameters
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git

commit cd693b4dd9dd870f3b391d1de3f67e640f98de2a
Author: lta <li...@163.com>
AuthorDate: Tue Jul 9 20:57:10 2019 +0800

    add dynamic para ut test
---
 .../iotdb/db/conf/adapter/CompressionRatio.java    |  62 +++++++----
 .../db/conf/adapter/IoTDBConfigDynamicAdapter.java |  28 +++--
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   1 +
 .../engine/storagegroup/StorageGroupProcessor.java |   7 +-
 .../db/engine/storagegroup/TsFileProcessor.java    |  21 ++--
 .../org/apache/iotdb/db/metadata/MManager.java     |  10 +-
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   9 ++
 .../db/conf/adapter/CompressionRatioTest.java      | 116 +++++++++++++++++++++
 .../adapter/IoTDBConfigDynamicAdapterTest.java     |   6 --
 .../storagegroup/StorageGroupProcessorTest.java    |   2 +-
 .../org/apache/iotdb/db/metadata/MGraphTest.java   |   1 +
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |   2 +
 .../iotdb/db/metadata/MManagerBasicTest.java       |   1 +
 .../iotdb/db/metadata/MManagerImproveTest.java     |   1 +
 .../org/apache/iotdb/db/metadata/MetadataTest.java |   1 +
 .../org/apache/iotdb/db/qp/QueryProcessorTest.java |   4 +
 .../dataset/EngineDataSetWithValueFilterTest.java  |   5 +
 .../iotdb/db/query/reader/ReaderTestHelper.java    |   5 +
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  17 +++
 19 files changed, 249 insertions(+), 50 deletions(-)

diff --git a/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/CompressionRatio.java b/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/CompressionRatio.java
index ff57f21..abbb929 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/CompressionRatio.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/CompressionRatio.java
@@ -34,11 +34,13 @@ public class CompressionRatio {
 
   private static final IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig();
 
-  private static final String COMPRESSION_RATIO_NAME = "compression_ratio";
+  public static final String COMPRESSION_RATIO_NAME = "compression_ratio";
 
-  private static final String FILE_PREFIX = "Ratio-";
+  public static final String FILE_PREFIX = "Ratio-";
 
-  private static final String SEPARATOR = "-";
+  public static final String SEPARATOR = "-";
+
+  public static final String RATIO_FILE_PATH_FORMAT = FILE_PREFIX + "%f" + SEPARATOR + "%d";
 
   private static final double DEFAULT_COMPRESSION_RATIO = 2.0f;
 
@@ -46,10 +48,11 @@ public class CompressionRatio {
 
   private long calcuTimes;
 
-  private String directoryPath;
+  private File directory;
 
   private CompressionRatio() {
-    directoryPath = FilePathUtils.regularizePath(CONFIG.getSystemDir()) + COMPRESSION_RATIO_NAME;
+    directory = new File(
+        FilePathUtils.regularizePath(CONFIG.getSystemDir()) + COMPRESSION_RATIO_NAME);
     try {
       restore();
     } catch (IOException e) {
@@ -57,16 +60,15 @@ public class CompressionRatio {
     }
   }
 
-  public synchronized void updateRatio(int flushNum) throws IOException {
-    File oldFile = new File(directoryPath,
-        FILE_PREFIX + compressionRatioSum + SEPARATOR + calcuTimes);
-    compressionRatioSum +=
-        (TSFileConfig.groupSizeInByte * flushNum) / CONFIG.getTsFileSizeThreshold();
+  public synchronized void updateRatio(double currentCompressionRatio) throws IOException {
+    File oldFile = new File(directory,
+        String.format(RATIO_FILE_PATH_FORMAT, compressionRatioSum, calcuTimes));
+    compressionRatioSum += currentCompressionRatio;
     calcuTimes++;
-    File newFile = new File(directoryPath,
-        FILE_PREFIX + compressionRatioSum + SEPARATOR + calcuTimes);
+    File newFile = new File(directory,
+        String.format(RATIO_FILE_PATH_FORMAT, compressionRatioSum, calcuTimes));
     persist(oldFile, newFile);
-    IoTDBConfigDynamicAdapter.getInstance().tryToAdaptParameters();
+//    IoTDBConfigDynamicAdapter.getInstance().tryToAdaptParameters(); // This will cause dead lock
   }
 
   public synchronized double getRatio() {
@@ -74,8 +76,9 @@ public class CompressionRatio {
   }
 
   private void persist(File oldFile, File newFile) throws IOException {
+    checkDirectoryExist();
     if (!oldFile.exists()) {
-      FileUtils.forceMkdir(newFile);
+      newFile.createNewFile();
       LOGGER.debug("Old ratio file {} doesn't exist, force create ratio file {}",
           oldFile.getAbsolutePath(), newFile.getAbsolutePath());
     } else {
@@ -85,8 +88,14 @@ public class CompressionRatio {
     }
   }
 
-  private void restore() throws IOException {
-    File directory = new File(directoryPath);
+  private void checkDirectoryExist() throws IOException {
+    if (!directory.exists()) {
+      FileUtils.forceMkdir(directory);
+    }
+  }
+
+  void restore() throws IOException {
+    checkDirectoryExist();
     File[] ratioFiles = directory.listFiles((dir, name) -> name.startsWith(FILE_PREFIX));
     File restoreFile;
     if (ratioFiles != null && ratioFiles.length > 0) {
@@ -106,11 +115,28 @@ public class CompressionRatio {
         }
       }
     } else {
-      restoreFile = new File(directory, FILE_PREFIX + compressionRatioSum + SEPARATOR + calcuTimes);
-      FileUtils.forceMkdir(restoreFile);
+      restoreFile = new File(directory,
+          String.format(RATIO_FILE_PATH_FORMAT, compressionRatioSum, calcuTimes));
+      restoreFile.createNewFile();
     }
   }
 
+  /**
+   * Only for test
+   */
+  void reset() {
+    calcuTimes = 0;
+    compressionRatioSum = 0;
+  }
+
+  public double getCompressionRatioSum() {
+    return compressionRatioSum;
+  }
+
+  public long getCalcuTimes() {
+    return calcuTimes;
+  }
+
   public static CompressionRatio getInstance() {
     return CompressionRatioHolder.INSTANCE;
   }
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java b/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
index dca6b33..3b4a722 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapter.java
@@ -100,10 +100,12 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
       CONFIG.setMaxMemtableNumber(maxMemTableNum);
       CONFIG.setTsFileSizeThreshold(tsFileSize);
       TSFileConfig.groupSizeInByte = memtableSizeInByte;
-      if (shouldClose) {
-        StorageEngine.getInstance().asyncFlushAndSealAllFiles();
-      } else if (memtableSizeInByte < currentMemTableSize) {
-        StorageEngine.getInstance().asyncFlushAllProcessor();
+      if(initialized) {
+        if (shouldClose) {
+          StorageEngine.getInstance().asyncFlushAndSealAllFiles();
+        } else if (memtableSizeInByte < currentMemTableSize) {
+          StorageEngine.getInstance().asyncFlushAllProcessor();
+        }
       }
       currentMemTableSize = memtableSizeInByte;
     }
@@ -121,13 +123,16 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
    */
   private int calcuMemTableSize() {
     double ratio = CompressionRatio.getInstance().getRatio();
-    long a = (long) (ratio * maxMemTableNum);
-    long b = (long) ((staticMemory - MAX_MEMORY_B) * ratio);
-    long c = CONFIG.getTsFileSizeThreshold() * maxMemTableNum * CHUNK_METADATA_SIZE_B * MManager
-        .getInstance().getMaximalSeriesNumberAmongStorageGroups();
-    long tempValue = b * b - 4 * a * c;
-    double memTableSize = ((-b + Math.sqrt(tempValue)) / (2 * a));
-    return tempValue < 0 ? -1 : (int) memTableSize;
+    // when unit is byte, it's likely to cause Long type overflow. so use the unit KB.
+    double a = (long) (ratio * maxMemTableNum);
+    double b = (long) ((MAX_MEMORY_B - staticMemory) * ratio);
+    int times = b > Integer.MAX_VALUE ? 1024 : 1;
+    b /= times;
+    double c = (double) CONFIG.getTsFileSizeThreshold() * maxMemTableNum * CHUNK_METADATA_SIZE_B * MManager
+        .getInstance().getMaximalSeriesNumberAmongStorageGroups() / times / times;
+    double tempValue = b * b - 4 * a * c;
+    double memTableSize = ((b + Math.sqrt(tempValue)) / (2 * a));
+    return tempValue < 0 ? -1 : (int) (memTableSize * times);
   }
 
   /**
@@ -194,6 +199,7 @@ public class IoTDBConfigDynamicAdapter implements IDynamicAdapter {
     totalTimeseries = 0;
     staticMemory = 0;
     maxMemTableNum = MEM_TABLE_AVERAGE_QUEUE_LEN;
+    initialized = false;
   }
 
   private IoTDBConfigDynamicAdapter() {
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
index 7c94a4e..206e347 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/StorageEngine.java
@@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
 import org.apache.iotdb.db.engine.querycontext.QueryDataSource;
 import org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
index 30e8579..4b08029 100755
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessor.java
@@ -456,16 +456,19 @@ public class StorageGroupProcessor {
   }
 
   public void asyncFlush() {
+    if (workSequenceTsFileProcessor == null && workUnSequenceTsFileProcessor == null) {
+      return;
+    }
     writeLock();
     try {
-      if (workSequenceTsFileProcessor.shouldFlush()) {
+      if (workSequenceTsFileProcessor != null && workSequenceTsFileProcessor.shouldFlush()) {
         logger.info("The memtable size {} reaches the threshold, async flush it to tsfile: {}",
             workSequenceTsFileProcessor.getWorkMemTableMemory(),
             workSequenceTsFileProcessor.getTsFileResource().getFile().getAbsolutePath());
 
         workSequenceTsFileProcessor.asyncFlush();
       }
-      if (workUnSequenceTsFileProcessor.shouldFlush()) {
+      if (workUnSequenceTsFileProcessor != null && workUnSequenceTsFileProcessor.shouldFlush()) {
         logger.info("The memtable size {} reaches the threshold, async flush it to tsfile: {}",
             workUnSequenceTsFileProcessor.getWorkMemTableMemory(),
             workUnSequenceTsFileProcessor.getTsFileResource().getFile().getAbsolutePath());
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index 5a64231..db6e66f 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -108,7 +108,7 @@ public class TsFileProcessor {
 
   private boolean sequence;
 
-  private int totalFlushTimes;
+  private long totalMemTableSize;
 
   TsFileProcessor(String storageGroupName, File tsfile, FileSchema fileSchema,
       VersionController versionController,
@@ -194,7 +194,7 @@ public class TsFileProcessor {
 
 
   boolean shouldFlush() {
-    return workMemTable.memSize() > TSFileConfig.groupSizeInByte;
+    return workMemTable != null && workMemTable.memSize() > TSFileConfig.groupSizeInByte;
   }
 
 
@@ -255,9 +255,6 @@ public class TsFileProcessor {
       } catch (IOException e) {
         logger.error("async close failed, because", e);
       }
-      CompressionRatio.getInstance().updateRatio(totalFlushTimes);
-    } catch (IOException e) {
-      logger.error("update compression ratio failed", e);
     } finally {
       flushQueryLock.writeLock().unlock();
     }
@@ -338,8 +335,8 @@ public class TsFileProcessor {
     if (IoTDBDescriptor.getInstance().getConfig().isEnableWal()) {
       getLogNode().notifyStartFlush();
     }
-    if(!tobeFlushed.isSignalMemTable()){
-      totalFlushTimes++;
+    if (!tobeFlushed.isSignalMemTable()) {
+      totalMemTableSize += tobeFlushed.memSize();
     }
     workMemTable = null;
     FlushManager.getInstance().registerTsFileProcessor(this);
@@ -406,6 +403,16 @@ public class TsFileProcessor {
     if (shouldClose && flushingMemTables.isEmpty()) {
       try {
         writer.mark();
+        try {
+          double compressionRatio = totalMemTableSize / writer.getPos();
+          if (totalMemTableSize < writer.getPos()) {
+            logger.error("Compression ratio {} has been less than 1.0.", compressionRatio);
+          } else {
+            CompressionRatio.getInstance().updateRatio(compressionRatio);
+          }
+        } catch (IOException e) {
+          logger.error("update compression ratio failed", e);
+        }
         endFile();
       } catch (IOException | TsFileProcessorException e) {
         StorageEngine.getInstance().setReadOnly(true);
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
index 5e44280..dc1f755 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/metadata/MManager.java
@@ -117,10 +117,6 @@ public class MManager {
         }
       }
     };
-
-    init();
-    IoTDBConfigDynamicAdapter.getInstance().setInitialized(true);
-    initialized = true;
   }
 
   public static MManager getInstance() {
@@ -129,8 +125,11 @@ public class MManager {
 
   //Because the writer will be used later and should not be closed here.
   @SuppressWarnings("squid:S2093")
-  private void init() {
+  public void init() {
 
+    if(initialized){
+      return;
+    }
     lock.writeLock().lock();
     File logFile = new File(logFilePath);
 
@@ -150,6 +149,7 @@ public class MManager {
     } finally {
       lock.writeLock().unlock();
     }
+    initialized = true;
   }
 
 
diff --git a/iotdb/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/iotdb/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index ba80791..9abbb99 100644
--- a/iotdb/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/iotdb/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@ -21,9 +21,11 @@ package org.apache.iotdb.db.service;
 import org.apache.iotdb.db.concurrent.IoTDBDefaultThreadExceptionHandler;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
 import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.builder.ExceptionBuilder;
+import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.monitor.StatMonitor;
 import org.apache.iotdb.db.sync.receiver.SyncServerManager;
 import org.apache.iotdb.db.rescon.TVListAllocator;
@@ -85,6 +87,7 @@ public class IoTDB implements IoTDBMBean {
       StatMonitor.getInstance().recovery();
     }
 
+    initMManager();
     registerManager.register(StorageEngine.getInstance());
     registerManager.register(MultiFileLogNodeManager.getInstance());
     registerManager.register(JMXService.getInstance());
@@ -108,6 +111,12 @@ public class IoTDB implements IoTDBMBean {
     logger.info("IoTDB is deactivated.");
   }
 
+  private void initMManager(){
+    MManager.getInstance().init();
+    IoTDBConfigDynamicAdapter.getInstance().setInitialized(true);
+
+  }
+
   @Override
   public void stop() {
     deactivate();
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/CompressionRatioTest.java b/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/CompressionRatioTest.java
new file mode 100644
index 0000000..02e81c4
--- /dev/null
+++ b/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/CompressionRatioTest.java
@@ -0,0 +1,116 @@
+/**
+ * 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.conf.adapter;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.commons.io.FileUtils;
+import org.apache.iotdb.db.conf.IoTDBConfig;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.ConfigAdjusterException;
+import org.apache.iotdb.db.service.IoTDB;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.db.utils.FilePathUtils;
+import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class CompressionRatioTest {
+
+  private static IoTDB daemon;
+
+  private static final IoTDBConfig CONFIG = IoTDBDescriptor.getInstance().getConfig();
+
+  private CompressionRatio compressionRatio = CompressionRatio.getInstance();
+
+  private static final String directory = FilePathUtils.regularizePath(CONFIG.getSystemDir())
+      + CompressionRatio.COMPRESSION_RATIO_NAME;
+
+  @Before
+  public void setUp() throws Exception {
+    EnvironmentUtils.closeStatMonitor();
+    daemon = IoTDB.getInstance();
+    daemon.active();
+    EnvironmentUtils.envSetUp();
+    FileUtils.forceMkdir(new File(directory));
+    compressionRatio.reset();
+    compressionRatio.restore();
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    daemon.stop();
+    EnvironmentUtils.cleanEnv();
+  }
+
+  @Test
+  public void testCompressionRatio() throws IOException {
+    double compressionRatioSum = 0;
+    int calcuTimes = 0;
+    if (!new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+      fail();
+    }
+    double compressionRatio = 10;
+    for(int i = 0; i < 500 ; i+= compressionRatio){
+      this.compressionRatio.updateRatio(compressionRatio);
+      if (new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+        fail();
+      }
+      calcuTimes++;
+      compressionRatioSum += compressionRatio;
+      if (!new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+        fail();
+      }
+      assertEquals(0, Double
+          .compare(compressionRatioSum / calcuTimes, this.compressionRatio.getRatio()));
+    }
+  }
+
+  @Test
+  public void testRestore() throws IOException {
+    double compressionRatioSum = 0;
+    int calcuTimes = 0;
+    if (!new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+      fail();
+    }
+    int compressionRatio = 10;
+    for(int i = 0; i < 100 ; i+= compressionRatio){
+      this.compressionRatio.updateRatio(compressionRatio);
+      if (new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+        fail();
+      }
+      calcuTimes++;
+      compressionRatioSum += compressionRatio;
+      if (!new File(directory, String.format(CompressionRatio.RATIO_FILE_PATH_FORMAT, compressionRatioSum , calcuTimes)).exists()) {
+        fail();
+      }
+      assertEquals(0, Double
+          .compare(compressionRatioSum / calcuTimes, this.compressionRatio.getRatio()));
+    }
+    this.compressionRatio.restore();
+    assertEquals(10, this.compressionRatio.getCalcuTimes());
+    assertEquals(0, Double
+        .compare(compressionRatioSum / calcuTimes, this.compressionRatio.getRatio()));
+  }
+}
\ No newline at end of file
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapterTest.java b/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapterTest.java
index 0373e71..cba8d54 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapterTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/conf/adapter/IoTDBConfigDynamicAdapterTest.java
@@ -19,20 +19,14 @@
 package org.apache.iotdb.db.conf.adapter;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.ConfigAdjusterException;
 import org.apache.iotdb.db.metadata.MManager;
-import org.apache.iotdb.db.rescon.PrimitiveArrayPool;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
-import org.apache.iotdb.jdbc.Config;
 import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.junit.After;
 import org.junit.Before;
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java b/iotdb/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
index 76e0263..0b3e222 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
@@ -50,8 +50,8 @@ public class StorageGroupProcessorTest {
 
   @After
   public void tearDown() throws Exception {
-    processor.syncDeleteDataFiles();
     EnvironmentUtils.cleanEnv();
+    processor.syncDeleteDataFiles();
     EnvironmentUtils.cleanDir("data");
   }
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
index 2d7dd3e..3e18835 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MGraphTest.java
@@ -30,6 +30,7 @@ public class MGraphTest {
 
   @Before
   public void setUp() throws Exception {
+    EnvironmentUtils.envSetUp();
   }
 
   @After
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
index 4fe76ae..94bfd40 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerAdvancedTest.java
@@ -41,6 +41,7 @@ public class MManagerAdvancedTest {
   @Before
   public void setUp() throws Exception {
 
+    EnvironmentUtils.envSetUp();
     mmanager = MManager.getInstance();
 
     mmanager.setStorageLevelToMTree("root.vehicle.d0");
@@ -60,6 +61,7 @@ public class MManagerAdvancedTest {
     mmanager.addPathToMTree("root.vehicle.d1.s3", "DOUBLE", "RLE");
     mmanager.addPathToMTree("root.vehicle.d1.s4", "BOOLEAN", "PLAIN");
     mmanager.addPathToMTree("root.vehicle.d1.s5", "TEXT", "PLAIN");
+
   }
 
   @After
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
index 05f3e5c..864381c 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerBasicTest.java
@@ -46,6 +46,7 @@ public class MManagerBasicTest {
   @Before
   public void setUp() throws Exception {
     compressionType = CompressionType.valueOf(TSFileConfig.compressor);
+    EnvironmentUtils.envSetUp();
   }
 
   @After
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
index 3c1c610..54d943f 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MManagerImproveTest.java
@@ -41,6 +41,7 @@ public class MManagerImproveTest {
 
   @Before
   public void setUp() throws Exception {
+    EnvironmentUtils.envSetUp();
     mManager = MManager.getInstance();
     mManager.setStorageLevelToMTree("root.t1.v2");
 
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
index 9ad6701..4a79db2 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/metadata/MetadataTest.java
@@ -32,6 +32,7 @@ public class MetadataTest {
 
   @Before
   public void setUp() throws Exception {
+    EnvironmentUtils.envSetUp();
   }
 
   @After
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java b/iotdb/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
index a2f8a19..5ae454a 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/qp/QueryProcessorTest.java
@@ -40,6 +40,10 @@ public class QueryProcessorTest {
   private MManager mManager = MManager.getInstance();
   private QueryProcessor processor = new QueryProcessor(new QueryProcessExecutor());
 
+  static {
+    MManager.getInstance().init();
+  }
+
   @Before
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithValueFilterTest.java b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithValueFilterTest.java
index 4ab3b24..4f47435 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithValueFilterTest.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/query/dataset/EngineDataSetWithValueFilterTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.QueryProcessor;
 import org.apache.iotdb.db.qp.executor.AbstractQueryProcessExecutor;
 import org.apache.iotdb.db.qp.executor.QueryProcessExecutor;
@@ -78,6 +79,10 @@ public class EngineDataSetWithValueFilterTest {
       "insert into root.test.d0(timestamp,s0,s1) values(700,1307,'1038')",
       "insert into root.test.d0(timestamp,s1) values(3000,'1309')"};
 
+  static {
+    MManager.getInstance().init();
+  }
+
   @Before
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/query/reader/ReaderTestHelper.java b/iotdb/src/test/java/org/apache/iotdb/db/query/reader/ReaderTestHelper.java
index e5f286a..7f76a49 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/query/reader/ReaderTestHelper.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/query/reader/ReaderTestHelper.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.query.reader;
 import java.io.IOException;
 import org.apache.iotdb.db.engine.MetadataManagerHelper;
 import org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor;
+import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -37,6 +38,10 @@ public abstract class ReaderTestHelper {
   protected StorageGroupProcessor storageGroupProcessor;
   private String systemDir = "data/info";
 
+  static {
+    MManager.getInstance().init();
+  }
+
   @Before
   public void setUp() throws Exception {
     MetadataManagerHelper.initMetadata();
diff --git a/iotdb/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java b/iotdb/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index fe89953..88151b6 100644
--- a/iotdb/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/iotdb/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -26,6 +26,8 @@ import org.apache.iotdb.db.auth.authorizer.IAuthorizer;
 import org.apache.iotdb.db.auth.authorizer.LocalFileAuthorizer;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.conf.adapter.CompressionRatio;
+import org.apache.iotdb.db.conf.adapter.IoTDBConfigDynamicAdapter;
 import org.apache.iotdb.db.conf.directories.DirectoryManager;
 import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.engine.cache.DeviceMetaDataCache;
@@ -38,6 +40,7 @@ import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.writelog.manager.MultiFileLogNodeManager;
+import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
 import org.junit.Assert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,6 +63,12 @@ public class EnvironmentUtils {
   public static long TEST_QUERY_JOB_ID = QueryResourceManager.getInstance().assignJobId();
   public static QueryContext TEST_QUERY_CONTEXT = new QueryContext(TEST_QUERY_JOB_ID);
 
+  private static long oldTsFileThreshold = config.getTsFileSizeThreshold();
+
+  private static int oldMaxMemTableNumber = config.getMaxMemtableNumber();
+
+  private static int oldGroupSizeInByte = TSFileConfig.groupSizeInByte;
+
   public static void cleanEnv() throws IOException, StorageEngineException {
 
     QueryResourceManager.getInstance().endQueryForGivenJob(TEST_QUERY_JOB_ID);
@@ -84,6 +93,11 @@ public class EnvironmentUtils {
     MManager.getInstance().clear();
     // delete all directory
     cleanAllDir();
+
+    config.setMaxMemtableNumber(oldMaxMemTableNumber);
+    config.setTsFileSizeThreshold(oldTsFileThreshold);
+    TSFileConfig.groupSizeInByte = oldGroupSizeInByte;
+    IoTDBConfigDynamicAdapter.getInstance().reset();
   }
 
   private static void cleanAllDir() throws IOException {
@@ -125,6 +139,9 @@ public class EnvironmentUtils {
    * this function should be called before all code in the setup
    */
   public static void envSetUp() throws StartupException, IOException {
+    MManager.getInstance().init();
+    IoTDBConfigDynamicAdapter.getInstance().setInitialized(true);
+
     createAllDir();
     // disable the system monitor
     config.setEnableStatMonitor(false);