You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2019/10/28 07:28:20 UTC

[incubator-iotdb] branch dev_new_merge_strategy updated: add tests for squeeze

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

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


The following commit(s) were added to refs/heads/dev_new_merge_strategy by this push:
     new 3b0681b  add tests for squeeze
3b0681b is described below

commit 3b0681b71e0911dae1008512a21fe60db6c2cc0f
Author: jt <jt...@163.com>
AuthorDate: Mon Oct 28 15:27:39 2019 +0800

    add tests for squeeze
---
 .../iotdb/db/engine/merge/BaseFileSelector.java    |  18 ++--
 .../engine/merge/MaxSeriesMergeFileSelector.java   |  13 ++-
 .../inplace/selector/InplaceMaxFileSelector.java   |   2 +-
 .../squeeze/selector/SqueezeMaxFileSelector.java   |  70 ++++++++++++++-
 .../engine/storagegroup/StorageGroupProcessor.java |   2 +-
 .../iotdb/db/engine/merge/MergeOverLapTest.java    |  44 ++++++---
 .../apache/iotdb/db/engine/merge/MergeTest.java    |   3 +-
 .../inplace/MaxSeriesMergeFileSelectorTest.java    |   1 +
 .../db/engine/merge/inplace/MergeLogTest.java      |   2 +-
 .../MaxFileMergeFileSelectorTest.java}             |  45 +++-------
 .../MaxSeriesMergeFileSelectorTest.java            |  24 ++---
 .../merge/{inplace => squeeze}/MergeLogTest.java   |  15 ++--
 .../db/engine/merge/squeeze/MergeTaskTest.java     | 100 ++++++++++-----------
 .../iotdb/db/integration/IoTDBMergeTest.java       |  18 +++-
 14 files changed, 219 insertions(+), 138 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
index 97e4551..7f38dd6 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/BaseFileSelector.java
@@ -90,7 +90,7 @@ public abstract class BaseFileSelector implements IMergeFileSelector{
     }
   }
 
-  public void select(boolean useTightBound) throws IOException {
+  protected void selectByUnseq(boolean useTightBound) throws IOException {
     seqSelectedNum = 0;
     selectedSeqFiles = new ArrayList<>();
     selectedUnseqFiles = new ArrayList<>();
@@ -127,7 +127,7 @@ public abstract class BaseFileSelector implements IMergeFileSelector{
 
   protected abstract void updateCost(long newCost, TsFileResource unseqFile);
 
-  private long calculateMetadataSize(TsFileResource seqFile) throws IOException {
+  protected long calculateMetadataSize(TsFileResource seqFile) throws IOException {
     Long cost = fileMetaSizeMap.get(seqFile);
     if (cost == null) {
       cost = MergeUtils.getFileMetaSize(seqFile, resource.getFileReader(seqFile));
@@ -154,7 +154,7 @@ public abstract class BaseFileSelector implements IMergeFileSelector{
 
   // this method traverses all ChunkMetadata to find out which series has the most chunks and uses
   // its proportion to all series to get a maximum estimation
-  private long calculateTightSeqMemoryCost(TsFileResource seqFile) throws IOException {
+  protected long calculateTightSeqMemoryCost(TsFileResource seqFile) throws IOException {
     long singleSeriesCost = calculateTightFileMemoryCost(seqFile, this::calculateMetadataSize);
     long multiSeriesCost = concurrentMergeNum * singleSeriesCost;
     long maxCost = calculateMetadataSize(seqFile);
@@ -174,18 +174,18 @@ public abstract class BaseFileSelector implements IMergeFileSelector{
       IFileQueryMemMeasurement unseqMeasurement,
       IFileQueryMemMeasurement seqMeasurement, long startTime, long timeLimit) throws IOException {
     long cost = 0;
-    Long fileCost = unseqMeasurement.measure(tmpSelectedUnseqFile);
-    cost += fileCost;
+    Long fileReadCost = unseqMeasurement.measure(tmpSelectedUnseqFile);
+    cost += fileReadCost;
 
     for (Integer seqFileIdx : tmpSelectedSeqIterable) {
       TsFileResource seqFile = resource.getSeqFiles().get(seqFileIdx);
-      fileCost = seqMeasurement.measure(seqFile);
-      if (fileCost > tempMaxSeqFileCost) {
+      fileReadCost = seqMeasurement.measure(seqFile);
+      if (fileReadCost > tempMaxSeqFileCost) {
         // memory used when read data from a seq file:
         // only one file will be read at the same time, so only the largest one is recorded here
         cost -= tempMaxSeqFileCost;
-        cost += fileCost;
-        tempMaxSeqFileCost = fileCost;
+        cost += fileReadCost;
+        tempMaxSeqFileCost = fileReadCost;
       }
       // memory used to cache the metadata before the new file is closed
       // but writing data into a new file may generate the same amount of metadata in memory
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/MaxSeriesMergeFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/MaxSeriesMergeFileSelector.java
index 7278d09..f90b3ab 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/MaxSeriesMergeFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/MaxSeriesMergeFileSelector.java
@@ -37,7 +37,7 @@ public class MaxSeriesMergeFileSelector<T extends IMergeFileSelector> implements
   private T baseSelector;
   private MergeResource resource;
 
-  public static final int MAX_SERIES_NUM = 10240;
+  public static final int MAX_SERIES_NUM = 256;
   private static final Logger logger = LoggerFactory.getLogger(
       MaxSeriesMergeFileSelector.class);
 
@@ -133,12 +133,19 @@ public class MaxSeriesMergeFileSelector<T extends IMergeFileSelector> implements
       }
       baseSelector.setConcurrentMergeNum(mid);
       baseSelector.select(false);
-      if (baseSelector.getSelectedUnseqFiles().isEmpty() && baseSelector.getSelectedSeqFiles().isEmpty()) {
+      if (baseSelector.getSelectedUnseqFiles().size() + baseSelector.getSelectedSeqFiles().size() <= 1) {
         baseSelector.select(true);
       }
-      if (baseSelector.getSelectedUnseqFiles().isEmpty() && baseSelector.getSelectedSeqFiles().isEmpty()) {
+      if (baseSelector.getSelectedUnseqFiles().size() + baseSelector.getSelectedSeqFiles().size() <= 1) {
+        // did not find candidates, lower concurrent merge number and retry
+        ub = mid;
+      } else if (baseSelector.getSelectedUnseqFiles().size() == 0 && lastSelectedUnseqFiles != null
+          && lastSelectedUnseqFiles.size() > 0) {
+        // found candidates with no unseq files while the previous result has unseq files
+        // take the previous results because we try to merge at least one unseq file
         ub = mid;
       } else {
+        // found candidates, record them and try to find a higher concurrent number
         lastSelectedSeqFiles = baseSelector.getSelectedSeqFiles();
         lastSelectedUnseqFiles = baseSelector.getSelectedUnseqFiles();
         lastTotalMemoryCost = baseSelector.getTotalCost();
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/selector/InplaceMaxFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/selector/InplaceMaxFileSelector.java
index 7e80490..1a0fc90 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/selector/InplaceMaxFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/inplace/selector/InplaceMaxFileSelector.java
@@ -53,7 +53,7 @@ public class InplaceMaxFileSelector extends BaseFileSelector {
   public void select(boolean useTightBound) throws IOException {
     tmpSelectedSeqFiles = new HashSet<>();
     seqSelected = new boolean[resource.getSeqFiles().size()];
-    super.select(useTightBound);
+    super.selectByUnseq(useTightBound);
   }
 
   @Override
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
index d6e3c56..c32bfb9 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/merge/squeeze/selector/SqueezeMaxFileSelector.java
@@ -62,12 +62,78 @@ public class SqueezeMaxFileSelector extends BaseFileSelector {
   }
 
   public void select(boolean useTightBound) throws IOException {
-    super.select(useTightBound);
-    for (int i = firstOverlapIdx; i < lastOverlapIdx; i++) {
+    super.selectByUnseq(useTightBound);
+
+    if (firstOverlapIdx <= lastOverlapIdx) {
+      // selectByUnseq has found candidates, check if we can extend the selection
+      extendCurrentSelection(useTightBound);
+    } else {
+      // try selecting only seq files as candidates
+      selectBySeq(useTightBound);
+    }
+    for (int i = firstOverlapIdx; i <= lastOverlapIdx; i++) {
       selectedSeqFiles.add(resource.getSeqFiles().get(i));
     }
   }
 
+  private void selectBySeq(boolean useTightBound) throws IOException {
+    for (int i = 0; i < resource.getSeqFiles().size() - 1; i ++) {
+      // try to find candidates starting from i
+      TsFileResource seqFile = resource.getSeqFiles().get(i);
+      long fileCost = calculateSeqFileCost(seqFile, useTightBound);
+      if (fileCost < memoryBudget) {
+        firstOverlapIdx = i;
+        lastOverlapIdx = i;
+        totalCost = fileCost;
+        extendCurrentSelection(useTightBound);
+        if (lastOverlapIdx > firstOverlapIdx) {
+          // if candidates starting from i are found, return
+          return;
+        } else {
+          totalCost = 0;
+          firstOverlapIdx = Integer.MAX_VALUE;
+          lastOverlapIdx = Integer.MIN_VALUE;
+        }
+      }
+    }
+  }
+
+  // if we have selected seqFiles[3] to seqFiles[6], check if we can add seqFiles[7] into the
+  // selection without exceeding the budget
+  private void extendCurrentSelection(boolean useTightBound) throws IOException {
+    for (int i = lastOverlapIdx + 1; i < resource.getSeqFiles().size(); i++) {
+      TsFileResource seqFile = resource.getSeqFiles().get(i);
+      long fileCost = calculateSeqFileCost(seqFile, useTightBound);
+
+      if (fileCost + totalCost < memoryBudget) {
+        maxSeqFileCost = tempMaxSeqFileCost;
+        totalCost += fileCost;
+        lastOverlapIdx++;
+      } else {
+        tempMaxSeqFileCost = maxSeqFileCost;
+        break;
+      }
+    }
+  }
+
+  private long calculateSeqFileCost(TsFileResource seqFile, boolean useTightBound)
+      throws IOException {
+    long fileCost = 0;
+    long fileReadCost = useTightBound ? calculateTightSeqMemoryCost(seqFile) :
+        calculateMetadataSize(seqFile);
+    if (fileReadCost > tempMaxSeqFileCost) {
+      // memory used when read data from a seq file:
+      // only one file will be read at the same time, so only the largest one is recorded here
+      fileCost -= tempMaxSeqFileCost;
+      fileCost += fileReadCost;
+      tempMaxSeqFileCost = fileReadCost;
+    }
+    // memory used to cache the metadata before the new file is closed
+    // but writing data into a new file may generate the same amount of metadata in memory
+    fileCost += calculateMetadataSize(seqFile);
+    return fileCost;
+  }
+
   protected void updateCost(long newCost, TsFileResource unseqFile) {
     if (totalCost + newCost < memoryBudget) {
       selectedUnseqFiles.add(unseqFile);
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 98a83e4..37b230c 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
@@ -899,7 +899,7 @@ public class StorageGroupProcessor {
       IMergeFileSelector fileSelector = strategy.getFileSelector(mergeResource, budget);
       try {
         fileSelector.select();
-        if (fileSelector.getSelectedSeqFiles().isEmpty() && fileSelector.getSelectedUnseqFiles().isEmpty()) {
+        if (fileSelector.getSelectedSeqFiles().size() + fileSelector.getSelectedUnseqFiles().size() <= 1) {
           logger.info("{} cannot select merge candidates under the budget {}", storageGroupName,
               budget);
           return;
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeOverLapTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeOverLapTest.java
index 04373a5..2251fc3 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeOverLapTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeOverLapTest.java
@@ -15,7 +15,6 @@
  * KIND, either express or implied.  See the License for the
  * specific language governing permissions and limitations
  * under the License.
- *
  */
 
 package org.apache.iotdb.db.engine.merge;
@@ -25,12 +24,15 @@ import static org.junit.Assert.assertEquals;
 import java.io.File;
 import java.io.IOException;
 import java.util.Collections;
+import java.util.concurrent.Callable;
 import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.engine.fileSystem.SystemFileFactory;
+import org.apache.iotdb.db.engine.merge.inplace.task.InplaceMergeTask;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
-import org.apache.iotdb.db.engine.merge.task.MergeTask;
+import org.apache.iotdb.db.engine.merge.squeeze.task.SqueezeMergeTask;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.MetadataErrorException;
+import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.query.context.QueryContext;
 import org.apache.iotdb.db.query.reader.resourceRelated.SeqResourceIterateReader;
@@ -50,7 +52,8 @@ public class MergeOverLapTest extends MergeTest {
   private File tempSGDir;
 
   @Before
-  public void setUp() throws IOException, WriteProcessException, MetadataErrorException {
+  public void setUp()
+      throws IOException, WriteProcessException, MetadataErrorException, PathErrorException {
     ptNum = 1000;
     super.setUp();
     tempSGDir = new File("tempSG");
@@ -64,26 +67,26 @@ public class MergeOverLapTest extends MergeTest {
   }
 
   @Override
-  void prepareFiles(int seqFileNum, int unseqFileNum) throws IOException, WriteProcessException {
+  protected void prepareFiles(int seqFileNum, int unseqFileNum) throws IOException, WriteProcessException {
     for (int i = 0; i < seqFileNum; i++) {
-      File file = SystemFileFactory.INSTANCE.getFile(i + "seq.tsfile");
+      File file = SystemFileFactory.INSTANCE.getFile("seq" + i + "-" + i + ".tsfile");
       TsFileResource tsFileResource = new TsFileResource(file);
       seqResources.add(tsFileResource);
       prepareFile(tsFileResource, i * ptNum, ptNum, 0);
     }
     for (int i = 0; i < unseqFileNum; i++) {
-      File file = SystemFileFactory.INSTANCE.getFile(i + "unseq.tsfile");
+      File file = SystemFileFactory.INSTANCE.getFile("unseq" + i + "-" + i + ".tsfile");
       TsFileResource tsFileResource = new TsFileResource(file);
       unseqResources.add(tsFileResource);
       prepareFile(tsFileResource, i * ptNum, ptNum * (i + 1) / unseqFileNum, 10000);
     }
-    File file = SystemFileFactory.INSTANCE.getFile(unseqFileNum + "unseq.tsfile");
+    File file = SystemFileFactory.INSTANCE.getFile("unseq" + unseqFileNum + "-" + unseqFileNum + ".tsfile");
     TsFileResource tsFileResource = new TsFileResource(file);
     unseqResources.add(tsFileResource);
     prepareUnseqFile(tsFileResource, 0, ptNum * unseqFileNum, 20000);
   }
 
-  void prepareUnseqFile(TsFileResource tsFileResource, long timeOffset, long ptNum,
+  private void prepareUnseqFile(TsFileResource tsFileResource, long timeOffset, long ptNum,
       long valueOffset)
       throws IOException, WriteProcessException {
     TsFileWriter fileWriter = new TsFileWriter(tsFileResource.getFile());
@@ -122,16 +125,31 @@ public class MergeOverLapTest extends MergeTest {
   }
 
   @Test
-  public void testFullMerge() throws Exception {
-    MergeTask mergeTask =
-        new MergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath(), (k, v, l) -> {}, "test",
+  public void testInplaceFullMerge() throws Exception {
+    Callable mergeTask =
+        new InplaceMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath(),
+            (k, v, l, n) -> {}, "test",
             true, 1, MERGE_TEST_SG);
     mergeTask.call();
+    check(seqResources.get(0), 1000);
+  }
+
+  @Test
+  public void testSqueezeFullMerge() throws Exception {
+    TsFileResource[] newResource = new TsFileResource[1];
+    Callable mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath(),
+            (k, v, l, n) -> newResource[0] = n, "test", 1, MERGE_TEST_SG);
+    mergeTask.call();
+    check(newResource[0], 5000);
+  }
+
 
+  private void check(TsFileResource mergedFile, long expected) throws IOException {
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
+        Collections.singletonList(mergedFile),
         null, context);
     int cnt = 0;
     try {
@@ -142,7 +160,7 @@ public class MergeOverLapTest extends MergeTest {
           assertEquals(batchData.getTimeByIndex(i) + 20000.0, batchData.getDoubleByIndex(i), 0.001);
         }
       }
-      assertEquals(1000, cnt);
+      assertEquals(expected, cnt);
     } finally {
       tsFilesReader.close();
     }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
index 7bd2afb..e3dad01 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/MergeTest.java
@@ -114,7 +114,8 @@ public abstract class MergeTest {
     }
   }
 
-  void prepareFiles(int seqFileNum, int unseqFileNum) throws IOException, WriteProcessException {
+  protected void prepareFiles(int seqFileNum, int unseqFileNum) throws IOException,
+      WriteProcessException {
     for (int i = 0; i < seqFileNum; i++) {
       File file = SystemFileFactory.INSTANCE.getFile("seq" + i + "-" + i + ".tsfile");
       TsFileResource tsFileResource = new TsFileResource(file);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
index 01ada2a..c6953e3 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
@@ -27,6 +27,7 @@ import java.util.List;
 import org.apache.iotdb.db.engine.merge.MaxSeriesMergeFileSelector;
 import org.apache.iotdb.db.engine.merge.MergeTest;
 import org.apache.iotdb.db.engine.merge.inplace.selector.InplaceMaxFileSelector;
+import org.apache.iotdb.db.engine.merge.squeeze.selector.SqueezeMaxFileSelector;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.MergeException;
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java
index a0a73f6..e3c80db 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java
@@ -42,7 +42,7 @@ import org.junit.Test;
 
 public class MergeLogTest extends MergeTest {
 
-  File tempSGDir;
+  private File tempSGDir;
 
   @Before
   public void setUp() throws IOException, WriteProcessException, MetadataErrorException, PathErrorException {
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxFileMergeFileSelectorTest.java
similarity index 59%
copy from server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
copy to server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxFileMergeFileSelectorTest.java
index 01ada2a..3b3bdab 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxFileMergeFileSelectorTest.java
@@ -17,64 +17,57 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.engine.merge.inplace;
+package org.apache.iotdb.db.engine.merge.squeeze;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
 import java.util.List;
-import org.apache.iotdb.db.engine.merge.MaxSeriesMergeFileSelector;
+import org.apache.iotdb.db.engine.merge.IMergeFileSelector;
 import org.apache.iotdb.db.engine.merge.MergeTest;
-import org.apache.iotdb.db.engine.merge.inplace.selector.InplaceMaxFileSelector;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
+import org.apache.iotdb.db.engine.merge.squeeze.selector.SqueezeMaxFileSelector;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.MergeException;
 import org.junit.Test;
 
-public class MaxSeriesMergeFileSelectorTest extends MergeTest {
+public class MaxFileMergeFileSelectorTest extends MergeTest {
 
   @Test
   public void testFullSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
-    MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, Long.MAX_VALUE));
+    IMergeFileSelector mergeFileSelector = new SqueezeMaxFileSelector(resource, Long.MAX_VALUE);
     mergeFileSelector.select();
     List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
     List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
     assertEquals(seqResources, seqSelected);
     assertEquals(unseqResources, unseqSelected);
-    assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
 
     resource = new MergeResource(seqResources.subList(0, 1), unseqResources);
-    mergeFileSelector = new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource,
-        Long.MAX_VALUE));
+    mergeFileSelector = new SqueezeMaxFileSelector(resource, Long.MAX_VALUE);
     mergeFileSelector.select();
     seqSelected = mergeFileSelector.getSelectedSeqFiles();
     unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
     assertEquals(seqResources.subList(0, 1), seqSelected);
     assertEquals(unseqResources, unseqSelected);
-    assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
 
     resource = new MergeResource(seqResources, unseqResources.subList(0, 1));
-    mergeFileSelector = new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource,
-        Long.MAX_VALUE));
+    mergeFileSelector = new SqueezeMaxFileSelector(resource, Long.MAX_VALUE);
     mergeFileSelector.select();
     seqSelected = mergeFileSelector.getSelectedSeqFiles();
     unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
-    assertEquals(seqResources.subList(0, 1), seqSelected);
+    assertEquals(seqResources.subList(0, 5), seqSelected);
     assertEquals(unseqResources.subList(0, 1), unseqSelected);
-    assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
   }
 
   @Test
   public void testNonSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
-    MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, 1));
+    IMergeFileSelector mergeFileSelector = new SqueezeMaxFileSelector(resource, 1);
     mergeFileSelector.select();
     assertTrue(mergeFileSelector.getSelectedSeqFiles().isEmpty());
     assertTrue(mergeFileSelector.getSelectedUnseqFiles().isEmpty());
@@ -84,28 +77,12 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
   @Test
   public void testRestrictedSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
-    MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, 400000));
+    IMergeFileSelector mergeFileSelector = new SqueezeMaxFileSelector(resource, 400000);
     mergeFileSelector.select();
     List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
     List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
-    assertEquals(seqResources.subList(0, 2), seqSelected);
+    assertEquals(seqResources.subList(0, 4), seqSelected);
     assertEquals(unseqResources.subList(0, 2), unseqSelected);
-    assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
-    resource.clear();
-  }
-
-  @Test
-  public void testRestrictedSelection2() throws MergeException, IOException {
-    MergeResource resource = new MergeResource(seqResources, unseqResources);
-    MaxSeriesMergeFileSelector mergeFileSelector = new MaxSeriesMergeFileSelector(
-        new InplaceMaxFileSelector(resource, 100000));
-    mergeFileSelector.select();
-    List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
-    List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
-    assertEquals(seqResources.subList(0, 1), seqSelected);
-    assertEquals(unseqResources.subList(0, 1), unseqSelected);
-    assertEquals(34, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
   }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxSeriesMergeFileSelectorTest.java
similarity index 85%
copy from server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
copy to server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxSeriesMergeFileSelectorTest.java
index 01ada2a..7e8cb44 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MaxSeriesMergeFileSelectorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MaxSeriesMergeFileSelectorTest.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.engine.merge.inplace;
+package org.apache.iotdb.db.engine.merge.squeeze;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -26,8 +26,8 @@ import java.io.IOException;
 import java.util.List;
 import org.apache.iotdb.db.engine.merge.MaxSeriesMergeFileSelector;
 import org.apache.iotdb.db.engine.merge.MergeTest;
-import org.apache.iotdb.db.engine.merge.inplace.selector.InplaceMaxFileSelector;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
+import org.apache.iotdb.db.engine.merge.squeeze.selector.SqueezeMaxFileSelector;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.MergeException;
 import org.junit.Test;
@@ -38,7 +38,7 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
   public void testFullSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
     MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, Long.MAX_VALUE));
+        new MaxSeriesMergeFileSelector(new SqueezeMaxFileSelector(resource, Long.MAX_VALUE));
     mergeFileSelector.select();
     List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
     List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
@@ -48,7 +48,7 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
     resource.clear();
 
     resource = new MergeResource(seqResources.subList(0, 1), unseqResources);
-    mergeFileSelector = new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource,
+    mergeFileSelector = new MaxSeriesMergeFileSelector(new SqueezeMaxFileSelector(resource,
         Long.MAX_VALUE));
     mergeFileSelector.select();
     seqSelected = mergeFileSelector.getSelectedSeqFiles();
@@ -59,12 +59,12 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
     resource.clear();
 
     resource = new MergeResource(seqResources, unseqResources.subList(0, 1));
-    mergeFileSelector = new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource,
+    mergeFileSelector = new MaxSeriesMergeFileSelector(new SqueezeMaxFileSelector(resource,
         Long.MAX_VALUE));
     mergeFileSelector.select();
     seqSelected = mergeFileSelector.getSelectedSeqFiles();
     unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
-    assertEquals(seqResources.subList(0, 1), seqSelected);
+    assertEquals(seqResources.subList(0, 5), seqSelected);
     assertEquals(unseqResources.subList(0, 1), unseqSelected);
     assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
@@ -74,7 +74,7 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
   public void testNonSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
     MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, 1));
+        new MaxSeriesMergeFileSelector(new SqueezeMaxFileSelector(resource, 1));
     mergeFileSelector.select();
     assertTrue(mergeFileSelector.getSelectedSeqFiles().isEmpty());
     assertTrue(mergeFileSelector.getSelectedUnseqFiles().isEmpty());
@@ -85,12 +85,12 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
   public void testRestrictedSelection() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
     MaxSeriesMergeFileSelector mergeFileSelector =
-        new MaxSeriesMergeFileSelector(new InplaceMaxFileSelector(resource, 400000));
+        new MaxSeriesMergeFileSelector(new SqueezeMaxFileSelector(resource, 400000));
     mergeFileSelector.select();
     List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
     List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
-    assertEquals(seqResources.subList(0, 2), seqSelected);
-    assertEquals(unseqResources.subList(0, 2), unseqSelected);
+    assertEquals(seqResources.subList(0, 4), seqSelected);
+    assertEquals(unseqResources.subList(0, 1), unseqSelected);
     assertEquals(MaxSeriesMergeFileSelector.MAX_SERIES_NUM, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
   }
@@ -99,13 +99,13 @@ public class MaxSeriesMergeFileSelectorTest extends MergeTest {
   public void testRestrictedSelection2() throws MergeException, IOException {
     MergeResource resource = new MergeResource(seqResources, unseqResources);
     MaxSeriesMergeFileSelector mergeFileSelector = new MaxSeriesMergeFileSelector(
-        new InplaceMaxFileSelector(resource, 100000));
+        new SqueezeMaxFileSelector(resource, 100000));
     mergeFileSelector.select();
     List<TsFileResource> seqSelected = mergeFileSelector.getSelectedSeqFiles();
     List<TsFileResource> unseqSelected = mergeFileSelector.getSelectedUnseqFiles();
     assertEquals(seqResources.subList(0, 1), seqSelected);
     assertEquals(unseqResources.subList(0, 1), unseqSelected);
-    assertEquals(34, mergeFileSelector.getConcurrentMergeNum());
+    assertEquals(128, mergeFileSelector.getConcurrentMergeNum());
     resource.clear();
   }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeLogTest.java
similarity index 87%
copy from server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java
copy to server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeLogTest.java
index a0a73f6..45b740e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/inplace/MergeLogTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeLogTest.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package org.apache.iotdb.db.engine.merge.inplace;
+package org.apache.iotdb.db.engine.merge.squeeze;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
@@ -30,7 +30,7 @@ import java.util.List;
 import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.engine.merge.MergeTest;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
-import org.apache.iotdb.db.engine.merge.inplace.task.InplaceMergeTask;
+import org.apache.iotdb.db.engine.merge.squeeze.task.SqueezeMergeTask;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.MetadataErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
@@ -42,7 +42,7 @@ import org.junit.Test;
 
 public class MergeLogTest extends MergeTest {
 
-  File tempSGDir;
+  private File tempSGDir;
 
   @Before
   public void setUp() throws IOException, WriteProcessException, MetadataErrorException, PathErrorException {
@@ -59,9 +59,9 @@ public class MergeLogTest extends MergeTest {
 
   @Test
   public void testMergeLog() throws Exception {
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources.subList(0, 1), unseqResources.subList(0, 1)),
-            tempSGDir.getPath(), this::testCallBack, "test", false, 1, MERGE_TEST_SG);
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources.subList(0, 1), unseqResources.subList(0, 1)),
+            tempSGDir.getPath(), this::testCallBack, "test", 1, MERGE_TEST_SG);
     mergeTask.call();
   }
 
@@ -78,7 +78,8 @@ public class MergeLogTest extends MergeTest {
       e.printStackTrace();
       fail(e.getMessage());
     }
-    assertEquals(309, lineCnt);
+    assertEquals(6, lineCnt);
+    newFile.remove();
   }
 
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeTaskTest.java b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeTaskTest.java
index c81c318..9e63e17 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeTaskTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/merge/squeeze/MergeTaskTest.java
@@ -27,7 +27,6 @@ import java.util.Collections;
 import org.apache.commons.io.FileUtils;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.merge.MergeTest;
-import org.apache.iotdb.db.engine.merge.inplace.task.InplaceMergeTask;
 import org.apache.iotdb.db.engine.merge.manage.MergeResource;
 import org.apache.iotdb.db.engine.merge.squeeze.task.SqueezeMergeTask;
 import org.apache.iotdb.db.engine.modification.Deletion;
@@ -66,7 +65,7 @@ public class MergeTaskTest extends MergeTest {
     TsFileResource[] newResource = new TsFileResource[1];
     SqueezeMergeTask mergeTask =
         new SqueezeMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath(), (k, v
-            , l, n) -> {newResource[0] = n;}, "test", 1, MERGE_TEST_SG);
+            , l, n) -> newResource[0] = n, "test", 1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
@@ -78,72 +77,55 @@ public class MergeTaskTest extends MergeTest {
     while (tsFilesReader.hasNext()) {
       BatchData batchData = tsFilesReader.nextBatch();
       for (int i = 0; i < batchData.length(); i++) {
-        System.out.println(batchData.getTimeByIndex(i) + " " + batchData.getDoubleByIndex(i));
         assertEquals(batchData.getTimeByIndex(i) + 20000.0, batchData.getDoubleByIndex(i), 0.001);
         cnt++;
       }
     }
-    assertEquals(2000, cnt);
-    tsFilesReader.close();
-  }
-
-  @Test
-  public void testFullMerge() throws Exception {
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath()
-            , (k, v, l, n) -> {}, "test",
-            true, 1, MERGE_TEST_SG);
-    mergeTask.call();
-
-    QueryContext context = new QueryContext();
-    Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
-    SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
-        null, context);
-    while (tsFilesReader.hasNext()) {
-      BatchData batchData = tsFilesReader.nextBatch();
-      for (int i = 0; i < batchData.length(); i++) {
-        assertEquals(batchData.getTimeByIndex(i) + 20000.0, batchData.getDoubleByIndex(i), 0.001);
-      }
-    }
+    assertEquals(500, cnt);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 
   @Test
   public void testChunkNumThreshold() throws Exception {
     IoTDBDescriptor.getInstance().getConfig().setChunkMergePointThreshold(Integer.MAX_VALUE);
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath()
-            , (k, v, l, n) -> {}, "test",
-            false, 1, MERGE_TEST_SG);
+    TsFileResource[] newResource = new TsFileResource[1];
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources), tempSGDir.getPath()
+            , (k, v, l, n) -> newResource[0] = n, "test",1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
+        Collections.singletonList(newResource[0]),
         null, context);
+    int cnt = 0;
     while (tsFilesReader.hasNext()) {
       BatchData batchData = tsFilesReader.nextBatch();
       for (int i = 0; i < batchData.length(); i++) {
         assertEquals(batchData.getTimeByIndex(i) + 20000.0, batchData.getDoubleByIndex(i), 0.001);
+        cnt++;
       }
     }
+    assertEquals(500, cnt);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 
   @Test
   public void testPartialMerge1() throws Exception {
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 1)), tempSGDir.getPath(),
-            (k, v, l, n) -> {}, "test", false, 1, MERGE_TEST_SG);
+    TsFileResource[] newResource = new TsFileResource[1];
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 1)), tempSGDir.getPath(),
+            (k, v, l, n) -> newResource[0] = n, "test", 1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
-        null, context);
+        Collections.singletonList(newResource[0]), null, context);
+    int cnt = 0;
     while (tsFilesReader.hasNext()) {
       BatchData batchData = tsFilesReader.nextBatch();
       for (int i = 0; i < batchData.length(); i++) {
@@ -152,79 +134,96 @@ public class MergeTaskTest extends MergeTest {
         } else {
           assertEquals(batchData.getTimeByIndex(i) + 0.0, batchData.getDoubleByIndex(i), 0.001);
         }
+        cnt++;
       }
     }
+    assertEquals(500, cnt);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 
   @Test
   public void testPartialMerge2() throws Exception {
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources.subList(5, 6)), tempSGDir.getPath(),
-            (k, v, l, n) -> {}, "test", false, 1, MERGE_TEST_SG);
+    TsFileResource[] newResource = new TsFileResource[1];
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources.subList(5, 6)), tempSGDir.getPath(),
+            (k, v, l, n) -> newResource[0] = n, "test", 1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
+        Collections.singletonList(newResource[0]),
         null, context);
+    int cnt = 0;
     while (tsFilesReader.hasNext()) {
       BatchData batchData = tsFilesReader.nextBatch();
       for (int i = 0; i < batchData.length(); i++) {
         assertEquals(batchData.getTimeByIndex(i) + 20000.0, batchData.getDoubleByIndex(i), 0.001);
+        cnt++;
       }
     }
+    assertEquals(500, cnt);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 
   @Test
   public void testPartialMerge3() throws Exception {
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 5)), tempSGDir.getPath(),
-            (k, v, l, n) -> {}, "test", false, 1, MERGE_TEST_SG);
+    TsFileResource[] newResource = new TsFileResource[1];
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 5)), tempSGDir.getPath(),
+            (k, v, l, n) -> newResource[0] = n, "test",1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(2)),
+        Collections.singletonList(newResource[0]),
         null, context);
+    int cnt = 0;
     while (tsFilesReader.hasNext()) {
       BatchData batchData = tsFilesReader.nextBatch();
       for (int i = 0; i < batchData.length(); i++) {
-        if (batchData.getTimeByIndex(i) < 260) {
+        long time = batchData.getTimeByIndex(i);
+        boolean overflowed = time < (100 * (time / 100) + 20 * (time / 100 + 1));
+        if (overflowed) {
           assertEquals(batchData.getTimeByIndex(i) + 10000.0, batchData.getDoubleByIndex(i), 0.001);
         } else {
           assertEquals(batchData.getTimeByIndex(i) + 0.0, batchData.getDoubleByIndex(i), 0.001);
         }
+        cnt++;
       }
     }
+    assertEquals(500, cnt);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 
   @Test
   public void mergeWithDeletionTest() throws Exception {
+    TsFileResource[] newResource = new TsFileResource[1];
     seqResources.get(0).getModFile().write(new Deletion(new Path(deviceIds[0],
         measurementSchemas[0].getMeasurementId()), 10000, 49));
     seqResources.get(0).getModFile().close();
 
 
-    InplaceMergeTask mergeTask =
-        new InplaceMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 1)), tempSGDir.getPath(),
+    SqueezeMergeTask mergeTask =
+        new SqueezeMergeTask(new MergeResource(seqResources, unseqResources.subList(0, 1)), tempSGDir.getPath(),
             (k, v, l, n) -> {
               try {
                 seqResources.get(0).removeModFile();
               } catch (IOException e) {
                 e.printStackTrace();
               }
-            }, "test", false, 1, MERGE_TEST_SG);
+              newResource[0] = n;
+            }, "test", 1, MERGE_TEST_SG);
     mergeTask.call();
 
     QueryContext context = new QueryContext();
     Path path = new Path(deviceIds[0], measurementSchemas[0].getMeasurementId());
     SeqResourceIterateReader tsFilesReader = new SeqResourceIterateReader(path,
-        Collections.singletonList(seqResources.get(0)),
+        Collections.singletonList(newResource[0]),
         null, context);
     int count = 0;
     while (tsFilesReader.hasNext()) {
@@ -238,7 +237,8 @@ public class MergeTaskTest extends MergeTest {
         count ++;
       }
     }
-    assertEquals(70, count);
+    assertEquals(470, count);
     tsFilesReader.close();
+    newResource[0].remove();
   }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMergeTest.java b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMergeTest.java
index 6284842..8a7a7f4 100644
--- a/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMergeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/integration/IoTDBMergeTest.java
@@ -26,6 +26,8 @@ import java.sql.DriverManager;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
+import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.engine.merge.MergeFileStrategy;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.jdbc.Config;
@@ -37,7 +39,6 @@ public class IoTDBMergeTest {
 
   private static IoTDB daemon;
 
-  @Before
   public void setUp() throws Exception {
     EnvironmentUtils.closeStatMonitor();
 
@@ -47,14 +48,12 @@ public class IoTDBMergeTest {
     Class.forName(Config.JDBC_DRIVER_NAME);
   }
 
-  @After
   public void tearDown() throws Exception {
     daemon.stop();
     EnvironmentUtils.cleanEnv();
   }
 
-  @Test
-  public void test() throws SQLException {
+  private void doTest() throws SQLException {
     try (Connection connection = DriverManager
         .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root", "root");
         Statement statement = connection.createStatement()) {
@@ -94,4 +93,15 @@ public class IoTDBMergeTest {
     }
   }
 
+  @Test
+  public void test() throws Exception {
+    for (MergeFileStrategy strategy : MergeFileStrategy.values()) {
+      IoTDBDescriptor.getInstance().getConfig().setMergeFileStrategy(strategy);
+      System.out.println("Testing merge strategy: " + strategy);
+      setUp();
+      doTest();
+      tearDown();
+    }
+  }
+
 }