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

xingtanzjr 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 631904d48f1 [IOTDB-5859]Compaction error when using Version as first 
sort dimension (#9817)
631904d48f1 is described below

commit 631904d48f1fffb70fce2a9bef9db2cdee725ea8
Author: 周沛辰 <[email protected]>
AuthorDate: Mon May 22 15:40:14 2023 +0800

    [IOTDB-5859]Compaction error when using Version as first sort dimension 
(#9817)
---
 .../execute/utils/MultiTsFileDeviceIterator.java   |  13 ++-
 .../db/engine/storagegroup/TsFileResource.java     |  23 +++--
 .../db/engine/storagegroup/TsFileResourceList.java |  62 ++++++------
 .../engine/compaction/AbstractCompactionTest.java  |  53 +++++++---
 .../ReadPointCompactionPerformerTest.java          |  16 ++-
 .../cross/CrossSpaceCompactionExceptionTest.java   |   5 +-
 .../RewriteCrossSpaceCompactionRecoverTest.java    |  10 +-
 ...eCrossSpaceCompactionWithFastPerformerTest.java |  21 +++-
 ...sSpaceCompactionWithReadPointPerformerTest.java |  21 +++-
 .../SizeTieredCompactionRecoverTest.java           |  52 ++++++----
 .../utils/MultiTsFileDeviceIteratorTest.java       |  14 +++
 .../storagegroup/TsFileResourceListTest.java       | 110 +++++++++++++++++++++
 12 files changed, 308 insertions(+), 92 deletions(-)

diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/utils/MultiTsFileDeviceIterator.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/utils/MultiTsFileDeviceIterator.java
index 6e66ac53316..7e2484e0d71 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/utils/MultiTsFileDeviceIterator.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/compaction/execute/utils/MultiTsFileDeviceIterator.java
@@ -59,14 +59,15 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
   private final Map<TsFileResource, List<Modification>> modificationCache = 
new HashMap<>();
   private Pair<String, Boolean> currentDevice = null;
 
-  /** Used for inner space compaction. */
+  /** Used for compaction with read chunk performer. */
   public MultiTsFileDeviceIterator(List<TsFileResource> tsFileResources) 
throws IOException {
     this.tsFileResourcesSortedByDesc = new ArrayList<>(tsFileResources);
     this.tsFileResourcesSortedByAsc = new ArrayList<>(tsFileResources);
     // sort the files from the oldest to the newest
     Collections.sort(this.tsFileResourcesSortedByAsc, 
TsFileResource::compareFileName);
     // sort the files from the newest to the oldest
-    Collections.sort(this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileNameByDesc);
+    Collections.sort(
+        this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileCreationOrderByDesc);
     try {
       for (TsFileResource tsFileResource : this.tsFileResourcesSortedByDesc) {
         TsFileSequenceReader reader = new 
TsFileSequenceReader(tsFileResource.getTsFilePath());
@@ -83,13 +84,14 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     }
   }
 
-  /** Used for cross space compaction with read point performer. */
+  /** Used for compaction with read point performer. */
   public MultiTsFileDeviceIterator(
       List<TsFileResource> seqResources, List<TsFileResource> unseqResources) 
throws IOException {
     this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources);
     tsFileResourcesSortedByDesc.addAll(unseqResources);
     // sort the files from the newest to the oldest
-    Collections.sort(this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileNameByDesc);
+    Collections.sort(
+        this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileCreationOrderByDesc);
     for (TsFileResource tsFileResource : tsFileResourcesSortedByDesc) {
       TsFileSequenceReader reader =
           FileReaderManager.getInstance().get(tsFileResource.getTsFilePath(), 
true);
@@ -107,7 +109,8 @@ public class MultiTsFileDeviceIterator implements 
AutoCloseable {
     this.tsFileResourcesSortedByDesc = new ArrayList<>(seqResources);
     tsFileResourcesSortedByDesc.addAll(unseqResources);
     // sort tsfiles from the newest to the oldest
-    Collections.sort(this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileNameByDesc);
+    Collections.sort(
+        this.tsFileResourcesSortedByDesc, 
TsFileResource::compareFileCreationOrderByDesc);
     this.readerMap = readerMap;
     for (TsFileResource tsFileResource : tsFileResourcesSortedByDesc) {
       TsFileSequenceReader reader = new 
TsFileSequenceReader(tsFileResource.getTsFilePath());
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
index 6b03f3ddede..0e5949f41b4 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResource.java
@@ -1023,24 +1023,31 @@ public class TsFileResource {
   }
 
   /**
-   * Compare the name of TsFiles corresponding to the two {@link 
TsFileResource}.This method will
-   * first check whether the two names meet the standard naming 
specifications, and then compare
-   * version of two names.
+   * Compare the creation order of the files and sort them according to the 
version number from
+   * largest to smallest.This method will first check whether the two names 
meet the standard naming
+   * specifications, and then compare version of two names. Notice: This 
method is only used to
+   * compare the creation order of files, which is sorted directly according 
to version. If you want
+   * to compare the order of the content of the file, you must first sort by 
timestamp and then by
+   * version.
    *
    * @param o1 a {@link TsFileResource}
    * @param o2 a {@link TsFileResource}
-   * @return -1, if o1 is smaller than o2, 1 if bigger, 0 means o1 equals to 
o2 or do not meet the
-   *     naming specifications
+   * @return -1, if o1 is smaller than o2, 1 if bigger, 0 means o1 equals to o2
    */
-  public static int compareFileNameByDesc(TsFileResource o1, TsFileResource 
o2) {
+  public static int compareFileCreationOrderByDesc(TsFileResource o1, 
TsFileResource o2) {
     try {
       TsFileNameGenerator.TsFileName n1 =
           TsFileNameGenerator.getTsFileName(o1.getTsFile().getName());
       TsFileNameGenerator.TsFileName n2 =
           TsFileNameGenerator.getTsFileName(o2.getTsFile().getName());
-      return (int) (n2.getVersion() - n1.getVersion());
-    } catch (IOException e) {
+      long versionDiff = n2.getVersion() - n1.getVersion();
+      if (versionDiff != 0) {
+        return versionDiff < 0 ? -1 : 1;
+      }
       return 0;
+    } catch (IOException e) {
+      LOGGER.error("File name may not meet the standard naming 
specifications.", e);
+      throw new RuntimeException(e.getMessage());
     }
   }
 
diff --git 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
index a7c5ea8b3fc..4209d8531a3 100644
--- 
a/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
+++ 
b/server/src/main/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceList.java
@@ -143,43 +143,43 @@ public class TsFileResourceList implements 
List<TsFileResource> {
       return false;
     }
     if (tail == null) {
+      // empty list
       header = newNode;
       tail = newNode;
       count++;
     } else {
-      // find the position to insert of this node
-      // the list should be ordered by file timestamp
-      long versionOfNewNode =
-          
TsFileNameGenerator.getTsFileName(newNode.getTsFile().getName()).getVersion();
-
-      if 
(TsFileNameGenerator.getTsFileName(header.getTsFile().getName()).getVersion()
-          > versionOfNewNode) {
-        // the timestamp of head node is greater than the new node
-        // insert it before the head
-        insertBefore(header, newNode);
-      } else if 
(TsFileNameGenerator.getTsFileName(tail.getTsFile().getName()).getVersion()
-          < versionOfNewNode) {
-        // the timestamp of new node is greater than the tail node
-        // insert it after the tail
+      TsFileNameGenerator.TsFileName newTsFileName =
+          TsFileNameGenerator.getTsFileName(newNode.getTsFile().getName());
+      long timestampOfNewNode = newTsFileName.getTime();
+      long versionOfNewNode = newTsFileName.getVersion();
+
+      // find the position to insert, the list should be ordered by file 
timestamp. If timestamp is
+      // equal to each other, then list should be ordered by file version.
+      boolean isNewNodeAtTail = true;
+      TsFileResource currNode = header;
+      while (currNode != null) {
+        TsFileNameGenerator.TsFileName currTsFileName =
+            TsFileNameGenerator.getTsFileName(currNode.getTsFile().getName());
+        if (timestampOfNewNode == currTsFileName.getTime()
+            && versionOfNewNode < currTsFileName.getVersion()) {
+          // the timestamp of new node is equal to the current node and the 
version of new node is
+          // less than current node, then insert new node before the current 
node
+          isNewNodeAtTail = false;
+          break;
+        } else if (timestampOfNewNode < currTsFileName.getTime()) {
+          // the timestamp of new node is less than the current node, insert 
new node before then
+          // current node
+          isNewNodeAtTail = false;
+          break;
+        }
+        currNode = currNode.next;
+      }
+
+      // insert new node
+      if (isNewNodeAtTail) {
         insertAfter(tail, newNode);
       } else {
-        // the timestamp of new node is between the timestamp of head and tail 
node
-        // find the first node whose timestamp is greater than new node
-        // and insert the new node before this node
-        TsFileResource currNode = header;
-        while (currNode.next != null) {
-          if 
(TsFileNameGenerator.getTsFileName(currNode.getTsFile().getName()).getVersion()
-              > versionOfNewNode) {
-            break;
-          }
-          currNode = currNode.next;
-        }
-        if 
(TsFileNameGenerator.getTsFileName(currNode.getTsFile().getName()).getVersion()
-            < versionOfNewNode) {
-          LOGGER.error("Cannot find an appropriate place to insert {}", 
newNode);
-        } else {
-          insertBefore(currNode, newNode);
-        }
+        insertBefore(currNode, newNode);
       }
     }
     return true;
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/AbstractCompactionTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/AbstractCompactionTest.java
index 483670ada40..49420837986 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/AbstractCompactionTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/AbstractCompactionTest.java
@@ -32,11 +32,13 @@ import 
org.apache.iotdb.db.engine.compaction.execute.utils.reader.SeriesDataBloc
 import org.apache.iotdb.db.engine.compaction.schedule.CompactionTaskManager;
 import org.apache.iotdb.db.engine.compaction.utils.CompactionConfigRestorer;
 import 
org.apache.iotdb.db.engine.compaction.utils.CompactionFileGeneratorUtils;
+import org.apache.iotdb.db.engine.modification.ModificationFile;
 import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResourceStatus;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceContext;
+import org.apache.iotdb.db.protocol.rest.StringUtil;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.tools.validate.TsFileValidationTool;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
@@ -70,6 +72,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import static org.apache.iotdb.commons.conf.IoTDBConstant.FILE_NAME_SEPARATOR;
 import static 
org.apache.iotdb.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR;
 import static org.junit.Assert.fail;
 
@@ -86,6 +89,13 @@ public class AbstractCompactionTest {
   protected int maxDeviceNum = 25;
   protected int maxMeasurementNum = 25;
 
+  private long[] timestamp = {0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 
6, 7, 7, 7};
+  // seq version is not in order
+  private int[] seqVersion = {18, 19, 0, 1, 14, 15, 16, 2, 3, 4, 12, 13, 5, 6, 
9, 10, 11, 7, 8, 17};
+  private int[] unseqVersion = {
+    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 
38, 39
+  };
+
   private static final long oldTargetChunkSize =
       IoTDBDescriptor.getInstance().getConfig().getTargetChunkSize();
 
@@ -146,11 +156,14 @@ public class AbstractCompactionTest {
 
   private int fileVersion = 0;
 
+  private int fileCount = 0;
+
   protected TsFileManager tsFileManager =
       new TsFileManager(COMPACTION_TEST_SG, "0", STORAGE_GROUP_DIR.getPath());
 
   public void setUp()
       throws IOException, WriteProcessException, MetadataException, 
InterruptedException {
+    fileCount = 0;
     if (!SEQ_DIRS.exists()) {
       Assert.assertTrue(SEQ_DIRS.mkdirs());
     }
@@ -195,11 +208,9 @@ public class AbstractCompactionTest {
       boolean isSeq)
       throws IOException, WriteProcessException, MetadataException {
     for (int i = 0; i < fileNum; i++) {
+      fileVersion = isSeq ? seqVersion[fileCount] : unseqVersion[fileCount];
       String fileName =
-          System.currentTimeMillis()
-              + FilePathUtils.FILE_NAME_SEPARATOR
-              + fileVersion++
-              + "-0-0.tsfile";
+          timestamp[fileCount++] + FilePathUtils.FILE_NAME_SEPARATOR + 
fileVersion + "-0-0.tsfile";
       String filePath;
       if (isSeq) {
         filePath = SEQ_DIRS.getPath() + File.separator + fileName;
@@ -269,11 +280,9 @@ public class AbstractCompactionTest {
       throws IOException, WriteProcessException {
     String value = isSeq ? "seqTestValue" : "unseqTestValue";
     for (int i = 0; i < fileNum; i++) {
+      fileVersion = isSeq ? seqVersion[fileCount] : unseqVersion[fileCount];
       String fileName =
-          System.currentTimeMillis()
-              + FilePathUtils.FILE_NAME_SEPARATOR
-              + fileVersion++
-              + "-0-0.tsfile";
+          timestamp[fileCount++] + FilePathUtils.FILE_NAME_SEPARATOR + 
fileVersion + "-0-0.tsfile";
       String filePath;
       if (isSeq) {
         filePath = SEQ_DIRS.getPath() + File.separator + fileName;
@@ -575,11 +584,9 @@ public class AbstractCompactionTest {
   }
 
   protected TsFileResource createEmptyFileAndResource(boolean isSeq) {
+    fileVersion = isSeq ? seqVersion[fileCount] : unseqVersion[fileCount];
     String fileName =
-        System.currentTimeMillis()
-            + FilePathUtils.FILE_NAME_SEPARATOR
-            + fileVersion
-            + "-0-0.tsfile";
+        timestamp[fileCount++] + FilePathUtils.FILE_NAME_SEPARATOR + 
fileVersion + "-0-0.tsfile";
     String filePath;
     if (isSeq) {
       filePath = SEQ_DIRS.getPath() + File.separator + fileName;
@@ -587,7 +594,7 @@ public class AbstractCompactionTest {
       filePath = UNSEQ_DIRS.getPath() + File.separator + fileName;
     }
     TsFileResource resource = new TsFileResource(new File(filePath));
-    resource.updatePlanIndexes(fileVersion++);
+    resource.updatePlanIndexes(fileVersion);
     resource.setStatus(TsFileResourceStatus.NORMAL);
     return resource;
   }
@@ -595,4 +602,24 @@ public class AbstractCompactionTest {
   protected void setDataType(TSDataType dataType) {
     this.dataType = dataType;
   }
+
+  protected void resetFileName(TsFileResource resource, int version) {
+    // rename TsFile
+    File file = resource.getTsFile();
+    String[] fileInfo = file.getPath().split(FILE_NAME_SEPARATOR);
+    fileInfo[1] = String.valueOf(version);
+    String newFileName = StringUtil.join(fileInfo, FILE_NAME_SEPARATOR);
+    file.renameTo(new File(newFileName));
+
+    resource.setVersion(version);
+    resource.setFile(new File(newFileName));
+
+    // rename resource file
+    file = new File(resource.getTsFilePath() + TsFileResource.RESOURCE_SUFFIX);
+    file.renameTo(new File(newFileName + TsFileResource.RESOURCE_SUFFIX));
+
+    // rename mods file
+    file = new File(resource.getTsFilePath() + ModificationFile.FILE_SUFFIX);
+    file.renameTo(new File(newFileName + ModificationFile.FILE_SUFFIX));
+  }
 }
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/ReadPointCompactionPerformerTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/ReadPointCompactionPerformerTest.java
index a50533d809d..d1441d3f2dd 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/ReadPointCompactionPerformerTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/ReadPointCompactionPerformerTest.java
@@ -1718,7 +1718,12 @@ public class ReadPointCompactionPerformerTest extends 
AbstractCompactionTest {
                 schemas);
         IDataBlockReader tsBlockReader =
             new SeriesDataBlockReader(
-                path, EnvironmentUtils.TEST_QUERY_FI_CONTEXT, seqResources, 
unseqResources, true);
+                path,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
+                seqResources,
+                unseqResources,
+                true);
         int count = 0;
         while (tsBlockReader.hasNextBatch()) {
           TsBlock block = tsBlockReader.nextBatch();
@@ -4243,7 +4248,8 @@ public class ReadPointCompactionPerformerTest extends 
AbstractCompactionTest {
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 targetResources,
                 new ArrayList<>(),
                 true);
@@ -4382,7 +4388,8 @@ public class ReadPointCompactionPerformerTest extends 
AbstractCompactionTest {
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 targetResources,
                 new ArrayList<>(),
                 true);
@@ -5463,7 +5470,8 @@ public class ReadPointCompactionPerformerTest extends 
AbstractCompactionTest {
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 targetResources,
                 new ArrayList<>(),
                 true);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/CrossSpaceCompactionExceptionTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/CrossSpaceCompactionExceptionTest.java
index c9eeb45177e..615999f8a9c 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/CrossSpaceCompactionExceptionTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/CrossSpaceCompactionExceptionTest.java
@@ -619,8 +619,9 @@ public class CrossSpaceCompactionExceptionTest extends 
AbstractCompactionTest {
       Assert.assertFalse(resource.getCompactionModFile().exists());
     }
     // the first target file should be deleted after compaction, the others 
still exist
-    for (TsFileResource resource : targetResources) {
-      if (resource.getVersion() == 0) {
+    for (int i = 0; i < targetResources.size(); i++) {
+      TsFileResource resource = targetResources.get(i);
+      if (i == 0) {
         Assert.assertFalse(resource.getTsFile().exists());
         Assert.assertFalse(resource.resourceFileExists());
       } else {
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionRecoverTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionRecoverTest.java
index b54b57d7ddb..8310dc56f8b 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionRecoverTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionRecoverTest.java
@@ -725,8 +725,9 @@ public class RewriteCrossSpaceCompactionRecoverTest extends 
AbstractCompactionTe
       Assert.assertFalse(resource.getCompactionModFile().exists());
     }
     // the first target file should be deleted after recovery
-    for (TsFileResource resource : targetResources) {
-      if (resource.getVersion() == 0) {
+    for (int i = 0; i < targetResources.size(); i++) {
+      TsFileResource resource = targetResources.get(i);
+      if (i == 0) {
         Assert.assertFalse(resource.getTsFile().exists());
         Assert.assertFalse(resource.resourceFileExists());
       } else {
@@ -808,8 +809,9 @@ public class RewriteCrossSpaceCompactionRecoverTest extends 
AbstractCompactionTe
       Assert.assertFalse(resource.getCompactionModFile().exists());
     }
     // the first target file should be deleted after recovery
-    for (TsFileResource resource : targetResources) {
-      if (resource.getVersion() == 0) {
+    for (int i = 0; i < targetResources.size(); i++) {
+      TsFileResource resource = targetResources.get(i);
+      if (i == 0) {
         Assert.assertFalse(resource.getTsFile().exists());
         Assert.assertFalse(resource.resourceFileExists());
       } else {
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithFastPerformerTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithFastPerformerTest.java
index 5528caaaeba..cd974b1c134 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithFastPerformerTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithFastPerformerTest.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
 import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceContext;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.wal.recover.WALRecoverManager;
@@ -161,7 +162,12 @@ public class 
RewriteCrossSpaceCompactionWithFastPerformerTest extends AbstractCo
                 schemas);
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
-                path, EnvironmentUtils.TEST_QUERY_FI_CONTEXT, seqResources, 
unseqResources, true);
+                path,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
+                seqResources,
+                unseqResources,
+                true);
         int count = 0;
         while (tsFilesReader.hasNextBatch()) {
           TsBlock batchData = tsFilesReader.nextBatch();
@@ -258,7 +264,8 @@ public class 
RewriteCrossSpaceCompactionWithFastPerformerTest extends AbstractCo
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 tsFileManager.getTsFileList(true),
                 new ArrayList<>(),
                 true);
@@ -383,7 +390,12 @@ public class 
RewriteCrossSpaceCompactionWithFastPerformerTest extends AbstractCo
                 schemas);
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
-                path, EnvironmentUtils.TEST_QUERY_FI_CONTEXT, seqResources, 
unseqResources, true);
+                path,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
+                seqResources,
+                unseqResources,
+                true);
         int count = 0;
         while (tsFilesReader.hasNextBatch()) {
           TsBlock batchData = tsFilesReader.nextBatch();
@@ -481,7 +493,8 @@ public class 
RewriteCrossSpaceCompactionWithFastPerformerTest extends AbstractCo
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 tsFileManager.getTsFileList(true),
                 new ArrayList<>(),
                 true);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
index 088dff33df0..9a3cc04bb51 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/cross/RewriteCrossSpaceCompactionWithReadPointPerformerTest.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
 import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceContext;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.wal.recover.WALRecoverManager;
@@ -161,7 +162,12 @@ public class 
RewriteCrossSpaceCompactionWithReadPointPerformerTest extends Abstr
                 schemas);
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
-                path, EnvironmentUtils.TEST_QUERY_FI_CONTEXT, seqResources, 
unseqResources, true);
+                path,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
+                seqResources,
+                unseqResources,
+                true);
         int count = 0;
         while (tsFilesReader.hasNextBatch()) {
           TsBlock batchData = tsFilesReader.nextBatch();
@@ -258,7 +264,8 @@ public class 
RewriteCrossSpaceCompactionWithReadPointPerformerTest extends Abstr
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 tsFileManager.getTsFileList(true),
                 new ArrayList<>(),
                 true);
@@ -383,7 +390,12 @@ public class 
RewriteCrossSpaceCompactionWithReadPointPerformerTest extends Abstr
                 schemas);
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
-                path, EnvironmentUtils.TEST_QUERY_FI_CONTEXT, seqResources, 
unseqResources, true);
+                path,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
+                seqResources,
+                unseqResources,
+                true);
         int count = 0;
         while (tsFilesReader.hasNextBatch()) {
           TsBlock batchData = tsFilesReader.nextBatch();
@@ -481,7 +493,8 @@ public class 
RewriteCrossSpaceCompactionWithReadPointPerformerTest extends Abstr
         IDataBlockReader tsFilesReader =
             new SeriesDataBlockReader(
                 path,
-                EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+                
FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                    EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
                 tsFileManager.getTsFileList(true),
                 new ArrayList<>(),
                 true);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTest.java
index 5f12ae5a0d2..859b21abe74 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/inner/sizetiered/SizeTieredCompactionRecoverTest.java
@@ -41,6 +41,7 @@ import org.apache.iotdb.db.engine.storagegroup.TsFileManager;
 import org.apache.iotdb.db.engine.storagegroup.TsFileNameGenerator;
 import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
 import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.mpp.execution.fragment.FragmentInstanceContext;
 import org.apache.iotdb.db.query.control.FileReaderManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.SchemaTestUtils;
@@ -105,7 +106,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -191,7 +193,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -222,7 +225,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -297,7 +301,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -328,7 +333,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -405,7 +411,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -436,7 +443,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -508,7 +516,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true).subList(3, 6),
             new ArrayList<>(),
             true);
@@ -757,7 +766,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -820,7 +830,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true).subList(0, 5),
             new ArrayList<>(),
             true);
@@ -851,7 +862,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -907,7 +919,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -939,7 +952,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -997,7 +1011,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -1039,7 +1054,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -1079,7 +1095,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
@@ -1134,7 +1151,8 @@ public class SizeTieredCompactionRecoverTest extends 
AbstractInnerSpaceCompactio
     IDataBlockReader tsFilesReader =
         new SeriesDataBlockReader(
             path,
-            EnvironmentUtils.TEST_QUERY_FI_CONTEXT,
+            FragmentInstanceContext.createFragmentInstanceContextForCompaction(
+                EnvironmentUtils.TEST_QUERY_CONTEXT.getQueryId()),
             tsFileManager.getTsFileList(true),
             new ArrayList<>(),
             true);
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/MultiTsFileDeviceIteratorTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/MultiTsFileDeviceIteratorTest.java
index adeb64d99cc..d6da1af858b 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/MultiTsFileDeviceIteratorTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/compaction/utils/MultiTsFileDeviceIteratorTest.java
@@ -292,6 +292,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
     deleteTimeseriesInMManager(seriesPaths);
 
     createFiles(2, 10, 5, 100, 2000, 2000, 50, 50, true, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
 
     // sort the deviceId in lexicographical order from small to large
     List<String> deviceIds = new ArrayList<>();
@@ -347,6 +349,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with aligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, true, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
@@ -491,6 +495,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with nonAligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, false, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
@@ -634,6 +640,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with aligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, true, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
@@ -777,6 +785,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with nonAligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, false, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
@@ -930,6 +940,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with aligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, true, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
@@ -1075,6 +1087,8 @@ public class MultiTsFileDeviceIteratorTest extends 
AbstractCompactionTest {
 
     // generate d0 ~ d9 with nonAligned property
     createFiles(2, 10, 15, 100, 2000, 2000, 50, 50, false, true);
+    resetFileName(seqResources.get(7), 100);
+    resetFileName(seqResources.get(8), 101);
     tsFileManager.addAll(seqResources, true);
 
     // sort the deviceId in lexicographical order from small to large
diff --git 
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceListTest.java
 
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceListTest.java
index 15edccca8e3..7c447eb9049 100644
--- 
a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceListTest.java
+++ 
b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/TsFileResourceListTest.java
@@ -25,6 +25,7 @@ import org.junit.Assert;
 import org.junit.Test;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -212,4 +213,113 @@ public class TsFileResourceListTest {
         tsFileResourceList.getHeader(), 
tsFileResources.get(tsFileResources.size() - 1));
     Assert.assertEquals(tsFileResourceList.getTail(), tsFileResources.get(0));
   }
+
+  /** Seq files: 1-1, 1-5, 1-6, 2-4, 3-3, 4-7, 4-9, 5-8 */
+  @Test
+  public void testKeepOrderInsertWithSameTimestampAndDifferentVersion() throws 
IOException {
+    List<TsFileResource> seqResources = new ArrayList<>();
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 1, 1, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 1, 5, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 1, 6, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 2, 4, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 3, 3, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 4, 7, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 4, 9, 0, 0))));
+    seqResources.add(
+        new TsFileResource(
+            new File(
+                TsFileNameGenerator.generateNewTsFilePath(
+                    TestConstant.BASE_OUTPUT_PATH, 5, 8, 0, 0))));
+
+    TsFileResourceList tsFileResourceList = new TsFileResourceList();
+    tsFileResourceList.keepOrderInsert(seqResources.get(4));
+    tsFileResourceList.keepOrderInsert(seqResources.get(3));
+    tsFileResourceList.keepOrderInsert(seqResources.get(5));
+    tsFileResourceList.keepOrderInsert(seqResources.get(1));
+    tsFileResourceList.keepOrderInsert(seqResources.get(0));
+    tsFileResourceList.keepOrderInsert(seqResources.get(2));
+    tsFileResourceList.keepOrderInsert(seqResources.get(6));
+    tsFileResourceList.keepOrderInsert(seqResources.get(7));
+    Assert.assertEquals(seqResources, tsFileResourceList.getArrayList());
+
+    for (TsFileResource resource : seqResources) {
+      tsFileResourceList.remove(resource);
+    }
+    tsFileResourceList.keepOrderInsert(seqResources.get(0));
+    tsFileResourceList.keepOrderInsert(seqResources.get(4));
+    tsFileResourceList.keepOrderInsert(seqResources.get(5));
+    tsFileResourceList.keepOrderInsert(seqResources.get(7));
+    tsFileResourceList.keepOrderInsert(seqResources.get(2));
+    tsFileResourceList.keepOrderInsert(seqResources.get(1));
+    tsFileResourceList.keepOrderInsert(seqResources.get(3));
+    tsFileResourceList.keepOrderInsert(seqResources.get(6));
+    Assert.assertEquals(seqResources, tsFileResourceList.getArrayList());
+
+    for (TsFileResource resource : seqResources) {
+      tsFileResourceList.remove(resource);
+    }
+    tsFileResourceList.keepOrderInsert(seqResources.get(7));
+    tsFileResourceList.keepOrderInsert(seqResources.get(1));
+    tsFileResourceList.keepOrderInsert(seqResources.get(5));
+    tsFileResourceList.keepOrderInsert(seqResources.get(6));
+    tsFileResourceList.keepOrderInsert(seqResources.get(2));
+    tsFileResourceList.keepOrderInsert(seqResources.get(4));
+    tsFileResourceList.keepOrderInsert(seqResources.get(3));
+    tsFileResourceList.keepOrderInsert(seqResources.get(0));
+    Assert.assertEquals(seqResources, tsFileResourceList.getArrayList());
+
+    for (TsFileResource resource : seqResources) {
+      tsFileResourceList.remove(resource);
+    }
+    tsFileResourceList.keepOrderInsert(seqResources.get(0));
+    tsFileResourceList.keepOrderInsert(seqResources.get(1));
+    tsFileResourceList.keepOrderInsert(seqResources.get(2));
+    tsFileResourceList.keepOrderInsert(seqResources.get(3));
+    tsFileResourceList.keepOrderInsert(seqResources.get(4));
+    tsFileResourceList.keepOrderInsert(seqResources.get(5));
+    tsFileResourceList.keepOrderInsert(seqResources.get(6));
+    tsFileResourceList.keepOrderInsert(seqResources.get(7));
+    Assert.assertEquals(seqResources, tsFileResourceList.getArrayList());
+
+    for (TsFileResource resource : seqResources) {
+      tsFileResourceList.remove(resource);
+    }
+    tsFileResourceList.keepOrderInsert(seqResources.get(7));
+    tsFileResourceList.keepOrderInsert(seqResources.get(6));
+    tsFileResourceList.keepOrderInsert(seqResources.get(5));
+    tsFileResourceList.keepOrderInsert(seqResources.get(4));
+    tsFileResourceList.keepOrderInsert(seqResources.get(3));
+    tsFileResourceList.keepOrderInsert(seqResources.get(2));
+    tsFileResourceList.keepOrderInsert(seqResources.get(1));
+    tsFileResourceList.keepOrderInsert(seqResources.get(0));
+    Assert.assertEquals(seqResources, tsFileResourceList.getArrayList());
+  }
 }


Reply via email to