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

[iotdb] branch master updated: [IOTDB-2680] Fix too many open files exception (#5177)

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

qiaojialin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 1584871  [IOTDB-2680] Fix too many open files exception (#5177)
1584871 is described below

commit 1584871a7cdca3b055f90ee43ffeb355eb8d8db3
Author: 周沛辰 <45...@users.noreply.github.com>
AuthorDate: Tue Mar 8 20:09:45 2022 +0800

    [IOTDB-2680] Fix too many open files exception (#5177)
---
 docs/UserGuide/Reference/Config-Manual.md          | 15 +++-
 docs/zh/UserGuide/Reference/Config-Manual.md       | 13 +++-
 .../db/integration/IoTDBNewTsFileCompactionIT.java |  6 +-
 .../integration/IoTDBSizeTieredCompactionIT.java   |  6 +-
 .../resources/conf/iotdb-engine.properties         | 12 ++-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 23 ++++--
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  | 11 ++-
 .../db/engine/compaction/CompactionUtils.java      | 19 ++---
 .../selector/RewriteCompactionFileSelector.java    |  7 +-
 .../sizetiered/SizeTieredCompactionSelector.java   |  2 +-
 .../inner/utils/MultiTsFileDeviceIterator.java     | 31 ++++++--
 .../engine/compaction/CompactionSchedulerTest.java | 90 +++++++++++-----------
 .../cross/RewriteCompactionFileSelectorTest.java   | 21 +++++
 .../inner/InnerCompactionSchedulerTest.java        |  8 +-
 .../compaction/utils/CompactionConfigRestorer.java |  6 +-
 .../storagegroup/StorageGroupProcessorTest.java    |  6 +-
 16 files changed, 179 insertions(+), 97 deletions(-)

diff --git a/docs/UserGuide/Reference/Config-Manual.md b/docs/UserGuide/Reference/Config-Manual.md
index 21386f2..ebf91c1 100644
--- a/docs/UserGuide/Reference/Config-Manual.md
+++ b/docs/UserGuide/Reference/Config-Manual.md
@@ -841,15 +841,24 @@ The permission definitions are in ${IOTDB\_CONF}/conf/jmx.access.
 |Default| 100 |
 |Effective|After restart system|
 
-* max\_compaction\_candidate\_file\_num
+* max\_inner\_compaction\_candidate\_file\_num
 
-|Name| max\_compaction\_candidate\_file\_num |
+|Name| max\_inner\_compaction\_candidate\_file\_num |
 |:---:|:---|
-|Description| The max num of files encounter in compaction |
+|Description| The max num of files encounter in inner space compaction |
 |Type| Int32 |
 |Default| 30 |
 |Effective|After restart system|
 
+* max\_cross\_compaction\_file\_num
+
+|Name| max\_cross\_compaction\_candidate\_file\_num |
+|:---:|:---|
+|Description| The max num of files encounter in cross space compaction |
+|Type| Int32 |
+|Default| 1000 |
+|Effective|After restart system|
+
 * cross\_compaction\_file\_selection\_time\_budget
 
 |Name| cross\_compaction\_file\_selection\_time\_budget |
diff --git a/docs/zh/UserGuide/Reference/Config-Manual.md b/docs/zh/UserGuide/Reference/Config-Manual.md
index 5b4b5a9..a5e382c 100644
--- a/docs/zh/UserGuide/Reference/Config-Manual.md
+++ b/docs/zh/UserGuide/Reference/Config-Manual.md
@@ -880,15 +880,24 @@ Server,客户端的使用方式详见 [SQL 命令行终端(CLI)](https://i
 |默认值| 100 |
 |改后生效方式|重启服务生效|
 
-* max\_compaction\_candidate\_file\_num
+* max\_inner\_compaction\_candidate\_file\_num
 
-|名字| max\_compaction\_candidate\_file\_num |
+|名字| max\_inner\_compaction\_candidate\_file\_num |
 |:---:|:---|
 |描述| 空间内合并中一次合并最多参与的文件数 |
 |类型| Int32 |
 |默认值| 30|
 |改后生效方式|重启服务生效|
 
+* max\_cross\_compaction\_candidate\_file\_num
+
+|名字| max\_cross\_compaction\_candidate\_file\_num |
+|:---:|:---|
+|描述| 跨空间合并中一次合并最多参与的文件数 |
+|类型| Int32 |
+|默认值| 1000|
+|改后生效方式|重启服务生效|
+
 * cross\_compaction\_file\_selection\_time\_budget
 
 |名字| cross\_compaction\_file\_selection\_time\_budget |
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNewTsFileCompactionIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNewTsFileCompactionIT.java
index cfe7b40..59734ed 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNewTsFileCompactionIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBNewTsFileCompactionIT.java
@@ -64,9 +64,9 @@ public class IoTDBNewTsFileCompactionIT {
     storageGroupPath = new PartialPath("root.newTsFileCompaction");
     TSFileDescriptor.getInstance().getConfig().setMaxNumberOfPointsInPage(1);
     originCompactionFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
     originSeqTsFileSize = IoTDBDescriptor.getInstance().getConfig().getSeqTsFileSize();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     IoTDBDescriptor.getInstance().getConfig().setSeqTsFileSize(1);
     EnvironmentUtils.envSetUp();
     Class.forName(Config.JDBC_DRIVER_NAME);
@@ -85,7 +85,7 @@ public class IoTDBNewTsFileCompactionIT {
     EnvironmentUtils.cleanEnv();
     IoTDBDescriptor.getInstance()
         .getConfig()
-        .setMaxCompactionCandidateFileNum(originCompactionFileNum);
+        .setMaxInnerCompactionCandidateFileNum(originCompactionFileNum);
     TSFileDescriptor.getInstance()
         .getConfig()
         .setMaxNumberOfPointsInPage(preMaxNumberOfPointsInPage);
diff --git a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSizeTieredCompactionIT.java b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSizeTieredCompactionIT.java
index f00b94c..9e604e7 100644
--- a/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSizeTieredCompactionIT.java
+++ b/integration/src/test/java/org/apache/iotdb/db/integration/IoTDBSizeTieredCompactionIT.java
@@ -1016,8 +1016,8 @@ public class IoTDBSizeTieredCompactionIT {
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(2);
     IoTDBDescriptor.getInstance().getConfig().setTargetCompactionFileSize(600);
     int originCandidateNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     CompactionPriority compactionPriority =
         IoTDBDescriptor.getInstance().getConfig().getCompactionPriority();
     IoTDBDescriptor.getInstance().getConfig().setCompactionPriority(CompactionPriority.INNER_CROSS);
@@ -1093,7 +1093,7 @@ public class IoTDBSizeTieredCompactionIT {
       IoTDBDescriptor.getInstance().getConfig().setCompactionPriority(compactionPriority);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(originCandidateNum);
+          .setMaxInnerCompactionCandidateFileNum(originCandidateNum);
     }
   }
 
diff --git a/server/src/assembly/resources/conf/iotdb-engine.properties b/server/src/assembly/resources/conf/iotdb-engine.properties
index 8f56a16..00180ee 100644
--- a/server/src/assembly/resources/conf/iotdb-engine.properties
+++ b/server/src/assembly/resources/conf/iotdb-engine.properties
@@ -423,11 +423,11 @@ timestamp_precision=ms
 # Datatype: boolean
 # enable_cross_space_compaction=true
 
-# the strategy of inner space compaction task
+# the strategy of cross space compaction task
 # Options: rewrite_compaction
 # cross_compaction_strategy=rewrite_compaction
 
-# the strategy of cross space compaction task
+# the strategy of inner space compaction task
 # Options: size_tiered_compaction
 # inner_compaction_strategy=size_tiered_compaction
 
@@ -457,9 +457,13 @@ timestamp_precision=ms
 # Datatype: long
 # chunk_point_num_lower_bound_in_compaction=100
 
-# The max file when selecting compaction candidate file
+# The max file when selecting inner space compaction candidate files
+# Datatype: int
+# max_inner_compaction_candidate_file_num=30
+
+# The max file when selecting cross space compaction candidate files
 # Datatype: int
-# max_compaction_candidate_file_num=30
+# max_cross_compaction_candidate_file_num=1000
 
 # If one merge file selection runs for more than this time, it will be ended and its current
 # selection will be used as final selection.
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 df0f04d..bc99cc6 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
@@ -414,8 +414,11 @@ public class IoTDBConfig {
    */
   private long compactionAcquireWriteLockTimeout = 60_000L;
 
-  /** The max candidate file num in compaction */
-  private int maxCompactionCandidateFileNum = 30;
+  /** The max candidate file num in inner space compaction */
+  private int maxInnerCompactionCandidateFileNum = 30;
+
+  /** The max candidate file num in cross space compaction */
+  private int maxCrossCompactionCandidateFileNum = 1000;
 
   /** The interval of compaction task schedulation in each virtual storage group. The unit is ms. */
   private long compactionScheduleIntervalInMs = 60_000L;
@@ -2470,12 +2473,20 @@ public class IoTDBConfig {
     this.compactionScheduleIntervalInMs = compactionScheduleIntervalInMs;
   }
 
-  public int getMaxCompactionCandidateFileNum() {
-    return maxCompactionCandidateFileNum;
+  public int getMaxInnerCompactionCandidateFileNum() {
+    return maxInnerCompactionCandidateFileNum;
+  }
+
+  public void setMaxInnerCompactionCandidateFileNum(int maxInnerCompactionCandidateFileNum) {
+    this.maxInnerCompactionCandidateFileNum = maxInnerCompactionCandidateFileNum;
+  }
+
+  public int getMaxCrossCompactionCandidateFileNum() {
+    return maxCrossCompactionCandidateFileNum;
   }
 
-  public void setMaxCompactionCandidateFileNum(int maxCompactionCandidateFileNum) {
-    this.maxCompactionCandidateFileNum = maxCompactionCandidateFileNum;
+  public void setMaxCrossCompactionCandidateFileNum(int maxCrossCompactionCandidateFileNum) {
+    this.maxCrossCompactionCandidateFileNum = maxCrossCompactionCandidateFileNum;
   }
 
   public long getCompactionSubmissionIntervalInMs() {
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
index 0d5cb9e..cc59dce 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java
@@ -523,11 +523,16 @@ public class IoTDBDescriptor {
               properties.getProperty(
                   "chunk_size_lower_bound_in_compaction",
                   Long.toString(conf.getChunkSizeLowerBoundInCompaction()))));
-      conf.setMaxCompactionCandidateFileNum(
+      conf.setMaxInnerCompactionCandidateFileNum(
           Integer.parseInt(
               properties.getProperty(
-                  "max_compaction_candidate_file_num",
-                  Integer.toString(conf.getMaxCompactionCandidateFileNum()))));
+                  "max_inner_compaction_candidate_file_num",
+                  Integer.toString(conf.getMaxInnerCompactionCandidateFileNum()))));
+      conf.setMaxCrossCompactionCandidateFileNum(
+          Integer.parseInt(
+              properties.getProperty(
+                  "max_cross_compaction_candidate_file_num",
+                  Integer.toString(conf.getMaxCrossCompactionCandidateFileNum()))));
 
       conf.setCompactionWriteThroughputMbPerSec(
           Integer.parseInt(
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionUtils.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionUtils.java
index 9485f1e..906ead9 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/CompactionUtils.java
@@ -57,7 +57,6 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -85,12 +84,11 @@ public class CompactionUtils {
         .getQueryFileManager()
         .addUsedFilesForQuery(queryId, queryDataSource);
 
-    List<TsFileResource> allResources = new ArrayList<>();
-    allResources.addAll(seqFileResources);
-    allResources.addAll(unseqFileResources);
     try (AbstractCompactionWriter compactionWriter =
-            getCompactionWriter(seqFileResources, unseqFileResources, targetFileResources);
-        MultiTsFileDeviceIterator deviceIterator = new MultiTsFileDeviceIterator(allResources)) {
+        getCompactionWriter(seqFileResources, unseqFileResources, targetFileResources)) {
+      // Do not close device iterator, because tsfile reader is managed by FileReaderManager.
+      MultiTsFileDeviceIterator deviceIterator =
+          new MultiTsFileDeviceIterator(seqFileResources, unseqFileResources);
       while (deviceIterator.hasNextDevice()) {
         checkThreadInterrupted(targetFileResources);
         Pair<String, Boolean> deviceInfo = deviceIterator.nextDevice();
@@ -121,9 +119,9 @@ public class CompactionUtils {
       QueryContext queryContext,
       QueryDataSource queryDataSource)
       throws IOException, MetadataException {
-    MultiTsFileDeviceIterator.AlignedMeasurmentIterator alignedMeasurmentIterator =
+    MultiTsFileDeviceIterator.AlignedMeasurementIterator alignedMeasurementIterator =
         deviceIterator.iterateAlignedSeries(device);
-    List<String> allMeasurements = alignedMeasurmentIterator.getAllMeasurements();
+    Set<String> allMeasurements = alignedMeasurementIterator.getAllMeasurements();
     List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
     for (String measurement : allMeasurements) {
       // TODO: use IDTable
@@ -146,7 +144,7 @@ public class CompactionUtils {
             device,
             existedMeasurements,
             measurementSchemas,
-            new HashSet<>(existedMeasurements),
+            allMeasurements,
             queryContext,
             queryDataSource,
             true);
@@ -172,7 +170,6 @@ public class CompactionUtils {
     MultiTsFileDeviceIterator.MeasurementIterator measurementIterator =
         deviceIterator.iterateNotAlignedSeries(device, false);
     Set<String> allMeasurements = measurementIterator.getAllMeasurements();
-    Set<String> allMeasurementSet = new HashSet<>(allMeasurements);
     for (String measurement : allMeasurements) {
       List<IMeasurementSchema> measurementSchemas = new ArrayList<>();
       try {
@@ -188,7 +185,7 @@ public class CompactionUtils {
               device,
               Collections.singletonList(measurement),
               measurementSchemas,
-              allMeasurementSet,
+              allMeasurements,
               queryContext,
               queryDataSource,
               false);
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/selector/RewriteCompactionFileSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/selector/RewriteCompactionFileSelector.java
index 8fd8838..858293f 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/selector/RewriteCompactionFileSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/selector/RewriteCompactionFileSelector.java
@@ -51,6 +51,7 @@ public class RewriteCompactionFileSelector implements ICrossSpaceMergeFileSelect
   long totalCost;
   private long memoryBudget;
   private long maxSeqFileCost;
+  private int maxCrossCompactionFileNum;
 
   // the number of timeseries being queried at the same time
   int concurrentMergeNum = 1;
@@ -72,6 +73,8 @@ public class RewriteCompactionFileSelector implements ICrossSpaceMergeFileSelect
   public RewriteCompactionFileSelector(CrossSpaceCompactionResource resource, long memoryBudget) {
     this.resource = resource;
     this.memoryBudget = memoryBudget;
+    this.maxCrossCompactionFileNum =
+        IoTDBDescriptor.getInstance().getConfig().getMaxCrossCompactionCandidateFileNum();
   }
 
   /**
@@ -195,7 +198,9 @@ public class RewriteCompactionFileSelector implements ICrossSpaceMergeFileSelect
   }
 
   private boolean updateSelectedFiles(long newCost, TsFileResource unseqFile) {
-    if (totalCost + newCost < memoryBudget) {
+    if (seqSelectedNum + selectedUnseqFiles.size() + 1 + tmpSelectedSeqFiles.size()
+            <= maxCrossCompactionFileNum
+        && totalCost + newCost < memoryBudget) {
       selectedUnseqFiles.add(unseqFile);
       maxSeqFileCost = tempMaxSeqFileCost;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
index 7a8ea62..bed2abb 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionSelector.java
@@ -138,7 +138,7 @@ public class SizeTieredCompactionSelector extends AbstractInnerSpaceCompactionSe
           selectedFileSize);
       // if the file size or file num reach threshold
       if (selectedFileSize >= targetCompactionFileSize
-          || selectedFileList.size() >= config.getMaxCompactionCandidateFileNum()) {
+          || selectedFileList.size() >= config.getMaxInnerCompactionCandidateFileNum()) {
         // submit the task
         if (selectedFileList.size() > 1) {
           taskPriorityQueue.add(new Pair<>(new ArrayList<>(selectedFileList), selectedFileSize));
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
index b137baa..cb76dfd 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/inner/utils/MultiTsFileDeviceIterator.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.engine.modification.ModificationFile;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.metadata.IllegalPathException;
 import org.apache.iotdb.db.metadata.path.PartialPath;
+import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.utils.QueryUtils;
 import org.apache.iotdb.tsfile.file.metadata.AlignedChunkMetadata;
 import org.apache.iotdb.tsfile.file.metadata.ChunkMetadata;
@@ -53,6 +54,7 @@ public class MultiTsFileDeviceIterator implements AutoCloseable {
   private Map<TsFileResource, List<Modification>> modificationCache = new HashMap<>();
   private Pair<String, Boolean> currentDevice = null;
 
+  /** Used for inner space compaction. */
   public MultiTsFileDeviceIterator(List<TsFileResource> tsFileResources) throws IOException {
     this.tsFileResources = new ArrayList<>(tsFileResources);
     Collections.sort(this.tsFileResources, TsFileResource::compareFileName);
@@ -72,6 +74,23 @@ public class MultiTsFileDeviceIterator implements AutoCloseable {
     }
   }
 
+  /** Used for cross space compaction. */
+  public MultiTsFileDeviceIterator(
+      List<TsFileResource> seqResources, List<TsFileResource> unseqResources) throws IOException {
+    for (TsFileResource tsFileResource : seqResources) {
+      TsFileSequenceReader reader =
+          FileReaderManager.getInstance().get(tsFileResource.getTsFilePath(), true);
+      readerMap.put(tsFileResource, reader);
+      deviceIteratorMap.put(tsFileResource, reader.getAllDevicesIteratorWithIsAligned());
+    }
+    for (TsFileResource tsFileResource : unseqResources) {
+      TsFileSequenceReader reader =
+          FileReaderManager.getInstance().get(tsFileResource.getTsFilePath(), true);
+      readerMap.put(tsFileResource, reader);
+      deviceIteratorMap.put(tsFileResource, reader.getAllDevicesIteratorWithIsAligned());
+    }
+  }
+
   public boolean hasNextDevice() {
     boolean hasNext = false;
     for (TsFileDeviceIterator iterator : deviceIteratorMap.values()) {
@@ -124,8 +143,8 @@ public class MultiTsFileDeviceIterator implements AutoCloseable {
     return new MeasurementIterator(readerMap, device, derserializeTimeseriesMetadata);
   }
 
-  public AlignedMeasurmentIterator iterateAlignedSeries(String device) {
-    return new AlignedMeasurmentIterator(device, new ArrayList<>(readerMap.values()));
+  public AlignedMeasurementIterator iterateAlignedSeries(String device) {
+    return new AlignedMeasurementIterator(device, new ArrayList<>(readerMap.values()));
   }
 
   /**
@@ -211,22 +230,22 @@ public class MultiTsFileDeviceIterator implements AutoCloseable {
     }
   }
 
-  public class AlignedMeasurmentIterator {
+  public class AlignedMeasurementIterator {
     private List<TsFileSequenceReader> sequenceReaders;
     private String device;
 
-    private AlignedMeasurmentIterator(String device, List<TsFileSequenceReader> sequenceReaders) {
+    private AlignedMeasurementIterator(String device, List<TsFileSequenceReader> sequenceReaders) {
       this.device = device;
       this.sequenceReaders = sequenceReaders;
     }
 
-    public List<String> getAllMeasurements() throws IOException {
+    public Set<String> getAllMeasurements() throws IOException {
       Map<String, TimeseriesMetadata> deviceMeasurementsMap = new ConcurrentHashMap<>();
       for (TsFileSequenceReader reader : sequenceReaders) {
         deviceMeasurementsMap.putAll(reader.readDeviceMetadata(device));
       }
       deviceMeasurementsMap.remove("");
-      return new ArrayList<>(deviceMeasurementsMap.keySet());
+      return deviceMeasurementsMap.keySet();
     }
   }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionSchedulerTest.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionSchedulerTest.java
index 6018afa..3ae623e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionSchedulerTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/CompactionSchedulerTest.java
@@ -147,8 +147,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     IoTDBDescriptor.getInstance()
         .getConfig()
         .setTargetCompactionFileSize(2L * 1024L * 1024L * 1024L);
@@ -260,7 +260,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -282,8 +282,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     IoTDBDescriptor.getInstance()
         .getConfig()
         .setCrossCompactionMemoryBudget(2 * 1024 * 1024L * 1024L);
@@ -386,7 +386,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -407,8 +407,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     String sgName = COMPACTION_TEST_SG + "test3";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -494,7 +494,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -515,8 +515,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     IoTDBDescriptor.getInstance()
         .getConfig()
         .setTargetCompactionFileSize(2L * 1024L * 1024L * 1024L);
@@ -592,7 +592,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -613,8 +613,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     String sgName = COMPACTION_TEST_SG + "test5";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -718,7 +718,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -740,8 +740,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     String sgName = COMPACTION_TEST_SG + "test6";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -837,7 +837,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -857,8 +857,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     String sgName = COMPACTION_TEST_SG + "test7";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -950,7 +950,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -970,8 +970,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(100);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(100);
     String sgName = COMPACTION_TEST_SG + "test8";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1049,7 +1049,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -1069,8 +1069,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test9";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1161,7 +1161,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -1184,8 +1184,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test10";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1280,7 +1280,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
       IoTDBDescriptor.getInstance()
           .getConfig()
           .setEnableCrossSpaceCompaction(prevEnableCrossCompaction);
@@ -1303,8 +1303,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test11";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1398,7 +1398,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -1419,8 +1419,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test12";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1517,7 +1517,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
@@ -1538,8 +1538,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test13";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1639,7 +1639,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -1659,8 +1659,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test14";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1768,7 +1768,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
   /**
@@ -1788,8 +1788,8 @@ public class CompactionSchedulerTest {
         IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(1);
     int prevMaxCompactionCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(2);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(2);
     String sgName = COMPACTION_TEST_SG + "test16";
     try {
       IoTDB.metaManager.setStorageGroup(new PartialPath(sgName));
@@ -1885,7 +1885,7 @@ public class CompactionSchedulerTest {
           .setConcurrentCompactionThread(prevCompactionConcurrentThread);
       IoTDBDescriptor.getInstance()
           .getConfig()
-          .setMaxCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
+          .setMaxInnerCompactionCandidateFileNum(prevMaxCompactionCandidateFileNum);
     }
   }
 
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
index 7af8363..9ccf5aa 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCompactionFileSelectorTest.java
@@ -869,4 +869,25 @@ public class RewriteCompactionFileSelectorTest extends MergeTest {
     Assert.assertEquals(2, result[0].size());
     Assert.assertEquals(2, result[1].size());
   }
+
+  @Test
+  public void testMaxFileSelection() throws MergeException, IOException {
+    int oldMaxCrossCompactionCandidateFileNum =
+        IoTDBDescriptor.getInstance().getConfig().getMaxCrossCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxCrossCompactionCandidateFileNum(5);
+    CrossSpaceCompactionResource resource =
+        new CrossSpaceCompactionResource(seqResources, unseqResources);
+    ICrossSpaceMergeFileSelector mergeFileSelector =
+        new RewriteCompactionFileSelector(resource, Long.MAX_VALUE);
+    List[] result = mergeFileSelector.select();
+    assertEquals(2, result.length);
+    List<TsFileResource> seqSelected = result[0];
+    List<TsFileResource> unseqSelected = result[1];
+    assertEquals(2, seqSelected.size());
+    assertEquals(2, unseqSelected.size());
+    resource.clear();
+    IoTDBDescriptor.getInstance()
+        .getConfig()
+        .setMaxCrossCompactionCandidateFileNum(oldMaxCrossCompactionCandidateFileNum);
+  }
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/InnerCompactionSchedulerTest.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/InnerCompactionSchedulerTest.java
index ffa05b2..52ab698 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/InnerCompactionSchedulerTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/InnerCompactionSchedulerTest.java
@@ -47,7 +47,7 @@ public class InnerCompactionSchedulerTest extends AbstractCompactionTest {
   int oldConcurrentCompactionThread =
       IoTDBDescriptor.getInstance().getConfig().getConcurrentCompactionThread();
   int oldMaxCompactionCandidateFileNum =
-      IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
+      IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
 
   @Before
   public void setUp() throws IOException, WriteProcessException, MetadataException {
@@ -72,7 +72,7 @@ public class InnerCompactionSchedulerTest extends AbstractCompactionTest {
         .setConcurrentCompactionThread(oldConcurrentCompactionThread);
     IoTDBDescriptor.getInstance()
         .getConfig()
-        .setMaxCompactionCandidateFileNum(oldMaxCompactionCandidateFileNum);
+        .setMaxInnerCompactionCandidateFileNum(oldMaxCompactionCandidateFileNum);
     super.tearDown();
   }
 
@@ -81,7 +81,7 @@ public class InnerCompactionSchedulerTest extends AbstractCompactionTest {
     IoTDBDescriptor.getInstance().getConfig().setEnableSeqSpaceCompaction(true);
     IoTDBDescriptor.getInstance().getConfig().setEnableUnseqSpaceCompaction(true);
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(4);
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(4);
     IoTDBDescriptor.getInstance().getConfig().setTargetCompactionFileSize(1000000);
     createFiles(2, 2, 3, 100, 0, 0, 50, 50, false, true);
     registerTimeseriesInMManger(2, 3, false);
@@ -106,7 +106,7 @@ public class InnerCompactionSchedulerTest extends AbstractCompactionTest {
   @Test
   public void testFileSelector2() throws IOException, MetadataException, WriteProcessException {
     IoTDBDescriptor.getInstance().getConfig().setConcurrentCompactionThread(50);
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(50);
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(50);
     TsFileResourceList tsFileResources = new TsFileResourceList();
     createFiles(2, 2, 3, 100, 0, 0, 50, 50, false, true);
     createFiles(2, 3, 5, 50, 250, 250, 50, 50, false, true);
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionConfigRestorer.java b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionConfigRestorer.java
index a545624..5fe1d2e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionConfigRestorer.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/CompactionConfigRestorer.java
@@ -37,7 +37,8 @@ public class CompactionConfigRestorer {
   private long targetChunkPointNum = 100000L;
   private long chunkSizeLowerBoundInCompaction = 128L;
   private long chunkPointNumLowerBoundInCompaction = 100L;
-  private int maxCompactionCandidateFileNum = 30;
+  private int maxInnerCompactionCandidateFileNum = 30;
+  private int maxCrossCompactionCandidateFileNum = 1000;
   private int concurrentCompactionThread = 10;
   private long compactionScheduleIntervalInMs = 60000L;
   private long compactionSubmissionIntervalInMs = 60000L;
@@ -58,7 +59,8 @@ public class CompactionConfigRestorer {
     config.setTargetChunkPointNum(targetChunkPointNum);
     config.setChunkSizeLowerBoundInCompaction(chunkSizeLowerBoundInCompaction);
     config.setChunkPointNumLowerBoundInCompaction(chunkPointNumLowerBoundInCompaction);
-    config.setMaxCompactionCandidateFileNum(maxCompactionCandidateFileNum);
+    config.setMaxInnerCompactionCandidateFileNum(maxInnerCompactionCandidateFileNum);
+    config.setMaxCrossCompactionCandidateFileNum(maxCrossCompactionCandidateFileNum);
     config.setConcurrentCompactionThread(concurrentCompactionThread);
     config.setCompactionScheduleIntervalInMs(compactionScheduleIntervalInMs);
     config.setCompactionSubmissionIntervalInMs(compactionSubmissionIntervalInMs);
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 f18d81c..7249cf2 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
@@ -637,8 +637,8 @@ public class StorageGroupProcessorTest {
       throws WriteProcessException, QueryProcessException, IllegalPathException,
           TriggerExecutionException {
     int originCandidateFileNum =
-        IoTDBDescriptor.getInstance().getConfig().getMaxCompactionCandidateFileNum();
-    IoTDBDescriptor.getInstance().getConfig().setMaxCompactionCandidateFileNum(9);
+        IoTDBDescriptor.getInstance().getConfig().getMaxInnerCompactionCandidateFileNum();
+    IoTDBDescriptor.getInstance().getConfig().setMaxInnerCompactionCandidateFileNum(9);
     boolean originEnableSeqSpaceCompaction =
         IoTDBDescriptor.getInstance().getConfig().isEnableSeqSpaceCompaction();
     boolean originEnableUnseqSpaceCompaction =
@@ -696,7 +696,7 @@ public class StorageGroupProcessorTest {
     }
     IoTDBDescriptor.getInstance()
         .getConfig()
-        .setMaxCompactionCandidateFileNum(originCandidateFileNum);
+        .setMaxInnerCompactionCandidateFileNum(originCandidateFileNum);
     IoTDBDescriptor.getInstance()
         .getConfig()
         .setEnableSeqSpaceCompaction(originEnableSeqSpaceCompaction);