You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2020/02/22 11:31:15 UTC

[incubator-iotdb] 01/02: enable mergeLog for checking why merging is hanged

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

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

commit 76b0b8c63b4136bd7620ca9f742ee226db597120
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Thu Feb 20 12:59:29 2020 +0800

    enable mergeLog for checking why merging is hanged
    
    add stop timeout for 8181
    
    disable 8181 port when test
---
 .travis.yml                                        |  2 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 11 +++
 .../apache/iotdb/db/engine/flush/FlushManager.java | 16 ++++-
 .../db/engine/storagegroup/TsFileProcessor.java    | 79 ++++++++++++++++------
 .../apache/iotdb/db/service/MetricsService.java    |  5 +-
 .../storagegroup/StorageGroupProcessorTest.java    |  1 +
 .../engine/storagegroup/TsFileProcessorTest.java   | 50 ++++++++------
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  3 +
 server/src/test/resources/logback.xml              |  4 +-
 9 files changed, 122 insertions(+), 49 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 6df9213..0b2cf4c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -140,7 +140,7 @@ matrix:
         - mvn -version
         # Output something every 10 minutes or Travis kills the job
         - while sleep 540; do echo "=====[ $SECONDS seconds still running ]====="; done &
-        - travis_wait 40 mvn -B clean integration-test
+        - travis_wait 20 mvn -B clean integration-test
         # Killing background sleep loop
         - kill %1
 
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 08eeb42..88a3e55 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -483,6 +483,9 @@ public class IoTDBConfig {
   //wait for 60 second by default.
   private int thriftServerAwaitTimeForStopService = 60;
 
+  private boolean enableMetricsWebService = true;
+
+
   public IoTDBConfig() {
     // empty constructor
   }
@@ -1353,4 +1356,12 @@ public class IoTDBConfig {
   public void setThriftServerAwaitTimeForStopService(int thriftServerAwaitTimeForStopService) {
     this.thriftServerAwaitTimeForStopService = thriftServerAwaitTimeForStopService;
   }
+
+  public boolean isEnableMetricsWebService() {
+    return enableMetricsWebService;
+  }
+
+  public void setEnableMetricsWebService(boolean enableMetricsWebService) {
+    this.enableMetricsWebService = enableMetricsWebService;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/flush/FlushManager.java b/server/src/main/java/org/apache/iotdb/db/engine/flush/FlushManager.java
index 8c224e0..147771e 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/flush/FlushManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/flush/FlushManager.java
@@ -88,6 +88,7 @@ public class FlushManager implements FlushManagerMBean, IService {
       TsFileProcessor tsFileProcessor = tsFileProcessorQueue.poll();
       tsFileProcessor.flushOneMemTable();
       tsFileProcessor.setManagedByFlushManager(false);
+      logger.error("Flush Thread re-register TSProcessor {} to the queue.", tsFileProcessor.getStorageGroupName());
       registerTsFileProcessor(tsFileProcessor);
     }
   }
@@ -99,11 +100,16 @@ public class FlushManager implements FlushManagerMBean, IService {
   public void registerTsFileProcessor(TsFileProcessor tsFileProcessor) {
     synchronized (tsFileProcessor) {
       if (!tsFileProcessor.isManagedByFlushManager() && tsFileProcessor.getFlushingMemTableSize() > 0) {
-        logger.info("storage group {} begin to submit a flush thread, flushing memtable size: {}",
-            tsFileProcessor.getStorageGroupName(), tsFileProcessor.getFlushingMemTableSize());
         tsFileProcessorQueue.add(tsFileProcessor);
+        logger.info("storage group {} begin to submit a flush thread, flushing memtable size: {}, queue size: {}",
+            tsFileProcessor.getStorageGroupName(), tsFileProcessor.getFlushingMemTableSize(), tsFileProcessorQueue.size());
         tsFileProcessor.setManagedByFlushManager(true);
         flushPool.submit(new FlushThread());
+      } else if (tsFileProcessor.isManagedByFlushManager()){
+        logger.info("tsFileProcessor {} is already in the flushPool, the first one: {}", tsFileProcessor.getStorageGroupName(),
+            tsFileProcessorQueue.size() >0 ? tsFileProcessorQueue.getFirst().getStorageGroupName() : "empty now");
+      } else {
+        logger.info("No flushing memetable to do, register TsProcessor {} failed.", tsFileProcessor.getStorageGroupName());
       }
     }
   }
@@ -122,4 +128,10 @@ public class FlushManager implements FlushManagerMBean, IService {
 
     private static FlushManager instance = new FlushManager();
   }
+
+  public String toString() {
+    return String.format("TSProcessors in the queue: %d, TaskPool size %d + %d,",
+        tsFileProcessorQueue.size(), flushPool.getWorkingTasksNumber(),
+        flushPool.getWaitingTasksNumber());
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
index d803cde..c818a3e 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessor.java
@@ -116,7 +116,9 @@ public class TsFileProcessor {
     this.updateLatestFlushTimeCallback = updateLatestFlushTimeCallback;
     this.sequence = sequence;
     logger.info("create a new tsfile processor {}", tsfile.getAbsolutePath());
-
+    if (this.writer == null) {
+      logger.error("the writer is null!! {}", tsfile.getName());
+    }
     // a file generated by flush has only one historical version, which is itself
     this.tsFileResource
         .setHistoricalVersions(Collections.singleton(versionController.currVersion()));
@@ -225,6 +227,7 @@ public class TsFileProcessor {
    */
   public void deleteDataInMemory(Deletion deletion) {
     flushQueryLock.writeLock().lock();
+    logger.error("get flushQueryLock write lock");
     try {
       if (workMemTable != null) {
         workMemTable
@@ -236,6 +239,7 @@ public class TsFileProcessor {
       }
     } finally {
       flushQueryLock.writeLock().unlock();
+      logger.error("release flushQueryLock write lock");
     }
   }
 
@@ -286,9 +290,13 @@ public class TsFileProcessor {
         while (!flushingMemTables.isEmpty()) {
           flushingMemTables.wait(60_000);
           if (System.currentTimeMillis() - startTime > 60_000) {
-            logger.warn("{} has spent {}s for waiting flushing one memtable; {} left.",
+            logger.warn("{} has spent {}s for waiting flushing one memtable; {} left (first: {}). FlushingManager info: {}",
                 this.tsFileResource.getFile().getAbsolutePath(),
-                (System.currentTimeMillis() - startTime)/1000,flushingMemTables.size());
+                (System.currentTimeMillis() - startTime)/1000,
+                flushingMemTables.size(),
+                flushingMemTables.getFirst(),
+                FlushManager.getInstance()
+                );
           }
 
         }
@@ -303,6 +311,7 @@ public class TsFileProcessor {
 
   void asyncClose() {
     flushQueryLock.writeLock().lock();
+    logger.error("get flushQueryLock write lock");
     try {
       logger.info("Async close the file: {}", tsFileResource.getFile().getAbsolutePath());
       if (shouldClose) {
@@ -318,16 +327,16 @@ public class TsFileProcessor {
       // is set true, we need to generate a NotifyFlushMemTable as a signal task and submit it to
       // the FlushManager.
       IMemTable tmpMemTable = workMemTable == null ? new NotifyFlushMemTable() : workMemTable;
-      if (logger.isDebugEnabled()) {
+      //if (logger.isDebugEnabled()) {
         if (tmpMemTable.isSignalMemTable()) {
-          logger.debug(
+          logger.error(
               "storage group {} add a signal memtable into flushing memtable list when async close",
               storageGroupName);
         } else {
           logger
               .debug("storage group {} async flush a memtable when async close", storageGroupName);
         }
-      }
+      //}
       try {
         addAMemtableIntoFlushingList(tmpMemTable);
       } catch (IOException e) {
@@ -335,39 +344,43 @@ public class TsFileProcessor {
       }
     } finally {
       flushQueryLock.writeLock().unlock();
+      logger.error("release flushQueryLock write lock");
     }
   }
 
   /**
    * TODO if the flushing thread is too fast, the tmpMemTable.wait() may never wakeup
+   * Tips: I am trying to solve this issue by checking whether the table exist before wait()
    */
   public void syncFlush() throws IOException {
     IMemTable tmpMemTable;
     flushQueryLock.writeLock().lock();
+    logger.error("get flushQueryLock write lock");
     try {
       tmpMemTable = workMemTable == null ? new NotifyFlushMemTable() : workMemTable;
       if (tmpMemTable.isSignalMemTable()) {
-        logger.debug("add a signal memtable into flushing memtable list when sync flush");
+        logger.error("add a signal memtable into flushing memtable list when sync flush");
       }
       addAMemtableIntoFlushingList(tmpMemTable);
     } finally {
       flushQueryLock.writeLock().unlock();
+      logger.error("release flushQueryLock write lock");
     }
 
     synchronized (tmpMemTable) {
       try {
         long startWait = System.currentTimeMillis();
-        while (true) {
+        while (flushingMemTables.contains(tmpMemTable)) {
           tmpMemTable.wait(1000);
 
-          flushQueryLock.readLock().lock();
-          try {
-            if (!flushingMemTables.contains(tmpMemTable)) {
-              break;
-            }
-          } finally {
-            flushQueryLock.readLock().unlock();
-          }
+          //flushQueryLock.readLock().lock();
+//          try {
+//            if (!flushingMemTables.contains(tmpMemTable)) {
+//              break;
+//            }
+//          } finally {
+//            //flushQueryLock.readLock().unlock();
+//          }
 
           if ((System.currentTimeMillis() - startWait) > 60_000) {
             logger.warn("has waited for synced flushing a memtable in {} for 60 seconds.",
@@ -387,6 +400,7 @@ public class TsFileProcessor {
    */
   public void asyncFlush() {
     flushQueryLock.writeLock().lock();
+    logger.error("get flushQueryLock write lock");
     try {
       if (workMemTable == null) {
         return;
@@ -398,6 +412,7 @@ public class TsFileProcessor {
       logger.error("WAL notify start flush failed", e);
     } finally {
       flushQueryLock.writeLock().unlock();
+      logger.error("release flushQueryLock write lock");
     }
   }
 
@@ -411,6 +426,7 @@ public class TsFileProcessor {
       logger.error("Memetable info: " + tobeFlushed.getMemTableMap());
     }
     flushingMemTables.addLast(tobeFlushed);
+    logger.error("Memtable (signal = {}) is added into the flushing Memtable", tobeFlushed.isSignalMemTable());
     long cur = versionController.nextVersion();
     tobeFlushed.setVersion(cur);
     if (IoTDBDescriptor.getInstance().getConfig().isEnableWal()) {
@@ -429,15 +445,30 @@ public class TsFileProcessor {
    */
   private void releaseFlushedMemTable(IMemTable memTable) {
     flushQueryLock.writeLock().lock();
+    logger.error("get flushQueryLock write lock");
     try {
+      if (writer == null) {
+        logger.error("the writer is null, why?? memtable (signal = {})", memTable.isSignalMemTable());
+      }
       writer.makeMetadataVisible();
-      flushingMemTables.remove(memTable);
+      if (!flushingMemTables.remove(memTable)) {
+        logger.warn(
+            "put the memtable (signal={}) out of flushingMemtables but it is not in the queue.",
+            memTable.isSignalMemTable());
+      } else {
+        logger.warn(
+            "memtable (signal={}) is removed from the queue. {} left.",
+            memTable.isSignalMemTable(), flushingMemTables.size());
+      }
       memTable.release();
       MemTablePool.getInstance().putBack(memTable, storageGroupName);
       logger.debug("storage group {} flush finished, remove a memtable from flushing list, "
           + "flushing memtable list size: {}", storageGroupName, flushingMemTables.size());
+    } catch (Exception e) {
+      logger.error(e.getMessage(), e);
     } finally {
       flushQueryLock.writeLock().unlock();
+      logger.error("release flushQueryLock write lock");
     }
   }
 
@@ -474,12 +505,13 @@ public class TsFileProcessor {
         getLogNode().notifyEndFlush();
       }
     }
-
-    releaseFlushedMemTable(memTableToFlush);
-
+    logger.error("try get lock to release a memtable (signal={})", memTableToFlush.isSignalMemTable());
     // for sync flush
     synchronized (memTableToFlush) {
+      logger.error("have got lock to release a memtable (signal={})", memTableToFlush.isSignalMemTable());
+      releaseFlushedMemTable(memTableToFlush);
       memTableToFlush.notifyAll();
+      logger.error("released a memtable (signal={}), flushingMemtables size ={}", memTableToFlush.isSignalMemTable(), flushingMemTables.size());
     }
 
     if (shouldClose && flushingMemTables.isEmpty()) {
@@ -500,6 +532,7 @@ public class TsFileProcessor {
         } catch (IOException e) {
           logger.error("update compression ratio failed", e);
         }
+        logger.error("flushing Memtable is empty and will close the file");
         endFile();
       } catch (IOException | TsFileProcessorException e) {
         logger.error("meet error when flush FileMetadata to {}, change system mode to read-only",
@@ -522,7 +555,6 @@ public class TsFileProcessor {
 
   private void endFile() throws IOException, TsFileProcessorException {
     long closeStartTime = System.currentTimeMillis();
-
     tsFileResource.serialize();
     writer.endFile(schema);
     tsFileResource.cleanCloseFlag();
@@ -542,6 +574,7 @@ public class TsFileProcessor {
           DatetimeUtils.convertMillsecondToZonedDateTime(closeEndTime),
           closeEndTime - closeStartTime);
     }
+    logger.error("Storage group {} close the file {}", storageGroupName, tsFileResource.getFile().getAbsoluteFile());
   }
 
 
@@ -603,6 +636,7 @@ public class TsFileProcessor {
       String measurementId, TSDataType dataType, TSEncoding encoding, Map<String, String> props,
       QueryContext context) {
     flushQueryLock.readLock().lock();
+    logger.error("get flushQueryLock read lock");
     try {
       List<ReadOnlyMemChunk> readOnlyMemChunks = new ArrayList<>();
       for (IMemTable flushingMemTable : flushingMemTables) {
@@ -635,10 +669,11 @@ public class TsFileProcessor {
       chunkMetaDataList.removeIf(context::chunkNotSatisfy);
 
       return new Pair<>(readOnlyMemChunks, chunkMetaDataList);
-    } catch (IOException | QueryProcessException e) {
+    } catch (Exception e) {
       logger.error("get ReadOnlyMemChunk has error", e);
     } finally {
       flushQueryLock.readLock().unlock();
+      logger.error("release flushQueryLock read lock");
     }
     return null;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
index 3456c75..6994886 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/MetricsService.java
@@ -80,6 +80,9 @@ public class MetricsService implements MetricsServiceMBean, IService {
 
   @Override
   public synchronized void startService() throws StartupException {
+    if (!IoTDBDescriptor.getInstance().getConfig().isEnableMetricsWebService()) {
+      return;
+    }
     logger.info("{}: start {}...", IoTDBConstant.GLOBAL_DB_NAME, this.getID().getName());
     executorService = Executors.newSingleThreadExecutor();
     int port = getMetricsPort();
@@ -88,7 +91,7 @@ public class MetricsService implements MetricsServiceMBean, IService {
     metricsWebUI.getHandlers().add(metricsSystem.getServletHandlers());
     metricsWebUI.initialize();
     server = metricsWebUI.getServer(port);
-    server.setStopTimeout(5000);
+    server.setStopTimeout(10000);
     metricsSystem.start();
     try {
       executorService.execute(new MetricsServiceThread(server));
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
index 2d179b3..fdf8c23 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/StorageGroupProcessorTest.java
@@ -78,6 +78,7 @@ public class StorageGroupProcessorTest {
     EnvironmentUtils.cleanEnv();
     EnvironmentUtils.cleanDir(TestConstant.OUTPUT_DATA_DIR);
     MergeManager.getINSTANCE().stop();
+    EnvironmentUtils.cleanEnv();
   }
 
 
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
index 6e732b8..62efc1d 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileProcessorTest.java
@@ -52,6 +52,8 @@ import org.apache.iotdb.tsfile.write.writer.RestorableTsFileIOWriter;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class TsFileProcessorTest {
 
@@ -65,7 +67,7 @@ public class TsFileProcessorTest {
   private TSEncoding encoding = TSEncoding.RLE;
   private Map<String, String> props = Collections.emptyMap();
   private QueryContext context;
-
+  private static Logger logger = LoggerFactory.getLogger(TsFileProcessorTest.class);
   @Before
   public void setUp() throws Exception {
     EnvironmentUtils.envSetUp();
@@ -82,9 +84,9 @@ public class TsFileProcessorTest {
 
   @Test
   public void testWriteAndFlush() throws IOException, QueryProcessException {
+    logger.error("testWriteAndFlush begin..");
     processor = new TsFileProcessor(storageGroup, SystemFileFactory.INSTANCE.getFile(filePath),
-        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, x -> {
-    },
+        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, this::closeTsFileProcessor,
         (tsFileProcessor) -> true, true);
 
     Pair<List<ReadOnlyMemChunk>, List<ChunkMetaData>> pair = processor
@@ -130,9 +132,9 @@ public class TsFileProcessorTest {
 
   @Test
   public void testWriteAndRestoreMetadata() throws IOException, QueryProcessException {
+    logger.error("testWriteAndRestoreMetadata begin..");
     processor = new TsFileProcessor(storageGroup, SystemFileFactory.INSTANCE.getFile(filePath),
-        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, x -> {
-    },
+        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, this::closeTsFileProcessor,
         (tsFileProcessor) -> true, true);
 
     Pair<List<ReadOnlyMemChunk>, List<ChunkMetaData>> pair = processor
@@ -163,7 +165,7 @@ public class TsFileProcessorTest {
         assertEquals(num, timeValuePair.getValue().getInt());
       }
     }
-
+    logger.error("syncFlush..");
     // flush synchronously
     processor.syncFlush();
 
@@ -193,15 +195,17 @@ public class TsFileProcessorTest {
       }
     }
     restorableTsFileIOWriter.close();
+    logger.error("syncClose..");
     processor.syncClose();
+    //we need to close the tsfile writer first and then reopen it.
   }
 
 
   @Test
   public void testMultiFlush() throws IOException, QueryProcessException {
+    logger.error("testWriteAndRestoreMetadata begin..");
     processor = new TsFileProcessor(storageGroup, SystemFileFactory.INSTANCE.getFile(filePath),
-        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, x -> {
-    },
+        SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE, this::closeTsFileProcessor,
         (tsFileProcessor) -> true, true);
 
     Pair<List<ReadOnlyMemChunk>, List<ChunkMetaData>> pair = processor
@@ -234,22 +238,10 @@ public class TsFileProcessorTest {
 
   @Test
   public void testWriteAndClose() throws IOException, QueryProcessException {
+    logger.error("testWriteAndRestoreMetadata begin..");
     processor = new TsFileProcessor(storageGroup, SystemFileFactory.INSTANCE.getFile(filePath),
         SchemaUtils.constructSchema(deviceId), SysTimeVersionController.INSTANCE,
-        unsealedTsFileProcessor -> {
-          TsFileResource resource = unsealedTsFileProcessor.getTsFileResource();
-          synchronized (resource) {
-            for (Entry<String, Long> startTime : resource.getStartTimeMap().entrySet()) {
-              String deviceId = startTime.getKey();
-              resource.getEndTimeMap().put(deviceId, resource.getStartTimeMap().get(deviceId));
-            }
-            try {
-              resource.close();
-            } catch (IOException e) {
-              throw new TsFileProcessorException(e);
-            }
-          }
-        }, (tsFileProcessor) -> true, true);
+        this::closeTsFileProcessor, (tsFileProcessor) -> true, true);
 
     Pair<List<ReadOnlyMemChunk>, List<ChunkMetaData>> pair = processor
         .query(deviceId, measurementId, dataType, encoding, props, context);
@@ -286,4 +278,18 @@ public class TsFileProcessorTest {
     assertTrue(processor.getTsFileResource().isClosed());
 
   }
+  private void closeTsFileProcessor(TsFileProcessor unsealedTsFileProcessor) throws TsFileProcessorException {
+    TsFileResource resource = unsealedTsFileProcessor.getTsFileResource();
+    synchronized (resource) {
+      for (Entry<String, Long> startTime : resource.getStartTimeMap().entrySet()) {
+        String deviceId = startTime.getKey();
+        resource.getEndTimeMap().put(deviceId, resource.getStartTimeMap().get(deviceId));
+      }
+      try {
+        resource.close();
+      } catch (IOException e) {
+        throw new TsFileProcessorException(e);
+      }
+    }
+  }
 }
\ No newline at end of file
diff --git a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
index 871506f..f436b3d 100644
--- a/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
+++ b/server/src/test/java/org/apache/iotdb/db/utils/EnvironmentUtils.java
@@ -78,6 +78,7 @@ public class EnvironmentUtils {
   private static IoTDB daemon;
 
   public static void cleanEnv() throws IOException, StorageEngineException {
+    logger.warn("EnvironmentUtil cleanEnv...");
     if (daemon != null) {
       daemon.stop();
       daemon = null;
@@ -191,6 +192,8 @@ public class EnvironmentUtils {
     logger.warn("EnvironmentUtil setup...");
     System.setProperty(IoTDBConstant.REMOTE_JMX_PORT_NAME, "31999");
     IoTDBDescriptor.getInstance().getConfig().setThriftServerAwaitTimeForStopService(0);
+    //we do not start 8181 port in test.
+    IoTDBDescriptor.getInstance().getConfig().setEnableMetricsWebService(false);
     if (daemon == null) {
       daemon = new IoTDB();
     }
diff --git a/server/src/test/resources/logback.xml b/server/src/test/resources/logback.xml
index 8e61f7d..5b16f61 100644
--- a/server/src/test/resources/logback.xml
+++ b/server/src/test/resources/logback.xml
@@ -41,8 +41,10 @@
     <!-- enable me if you want to monitor when files are opened and closed.
     <logger name="FileMonitor" level="info"/>
     -->
-    <logger name="FileMonitor" level="info"/>
+    <logger name="org.apache.iotdb.db.engine.merge" level="DEBUG"/>
+    <logger name="org.eclipse.jetty.util.thread.QueuedThreadPool" level="DEBUG"/>
     <logger name="org.apache.iotdb.db.service.MetricsService" level="INFO" />
+    <logger name="org.apache.iotdb.db.engine.flush.FlushManager" level="INFO" />
     <root level="WARN">
         <appender-ref ref="stdout"/>
     </root>