You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by lt...@apache.org on 2019/08/30 12:38:02 UTC

[incubator-iotdb] 03/03: add sync file manager test

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

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

commit 32e2ff8af100a3e41fceff0ecf55f984fdfc8657
Author: lta <li...@163.com>
AuthorDate: Fri Aug 30 20:22:19 2019 +0800

    add sync file manager test
---
 .../iotdb/db/sync/receiver/load/FileLoader.java    |   4 +-
 .../receiver/recover/SyncReceiverLogAnalyzer.java  |   2 +-
 .../db/sync/receiver/transfer/SyncServiceImpl.java |   3 +-
 .../db/sync/sender/manage/SyncFileManager.java     |  17 +-
 .../sync/sender/recover/SyncSenderLogAnalyzer.java |   2 +-
 .../sync/sender/transfer/DataTransferManager.java  |   6 +-
 .../iotdb/db/sync/sender/SingleClientSyncTest.java | 596 ---------------------
 .../iotdb/db/sync/sender/SyncFileManagerTest.java  | 374 -------------
 .../db/sync/sender/manage/SyncFileManagerTest.java | 276 ++++++++++
 9 files changed, 297 insertions(+), 983 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoader.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoader.java
index d834487..19f7909 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoader.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/FileLoader.java
@@ -144,8 +144,8 @@ public class FileLoader implements IFileLoader {
   public void cleanUp() {
     try {
       loadLog.close();
-      new File(syncFolderPath, Constans.SYNC_LOG_NAME).deleteOnExit();
-      new File(syncFolderPath, Constans.LOAD_LOG_NAME).deleteOnExit();
+      new File(syncFolderPath, Constans.SYNC_LOG_NAME).delete();
+      new File(syncFolderPath, Constans.LOAD_LOG_NAME).delete();
       FileLoaderManager.getInstance().removeFileLoader(senderName);
     } catch (IOException e) {
       LOGGER.error("Can not clean up sync resource.", e);
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzer.java
index 4ed7284..53a44dd 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/recover/SyncReceiverLogAnalyzer.java
@@ -66,7 +66,7 @@ public class SyncReceiverLogAnalyzer implements ISyncReceiverLogAnalyzer {
   private boolean recover(File senderFolder) throws IOException {
     // check the state
     if (!new File(senderFolder, Constans.SYNC_LOG_NAME).exists()) {
-      new File(senderFolder, Constans.LOAD_LOG_NAME).deleteOnExit();
+      new File(senderFolder, Constans.LOAD_LOG_NAME).delete();
       return true;
     }
     if (FileLoaderManager.getInstance().containsFileLoader(senderFolder.getName())) {
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/transfer/SyncServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/transfer/SyncServiceImpl.java
index 8d2d61c..12ab86b 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/transfer/SyncServiceImpl.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/transfer/SyncServiceImpl.java
@@ -129,7 +129,8 @@ public class SyncServiceImpl implements SyncService.Iface {
    * Init file path and clear data if last sync process failed.
    */
   private void initPath() throws DiskSpaceInsufficientException {
-    String dataDir = DirectoryManager.getInstance().getNextFolderForSequenceFile();
+    String dataDir = new File(DirectoryManager.getInstance().getNextFolderForSequenceFile())
+        .getParentFile().getAbsolutePath();
     syncFolderPath
         .set(FilePathUtils.regularizePath(dataDir) + Constans.SYNC_RECEIVER + File.separatorChar
             + senderName.get());
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManager.java b/server/src/main/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManager.java
index 23af20c..89ea93d 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManager.java
@@ -62,8 +62,8 @@ public class SyncFileManager implements ISyncFileManager {
   private Map<String, Set<File>> deletedFilesMap;
 
   /**
-   * Key is storage group, value is the valid set of new tsfiles which need to be synced to
-   * receiver end in the sg.
+   * Key is storage group, value is the valid set of new tsfiles which need to be synced to receiver
+   * end in the sg.
    */
   private Map<String, Set<File>> toBeSyncedFilesMap;
 
@@ -79,8 +79,12 @@ public class SyncFileManager implements ISyncFileManager {
   public void getCurrentLocalFiles(String dataDir) {
     LOGGER.info("Start to get current local files in data folder {}", dataDir);
 
+    currentSealedLocalFilesMap = new HashMap<>();
     // get all files in data dir sequence folder
     Map<String, Set<File>> currentAllLocalFiles = new HashMap<>();
+    if (!new File(dataDir + File.separatorChar + IoTDBConstant.SEQUENCE_FLODER_NAME).exists()) {
+      return;
+    }
     File[] allSGFolders = new File(
         dataDir + File.separatorChar + IoTDBConstant.SEQUENCE_FLODER_NAME)
         .listFiles();
@@ -93,7 +97,6 @@ public class SyncFileManager implements ISyncFileManager {
     }
 
     // get sealed tsfiles
-    currentSealedLocalFilesMap = new HashMap<>();
     for (Entry<String, Set<File>> entry : currentAllLocalFiles.entrySet()) {
       String sgName = entry.getKey();
       currentSealedLocalFilesMap.putIfAbsent(sgName, new HashSet<>());
@@ -115,13 +118,13 @@ public class SyncFileManager implements ISyncFileManager {
     LOGGER.info("Start to get last local files from last local file info {}",
         lastLocalFileInfo.getAbsoluteFile());
     lastLocalFilesMap = new HashMap<>();
-    if(!lastLocalFileInfo.exists()){
+    if (!lastLocalFileInfo.exists()) {
       return;
     }
     try (BufferedReader reader = new BufferedReader(new FileReader(lastLocalFileInfo))) {
       String fileName;
       while ((fileName = reader.readLine()) != null) {
-        String sgName = new File(fileName).getParent();
+        String sgName = new File(fileName).getParentFile().getName();
         allSG.add(sgName);
         lastLocalFilesMap.putIfAbsent(sgName, new HashSet<>());
         lastLocalFilesMap.get(sgName).add(new File(fileName));
@@ -152,6 +155,10 @@ public class SyncFileManager implements ISyncFileManager {
     }
   }
 
+  public Map<String, Set<File>> getCurrentSealedLocalFilesMap() {
+    return currentSealedLocalFilesMap;
+  }
+
   public Map<String, Set<File>> getLastLocalFilesMap() {
     return lastLocalFilesMap;
   }
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/sender/recover/SyncSenderLogAnalyzer.java b/server/src/main/java/org/apache/iotdb/db/sync/sender/recover/SyncSenderLogAnalyzer.java
index 3acfd66..60d45ed 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/sender/recover/SyncSenderLogAnalyzer.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/sender/recover/SyncSenderLogAnalyzer.java
@@ -109,7 +109,7 @@ public class SyncSenderLogAnalyzer implements ISyncSenderLogAnalyzer {
     } catch (IOException e) {
       LOGGER.error("Can not clear sync log {}", syncLogFile.getAbsoluteFile(), e);
     }
-    lastLocalFile.deleteOnExit();
+    lastLocalFile.delete();
     currentLocalFile.renameTo(lastLocalFile);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/sender/transfer/DataTransferManager.java b/server/src/main/java/org/apache/iotdb/db/sync/sender/transfer/DataTransferManager.java
index ec75c0a..4969e19 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/sender/transfer/DataTransferManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/sender/transfer/DataTransferManager.java
@@ -512,7 +512,7 @@ public class DataTransferManager implements IDataTransferManager {
             tsfile, e);
       } finally {
         if (snapshotFile != null) {
-          snapshotFile.deleteOnExit();
+          snapshotFile.delete();
         }
       }
     }
@@ -608,7 +608,7 @@ public class DataTransferManager implements IDataTransferManager {
     }
 
     // 2. Rename currentLocalFile to lastLocalFile
-    lastLocalFile.deleteOnExit();
+    lastLocalFile.delete();
     currentLocalFile.renameTo(lastLocalFile);
 
     // 3. delete snapshot directory
@@ -619,7 +619,7 @@ public class DataTransferManager implements IDataTransferManager {
     }
 
     // 4. delete sync log file
-    getSyncLogFile().deleteOnExit();
+    getSyncLogFile().delete();
   }
 
 
diff --git a/server/src/test/java/org/apache/iotdb/db/sync/sender/SingleClientSyncTest.java b/server/src/test/java/org/apache/iotdb/db/sync/sender/SingleClientSyncTest.java
deleted file mode 100644
index 4340670..0000000
--- a/server/src/test/java/org/apache/iotdb/db/sync/sender/SingleClientSyncTest.java
+++ /dev/null
@@ -1,596 +0,0 @@
-///**
-// * Licensed to the Apache Software Foundation (ASF) under one
-// * or more contributor license agreements.  See the NOTICE file
-// * distributed with this work for additional information
-// * regarding copyright ownership.  The ASF licenses this file
-// * to you under the Apache License, Version 2.0 (the
-// * "License"); you may not use this file except in compliance
-// * with the License.  You may obtain a copy of the License at
-// *
-// *     http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing,
-// * software distributed under the License is distributed on an
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// * KIND, either express or implied.  See the License for the
-// * specific language governing permissions and limitations
-// * under the License.
-// */
-//package org.apache.iotdb.db.sync.sender;
-//
-//import static org.junit.Assert.fail;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import java.sql.Connection;
-//import java.sql.DriverManager;
-//import java.sql.ResultSet;
-//import java.sql.SQLException;
-//import java.sql.Statement;
-//import java.util.HashSet;
-//import java.util.Set;
-//import org.apache.iotdb.db.conf.IoTDBConfig;
-//import org.apache.iotdb.db.conf.IoTDBDescriptor;
-//import org.apache.iotdb.db.exception.StartupException;
-//import org.apache.iotdb.db.exception.SyncConnectionException;
-//import org.apache.iotdb.db.integration.Constant;
-//import org.apache.iotdb.db.service.IoTDB;
-//import org.apache.iotdb.db.sync.sender.conf.Constans;
-//import org.apache.iotdb.db.sync.sender.conf.SyncSenderConfig;
-//import org.apache.iotdb.db.sync.sender.conf.SyncSenderDescriptor;
-//import org.apache.iotdb.db.sync.sender.transfer.DataTransferManager;
-//import org.apache.iotdb.db.utils.EnvironmentUtils;
-//import org.apache.iotdb.jdbc.Config;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-///**
-// * The test is to run a complete sync function Before you run the test, make sure receiver has been
-// * cleaned up and inited.
-// */
-//public class SingleClientSyncTest {
-//
-//  DataTransferManager fileSenderImpl = DataTransferManager.getInstance();
-//  private IoTDBConfig conf = IoTDBDescriptor.getInstance().getConfig();
-//  private String serverIpTest = "192.168.130.7";
-//  private SyncSenderConfig config = SyncSenderDescriptor.getInstance().getConfig();
-//  private Set<String> dataSender = new HashSet<>();
-//  private Set<String> dataReceiver = new HashSet<>();
-//  private boolean success = true;
-//  private IoTDB deamon;
-//  private static final String[] sqls1 = new String[]{"SET STORAGE GROUP TO root.vehicle",
-//      "SET STORAGE GROUP TO root.test",
-//      "CREATE TIMESERIES root.vehicle.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "CREATE TIMESERIES root.vehicle.d0.s1 WITH DATATYPE=TEXT, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.vehicle.d1.s2 WITH DATATYPE=FLOAT, ENCODING=RLE",
-//      "CREATE TIMESERIES root.vehicle.d1.s3 WITH DATATYPE=BOOLEAN, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.test.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "CREATE TIMESERIES root.test.d0.s1 WITH DATATYPE=TEXT, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.test.d1.g0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "insert into root.vehicle.d0(timestamp,s0) values(10,100)",
-//      "insert into root.vehicle.d0(timestamp,s0,s1) values(12,101,'102')",
-//      "insert into root.vehicle.d0(timestamp,s1) values(19,'103')",
-//      "insert into root.vehicle.d1(timestamp,s2) values(11,104.0)",
-//      "insert into root.vehicle.d1(timestamp,s2,s3) values(15,105.0,true)",
-//      "insert into root.vehicle.d1(timestamp,s3) values(17,false)",
-//      "insert into root.vehicle.d0(timestamp,s0) values(20,1000)",
-//      "insert into root.vehicle.d0(timestamp,s0,s1) values(22,1001,'1002')",
-//      "insert into root.vehicle.d0(timestamp,s1) values(29,'1003')",
-//      "insert into root.vehicle.d1(timestamp,s2) values(21,1004.0)",
-//      "insert into root.vehicle.d1(timestamp,s2,s3) values(25,1005.0,true)",
-//      "insert into root.vehicle.d1(timestamp,s3) values(27,true)",
-//      "insert into root.test.d0(timestamp,s0) values(10,106)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(14,107,'108')",
-//      "insert into root.test.d0(timestamp,s1) values(16,'109')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(1,110)",
-//      "insert into root.test.d0(timestamp,s0) values(30,1006)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(34,1007,'1008')",
-//      "insert into root.test.d0(timestamp,s1) values(36,'1090')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(10,1100)", "merge", "flush",};
-//  private static final String[] sqls2 = new String[]{
-//      "insert into root.vehicle.d0(timestamp,s0) values(6,120)",
-//      "insert into root.vehicle.d0(timestamp,s0,s1) values(38,121,'122')",
-//      "insert into root.vehicle.d0(timestamp,s1) values(9,'123')",
-//      "insert into root.vehicle.d0(timestamp,s0) values(16,128)",
-//      "insert into root.vehicle.d0(timestamp,s0,s1) values(18,189,'198')",
-//      "insert into root.vehicle.d0(timestamp,s1) values(99,'1234')",
-//      "insert into root.vehicle.d1(timestamp,s2) values(14,1024.0)",
-//      "insert into root.vehicle.d1(timestamp,s2,s3) values(29,1205.0,true)",
-//      "insert into root.vehicle.d1(timestamp,s3) values(33,true)",
-//      "insert into root.test.d0(timestamp,s0) values(15,126)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(8,127,'128')",
-//      "insert into root.test.d0(timestamp,s1) values(20,'129')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(14,430)",
-//      "insert into root.test.d0(timestamp,s0) values(150,426)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(80,427,'528')",
-//      "insert into root.test.d0(timestamp,s1) values(2,'1209')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(4,330)", "merge", "flush",};
-//  private static final String[] sqls3 = new String[]{"SET STORAGE GROUP TO root.iotdb",
-//      "SET STORAGE GROUP TO root.flush",
-//      "CREATE TIMESERIES root.iotdb.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "CREATE TIMESERIES root.iotdb.d0.s1 WITH DATATYPE=TEXT, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.iotdb.d1.s2 WITH DATATYPE=FLOAT, ENCODING=RLE",
-//      "CREATE TIMESERIES root.iotdb.d1.s3 WITH DATATYPE=BOOLEAN, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.flush.d0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "CREATE TIMESERIES root.flush.d0.s1 WITH DATATYPE=TEXT, ENCODING=PLAIN",
-//      "CREATE TIMESERIES root.flush.d1.g0.s0 WITH DATATYPE=INT32, ENCODING=RLE",
-//      "insert into root.iotdb.d0(timestamp,s0) values(3,100)",
-//      "insert into root.iotdb.d0(timestamp,s0,s1) values(22,101,'102')",
-//      "insert into root.iotdb.d0(timestamp,s1) values(24,'103')",
-//      "insert into root.iotdb.d1(timestamp,s2) values(21,104.0)",
-//      "insert into root.iotdb.d1(timestamp,s2,s3) values(25,105.0,true)",
-//      "insert into root.iotdb.d1(timestamp,s3) values(27,false)",
-//      "insert into root.iotdb.d0(timestamp,s0) values(30,1000)",
-//      "insert into root.iotdb.d0(timestamp,s0,s1) values(202,101,'102')",
-//      "insert into root.iotdb.d0(timestamp,s1) values(44,'103')",
-//      "insert into root.iotdb.d1(timestamp,s2) values(1,404.0)",
-//      "insert into root.iotdb.d1(timestamp,s2,s3) values(250,10.0,true)",
-//      "insert into root.iotdb.d1(timestamp,s3) values(207,false)",
-//      "insert into root.flush.d0(timestamp,s0) values(20,106)",
-//      "insert into root.flush.d0(timestamp,s0,s1) values(14,107,'108')",
-//      "insert into root.flush.d1.g0(timestamp,s0) values(1,110)",
-//      "insert into root.flush.d0(timestamp,s0) values(200,1006)",
-//      "insert into root.flush.d0(timestamp,s0,s1) values(1004,1007,'1080')",
-//      "insert into root.flush.d1.g0(timestamp,s0) values(1000,910)",
-//      "insert into root.vehicle.d0(timestamp,s0) values(209,130)",
-//      "insert into root.vehicle.d0(timestamp,s0,s1) values(206,131,'132')",
-//      "insert into root.vehicle.d0(timestamp,s1) values(70,'33')",
-//      "insert into root.vehicle.d1(timestamp,s2) values(204,14.0)",
-//      "insert into root.vehicle.d1(timestamp,s2,s3) values(29,135.0,false)",
-//      "insert into root.vehicle.d1(timestamp,s3) values(14,false)",
-//      "insert into root.test.d0(timestamp,s0) values(19,136)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(7,137,'138')",
-//      "insert into root.test.d0(timestamp,s1) values(30,'139')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(4,150)",
-//      "insert into root.test.d0(timestamp,s0) values(1900,1316)",
-//      "insert into root.test.d0(timestamp,s0,s1) values(700,1307,'1038')",
-//      "insert into root.test.d0(timestamp,s1) values(3000,'1309')",
-//      "insert into root.test.d1.g0(timestamp,s0) values(400,1050)", "merge", "flush",};
-//  private boolean testFlag = Constant.testFlag;
-//  private static final String SYNC_CLIENT = Constans.SYNC_SENDER;
-//  private static final Logger logger = LoggerFactory.getLogger(SingleClientSyncTest.class);
-//
-//  public static void main(String[] args) throws Exception {
-//    SingleClientSyncTest singleClientPostBackTest = new SingleClientSyncTest();
-//    singleClientPostBackTest.setUp();
-//    singleClientPostBackTest.testPostback();
-//    singleClientPostBackTest.tearDown();
-//    System.exit(0);
-//  }
-//
-//  public void setConfig() {
-//    config.setSenderFolderPath(
-//        config.getDataDirectory() + SYNC_CLIENT + File.separator + Constans.UUID_FILE_NAME);
-//    config.setLastFileInfo(
-//        config.getDataDirectory() + SYNC_CLIENT + File.separator + Constans.LAST_LOCAL_FILE_NAME);
-//    String[] sequenceFileDirectory = config.getSeqFileDirectory();
-//    String[] snapshots = new String[config.getSeqFileDirectory().length];
-//    for (int i = 0; i < config.getSeqFileDirectory().length; i++) {
-//      sequenceFileDirectory[i] = new File(sequenceFileDirectory[i]).getAbsolutePath();
-//      if (!sequenceFileDirectory[i].endsWith(File.separator)) {
-//        sequenceFileDirectory[i] = sequenceFileDirectory[i] + File.separator;
-//      }
-//      snapshots[i] =
-//          sequenceFileDirectory[i] + SYNC_CLIENT + File.separator + Constans.DATA_SNAPSHOT_NAME
-//              + File.separator;
-//    }
-//    config.setSnapshotPaths(snapshots);
-//    config.setSeqFileDirectory(sequenceFileDirectory);
-//    config.setServerIp(serverIpTest);
-//    fileSenderImpl.setConfig(config);
-//  }
-//
-//  public void setUp() throws StartupException, IOException {
-//    if (testFlag) {
-//      EnvironmentUtils.closeStatMonitor();
-//      deamon = IoTDB.getInstance();
-//      deamon.active();
-//      EnvironmentUtils.envSetUp();
-//    }
-//    setConfig();
-//  }
-//
-//  public void tearDown() throws Exception {
-//    if (testFlag) {
-//      deamon.stop();
-//      EnvironmentUtils.cleanEnv();
-//    }
-//    if (success) {
-//      logger.debug("Test succeed!");
-//    } else {
-//      logger.debug("Test failed!");
-//    }
-//  }
-//
-//  public void testPostback() throws IOException, SyncConnectionException, ClassNotFoundException, SQLException, InterruptedException {
-//    if (testFlag) {
-//      // the first time to sync
-//      logger.debug("It's the first time to sync!");
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        try (Connection connection = DriverManager
-//            .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
-//                "root")) {
-//          Statement statement = connection.createStatement();
-//          for (String sql : sqls1) {
-//            statement.execute(sql);
-//          }
-//          statement.close();
-//        }
-//      } catch (SQLException | ClassNotFoundException e) {
-//        fail(e.getMessage());
-//      }
-//
-//      fileSenderImpl.sync();
-//
-//      // Compare data of sender and receiver
-//      dataSender.clear();
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        try (Connection connection = DriverManager
-//            .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
-//                "root")) {
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        }
-//      } catch (ClassNotFoundException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//
-//      dataReceiver.clear();
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        Connection connection = null;
-//        try {
-//          connection = DriverManager
-//              .getConnection(String.format("jdbc:iotdb://%s:6667/", serverIpTest), "root",
-//                  "root");
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        } finally {
-//          if (connection != null) {
-//            connection.close();
-//          }
-//        }
-//      } catch (ClassNotFoundException | SQLException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//      logger.debug(String.valueOf(dataSender.size()));
-//      logger.debug(String.valueOf(dataReceiver.size()));
-//      logger.debug(dataSender.toString());
-//      logger.debug(dataReceiver.toString());
-//      if (!(dataSender.size() == dataReceiver.size() && dataSender.containsAll(dataReceiver))) {
-//        success = false;
-//        return;
-//      }
-//
-//      // the second time to sync
-//      logger.debug("It's the second time to sync!");
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        Connection connection = null;
-//        try {
-//          connection = DriverManager
-//              .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
-//                  "root");
-//          Statement statement = connection.createStatement();
-//          for (String sql : sqls2) {
-//            statement.execute(sql);
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        } finally {
-//          if (connection != null) {
-//            connection.close();
-//          }
-//        }
-//      } catch (ClassNotFoundException | SQLException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//
-//      fileSenderImpl.sync();
-//
-//      // Compare data of sender and receiver
-//      dataSender.clear();
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        Connection connection = null;
-//        try {
-//          connection = DriverManager
-//              .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
-//                  "root");
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        } finally {
-//          if (connection != null) {
-//            connection.close();
-//          }
-//        }
-//      } catch (ClassNotFoundException | SQLException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//
-//      dataReceiver.clear();
-//      {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        Connection connection = null;
-//        try {
-//          connection = DriverManager
-//              .getConnection(String.format("jdbc:iotdb://%s:6667/", serverIpTest), "root",
-//                  "root");
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        } finally {
-//          if (connection != null) {
-//            connection.close();
-//          }
-//        }
-//      }
-//      logger.debug(String.valueOf(dataSender.size()));
-//      logger.debug(String.valueOf(dataReceiver.size()));
-//      logger.debug(dataSender.toString());
-//      logger.debug(dataReceiver.toString());
-//      if (!(dataSender.size() == dataReceiver.size() && dataSender.containsAll(dataReceiver))) {
-//        success = false;
-//        return;
-//      }
-//
-//      // the third time to sync
-//      logger.debug("It's the third time to sync!");
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        try (Connection connection = DriverManager
-//            .getConnection(Config.IOTDB_URL_PREFIX + "127.0.0.1:6667/", "root",
-//                "root")) {
-//          Statement statement = connection.createStatement();
-//          for (String sql : sqls3) {
-//            statement.execute(sql);
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        }
-//      } catch (ClassNotFoundException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//
-//      fileSenderImpl.sync();
-//
-//      // Compare data of sender and receiver
-//      dataSender.clear();
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        try (Connection connection = DriverManager
-//            .getConnection(String.format("jdbc:iotdb://%s:6667/", serverIpTest), "root",
-//                "root")) {
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.flush");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.flush.d0.s0")
-//                  + res.getString("root.flush.d0.s1") + res.getString("root.flush.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.flush.d0.s0")
-//                  + res.getString("root.flush.d0.s1") + res.getString("root.flush.d1.g0.s0"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.iotdb");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataSender.add(res.getString("Time") + res.getString("root.iotdb.d0.s0")
-//                  + res.getString("root.iotdb.d0.s1") + res.getString("root.iotdb.d1.s2")
-//                  + res.getString("root.iotdb.d1.s3"));
-//              logger.debug(res.getString("Time") + res.getString("root.iotdb.d0.s0")
-//                  + res.getString("root.iotdb.d0.s1") + res.getString("root.iotdb.d1.s2")
-//                  + res.getString("root.iotdb.d1.s3"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        }
-//      } catch (ClassNotFoundException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//
-//      dataReceiver.clear();
-//      try {
-//        Class.forName(Config.JDBC_DRIVER_NAME);
-//        Connection connection = null;
-//        try {
-//          connection = DriverManager
-//              .getConnection("jdbc:iotdb://192.168.130.8:6667/", "root", "root");
-//          Statement statement = connection.createStatement();
-//          boolean hasResultSet = statement.execute("select * from root.vehicle");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.vehicle.d0.s0")
-//                  + res.getString("root.vehicle.d0.s1") + res.getString("root.vehicle.d1.s2")
-//                  + res.getString("root.vehicle.d1.s3"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.test");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.test.d0.s0")
-//                  + res.getString("root.test.d0.s1") + res.getString("root.test.d1.g0.s0"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.flush");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.flush.d0.s0")
-//                  + res.getString("root.flush.d0.s1") + res.getString("root.flush.d1.g0.s0"));
-//              logger.debug(res.getString("Time") + " | " + res.getString("root.flush.d0.s0")
-//                  + res.getString("root.flush.d0.s1") + res.getString("root.flush.d1.g0.s0"));
-//            }
-//          }
-//          hasResultSet = statement.execute("select * from root.iotdb");
-//          if (hasResultSet) {
-//            ResultSet res = statement.getResultSet();
-//            while (res.next()) {
-//              dataReceiver.add(res.getString("Time") + res.getString("root.iotdb.d0.s0")
-//                  + res.getString("root.iotdb.d0.s1") + res.getString("root.iotdb.d1.s2")
-//                  + res.getString("root.iotdb.d1.s3"));
-//              logger.debug(res.getString("Time") + res.getString("root.iotdb.d0.s0")
-//                  + res.getString("root.iotdb.d0.s1") + res.getString("root.iotdb.d1.s2")
-//                  + res.getString("root.iotdb.d1.s3"));
-//            }
-//          }
-//          statement.close();
-//        } catch (Exception e) {
-//          logger.error("", e);
-//        } finally {
-//          if (connection != null) {
-//            connection.close();
-//          }
-//        }
-//      } catch (ClassNotFoundException | SQLException e) {
-//        fail(e.getMessage());
-//        Thread.currentThread().interrupt();
-//      }
-//      logger.debug(String.valueOf(dataSender.size()));
-//      logger.debug(String.valueOf(dataReceiver.size()));
-//      logger.debug(String.valueOf(dataSender));
-//      logger.debug(String.valueOf(dataReceiver));
-//      if (!(dataSender.size() == dataReceiver.size() && dataSender.containsAll(dataReceiver))) {
-//        success = false;
-//      }
-//    }
-//  }
-//}
\ No newline at end of file
diff --git a/server/src/test/java/org/apache/iotdb/db/sync/sender/SyncFileManagerTest.java b/server/src/test/java/org/apache/iotdb/db/sync/sender/SyncFileManagerTest.java
deleted file mode 100644
index 354ef74..0000000
--- a/server/src/test/java/org/apache/iotdb/db/sync/sender/SyncFileManagerTest.java
+++ /dev/null
@@ -1,374 +0,0 @@
-///**
-// * Licensed to the Apache Software Foundation (ASF) under one
-// * or more contributor license agreements.  See the NOTICE file
-// * distributed with this work for additional information
-// * regarding copyright ownership.  The ASF licenses this file
-// * to you under the Apache License, Version 2.0 (the
-// * "License"); you may not use this file except in compliance
-// * with the License.  You may obtain a copy of the License at
-// *
-// *     http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing,
-// * software distributed under the License is distributed on an
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// * KIND, either express or implied.  See the License for the
-// * specific language governing permissions and limitations
-// * under the License.
-// */
-//package org.apache.iotdb.db.sync.sender;
-//
-//import java.io.File;
-//import java.io.IOException;
-//import java.util.HashMap;
-//import java.util.HashSet;
-//import java.util.Map;
-//import java.util.Map.Entry;
-//import java.util.Random;
-//import java.util.Set;
-//import org.apache.iotdb.db.sync.sender.conf.Constans;
-//import org.junit.After;
-//import org.junit.Before;
-//import org.junit.Test;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//
-//public class SyncFileManagerTest {
-//
-//  private static final String POST_BACK_DIRECTORY_TEST = Constans.SYNC_SENDER + File.separator;
-//  private static final String LAST_FILE_INFO_TEST =
-//      POST_BACK_DIRECTORY_TEST + Constans.LAST_LOCAL_FILE_NAME;
-//  private static final String SENDER_FILE_PATH_TEST = POST_BACK_DIRECTORY_TEST + "data";
-//  private SyncFileManager manager = SyncFileManager.getInstance();
-//  private static final Logger logger = LoggerFactory.getLogger(SyncFileManagerTest.class);
-//
-//  @Before
-//  public void setUp() throws IOException, InterruptedException {
-//    File file = new File(LAST_FILE_INFO_TEST);
-//    if (!file.getParentFile().exists()) {
-//      file.getParentFile().mkdirs();
-//    }
-//    if (!file.exists() && !file.createNewFile()) {
-//      logger.error("Can not create new file {}", file.getPath());
-//    }
-//    file = new File(SENDER_FILE_PATH_TEST);
-//    if (!file.exists()) {
-//      file.mkdirs();
-//    }
-//    manager.setCurrentLocalFiles(new HashMap<>());
-//  }
-//
-//  @After
-//  public void tearDown() throws InterruptedException {
-//    delete(new File(POST_BACK_DIRECTORY_TEST));
-//    new File(POST_BACK_DIRECTORY_TEST).delete();
-//  }
-//
-//  public void delete(File file) {
-//    if (file.isFile() || file.list().length == 0) {
-//      file.delete();
-//    } else {
-//      File[] files = file.listFiles();
-//      for (File f : files) {
-//        delete(f);
-//        f.delete();
-//      }
-//    }
-//  }
-//
-//  @Test // It tests two classes : backupNowLocalFileInfo and getLastLocalFileList
-//  public void testBackupCurrentLocalFileInfo() throws IOException {
-//    Map<String, Set<String>> allFileList = new HashMap<>();
-//
-//    Random r = new Random(0);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    Set<String> lastFileList;
-//
-//    // lastFileList is empty
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    lastFileList = manager.getLastLocalFiles();
-//    assert (lastFileList.isEmpty());
-//
-//    // add some files
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    manager.backupNowLocalFileInfo(LAST_FILE_INFO_TEST);
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    lastFileList = manager.getLastLocalFiles();
-//    for (Entry<String, Set<String>> entry : allFileList.entrySet()) {
-//      assert (lastFileList.containsAll(entry.getValue()));
-//    }
-//
-//    // add some files and delete some files
-//    r = new Random(1);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    int count = 0;
-//    Map<String, Set<String>> deleteFile = new HashMap<>();
-//    for (Entry<String, Set<String>> entry : allFileList.entrySet()) {
-//      deleteFile.put(entry.getKey(), new HashSet<>());
-//      for (String path : entry.getValue()) {
-//        count++;
-//        if (count % 3 == 0) {
-//          deleteFile.get(entry.getKey()).add(path);
-//        }
-//      }
-//    }
-//    for (Entry<String, Set<String>> entry : deleteFile.entrySet()) {
-//      for (String path : entry.getValue()) {
-//        new File(path).delete();
-//        allFileList.get(entry.getKey()).remove(path);
-//      }
-//    }
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    manager.backupNowLocalFileInfo(LAST_FILE_INFO_TEST);
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    lastFileList = manager.getLastLocalFiles();
-//    for (Entry<String, Set<String>> entry : allFileList.entrySet()) {
-//      assert (lastFileList.containsAll(entry.getValue()));
-//    }
-//  }
-//
-//  @Test
-//  public void testGetCurrentLocalFileList() throws IOException {
-//    Map<String, Set<String>> allFileList = new HashMap<>();
-//    Map<String, Set<String>> fileList;
-//
-//    // nowLocalList is empty
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    fileList = manager.getCurrentLocalFiles();
-//    assert (isEmpty(fileList));
-//
-//    // add some files
-//    Random r = new Random(0);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    fileList = manager.getCurrentLocalFiles();
-//    assert (allFileList.size() == fileList.size());
-//    for (Entry<String, Set<String>> entry : fileList.entrySet()) {
-//      assert (allFileList.containsKey(entry.getKey()));
-//      assert (allFileList.get(entry.getKey()).containsAll(entry.getValue()));
-//    }
-//
-//    // delete some files and add some files
-//    int count = 0;
-//    Map<String, Set<String>> deleteFile = new HashMap<>();
-//    for (Entry<String, Set<String>> entry : allFileList.entrySet()) {
-//      deleteFile.put(entry.getKey(), new HashSet<>());
-//      for (String path : entry.getValue()) {
-//        count++;
-//        if (count % 3 == 0) {
-//          deleteFile.get(entry.getKey()).add(path);
-//        }
-//      }
-//    }
-//    for (Entry<String, Set<String>> entry : deleteFile.entrySet()) {
-//      for (String path : entry.getValue()) {
-//        new File(path).delete();
-//        allFileList.get(entry.getKey()).remove(path);
-//      }
-//    }
-//    r = new Random(1);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    manager.setCurrentLocalFiles(new HashMap<>());
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    fileList = manager.getCurrentLocalFiles();
-//    assert (allFileList.size() == fileList.size());
-//    for (Entry<String, Set<String>> entry : fileList.entrySet()) {
-//      assert (allFileList.containsKey(entry.getKey()));
-//      logger.debug("allFileList");
-//      for (String a : allFileList.get(entry.getKey())) {
-//        logger.debug(a);
-//      }
-//      logger.debug("FileList");
-//      for (String a : entry.getValue()) {
-//        logger.debug(a);
-//      }
-//      assert (allFileList.get(entry.getKey()).containsAll(entry.getValue()));
-//    }
-//  }
-//
-//  @Test
-//  public void testGetValidFileList() throws IOException {
-//    Map<String, Set<String>> allFileList;
-//    Map<String, Set<String>> newFileList = new HashMap<>();
-//    Map<String, Set<String>> sendingFileList;
-//    Set<String> lastLocalList;
-//
-//    // nowSendingList is empty
-//
-//    manager.setCurrentLocalFiles(new HashMap<>());
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    allFileList = manager.getCurrentLocalFiles();
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    lastLocalList = manager.getLastLocalFiles();
-//    manager.getValidFileList();
-//    assert (lastLocalList.isEmpty());
-//    assert (isEmpty(allFileList));
-//
-//    // add some files
-//    newFileList.clear();
-//    manager.backupNowLocalFileInfo(LAST_FILE_INFO_TEST);
-//    Random r = new Random(0);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        if (!newFileList.containsKey(String.valueOf(i))) {
-//          newFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        newFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    allFileList = manager.getCurrentLocalFiles();
-//    manager.backupNowLocalFileInfo(LAST_FILE_INFO_TEST);
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    manager.getValidFileList();
-//    sendingFileList = manager.getValidAllFiles();
-//    assert (sendingFileList.size() == newFileList.size());
-//    for (Entry<String, Set<String>> entry : sendingFileList.entrySet()) {
-//      assert (newFileList.containsKey(entry.getKey()));
-//      assert (newFileList.get(entry.getKey()).containsAll(entry.getValue()));
-//    }
-//
-//    // delete some files and add some files
-//    int count = 0;
-//    Map<String, Set<String>> deleteFile = new HashMap<>();
-//    for (Entry<String, Set<String>> entry : allFileList.entrySet()) {
-//      deleteFile.put(entry.getKey(), new HashSet<>());
-//      for (String path : entry.getValue()) {
-//        count++;
-//        if (count % 3 == 0) {
-//          deleteFile.get(entry.getKey()).add(path);
-//        }
-//      }
-//    }
-//    for (Entry<String, Set<String>> entry : deleteFile.entrySet()) {
-//      for (String path : entry.getValue()) {
-//        new File(path).delete();
-//        allFileList.get(entry.getKey()).remove(path);
-//      }
-//    }
-//    newFileList.clear();
-//    r = new Random(1);
-//    for (int i = 0; i < 3; i++) {
-//      for (int j = 0; j < 5; j++) {
-//        if (!allFileList.containsKey(String.valueOf(i))) {
-//          allFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        if (!newFileList.containsKey(String.valueOf(i))) {
-//          newFileList.put(String.valueOf(i), new HashSet<>());
-//        }
-//        String rand = String.valueOf(r.nextInt(10000));
-//        String fileName =
-//            SENDER_FILE_PATH_TEST + File.separator + i + File.separator + rand;
-//        File file = new File(fileName);
-//        allFileList.get(String.valueOf(i)).add(file.getPath());
-//        newFileList.get(String.valueOf(i)).add(file.getPath());
-//        if (!file.getParentFile().exists()) {
-//          file.getParentFile().mkdirs();
-//        }
-//        if (!file.exists() && !file.createNewFile()) {
-//          logger.error("Can not create new file {}", file.getPath());
-//        }
-//      }
-//    }
-//    manager.getCurrentLocalFileList(new String[]{SENDER_FILE_PATH_TEST});
-//    manager.getLastLocalFileList(LAST_FILE_INFO_TEST);
-//    manager.getValidFileList();
-//    sendingFileList = manager.getValidAllFiles();
-//    assert (sendingFileList.size() == newFileList.size());
-//    for (Entry<String, Set<String>> entry : sendingFileList.entrySet()) {
-//      assert (newFileList.containsKey(entry.getKey()));
-//      assert (newFileList.get(entry.getKey()).containsAll(entry.getValue()));
-//    }
-//  }
-//
-//  private boolean isEmpty(Map<String, Set<String>> sendingFileList) {
-//    for (Entry<String, Set<String>> entry : sendingFileList.entrySet()) {
-//      if (!entry.getValue().isEmpty()) {
-//        return false;
-//      }
-//    }
-//    return true;
-//  }
-//}
\ No newline at end of file
diff --git a/server/src/test/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManagerTest.java b/server/src/test/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManagerTest.java
new file mode 100644
index 0000000..91e59d3
--- /dev/null
+++ b/server/src/test/java/org/apache/iotdb/db/sync/sender/manage/SyncFileManagerTest.java
@@ -0,0 +1,276 @@
+package org.apache.iotdb.db.sync.sender.manage;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Random;
+import java.util.Set;
+import org.apache.iotdb.db.conf.IoTDBConstant;
+import org.apache.iotdb.db.conf.directories.DirectoryManager;
+import org.apache.iotdb.db.engine.storagegroup.TsFileResource;
+import org.apache.iotdb.db.exception.DiskSpaceInsufficientException;
+import org.apache.iotdb.db.exception.StartupException;
+import org.apache.iotdb.db.exception.StorageEngineException;
+import org.apache.iotdb.db.sync.sender.conf.SyncSenderConfig;
+import org.apache.iotdb.db.sync.sender.conf.SyncSenderDescriptor;
+import org.apache.iotdb.db.utils.EnvironmentUtils;
+import org.apache.iotdb.db.utils.FilePathUtils;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class SyncFileManagerTest {
+
+  private static final Logger logger = LoggerFactory.getLogger(SyncFileManagerTest.class);
+  private SyncFileManager manager = SyncFileManager.getInstance();
+  private SyncSenderConfig config = SyncSenderDescriptor.getInstance().getConfig();
+  private String dataDir;
+
+  @Before
+  public void setUp()
+      throws IOException, InterruptedException, StartupException, DiskSpaceInsufficientException {
+    EnvironmentUtils.envSetUp();
+    dataDir = new File(DirectoryManager.getInstance().getNextFolderForSequenceFile())
+        .getParentFile().getAbsolutePath();
+    config.update(dataDir);
+  }
+
+  @After
+  public void tearDown() throws InterruptedException, IOException, StorageEngineException {
+    EnvironmentUtils.cleanEnv();
+  }
+
+  @Test
+  public void testGetValidFiles() throws IOException {
+    Map<String, Set<File>> allFileList = new HashMap<>();
+
+    Random r = new Random(0);
+    for (int i = 0; i < 3; i++) {
+      for (int j = 0; j < 5; j++) {
+        if (!allFileList.containsKey(String.valueOf(i))) {
+          allFileList.put(String.valueOf(i), new HashSet<>());
+        }
+        String rand = String.valueOf(r.nextInt(10000));
+        String fileName = FilePathUtils.regularizePath(dataDir) + IoTDBConstant.SEQUENCE_FLODER_NAME
+            + File.separator + i
+            + File.separator + rand;
+        File file = new File(fileName);
+        allFileList.get(String.valueOf(i)).add(file);
+        if (!file.getParentFile().exists()) {
+          file.getParentFile().mkdirs();
+        }
+        if (!file.exists() && !file.createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+        if (!new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).exists()
+            && !new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+      }
+    }
+    Map<String, Set<File>> lastFileMap;
+    Map<String, Set<File>> curFileMap;
+    Map<String, Set<File>> deletedFilesMap;
+    Map<String, Set<File>> toBeSyncedFilesMap;
+
+    // lastFileList is empty
+    manager.getValidFiles(dataDir);
+    assert isEmpty(manager.getLastLocalFilesMap());
+
+    updateLastLocalFiles(allFileList);
+
+    manager.getValidFiles(dataDir);
+    lastFileMap = manager.getLastLocalFilesMap();
+    for (Entry<String, Set<File>> entry : allFileList.entrySet()) {
+      assert lastFileMap.containsKey(entry.getKey());
+      assert lastFileMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+
+    // add some files
+    Map<String, Set<File>> correctToBeSyncedFiles = new HashMap<>();
+    r = new Random(1);
+    for (int i = 0; i < 3; i++) {
+      for (int j = 0; j < 5; j++) {
+        if (!allFileList.containsKey(String.valueOf(i))) {
+          allFileList.put(String.valueOf(i), new HashSet<>());
+        }
+        correctToBeSyncedFiles.putIfAbsent(String.valueOf(i), new HashSet<>());
+        String rand = String.valueOf(r.nextInt(10000));
+        String fileName =
+            FilePathUtils.regularizePath(dataDir) + IoTDBConstant.SEQUENCE_FLODER_NAME
+                + File.separator + i
+                + File.separator + rand;
+        File file = new File(fileName);
+        allFileList.get(String.valueOf(i)).add(file);
+        correctToBeSyncedFiles.get(String.valueOf(i)).add(file);
+        if (!file.getParentFile().exists()) {
+          file.getParentFile().mkdirs();
+        }
+        if (!file.exists() && !file.createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+        if (!new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).exists()
+            && !new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+      }
+    }
+    manager.getValidFiles(dataDir);
+    lastFileMap = manager.getLastLocalFilesMap();
+    curFileMap = manager.getCurrentSealedLocalFilesMap();
+    deletedFilesMap = manager.getDeletedFilesMap();
+    toBeSyncedFilesMap = manager.getToBeSyncedFilesMap();
+    for (Entry<String, Set<File>> entry : allFileList.entrySet()) {
+      assert curFileMap.containsKey(entry.getKey());
+      assert curFileMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    for (Entry<String, Set<File>> entry : correctToBeSyncedFiles.entrySet()) {
+      assert toBeSyncedFilesMap.containsKey(entry.getKey());
+      assert toBeSyncedFilesMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    updateLastLocalFiles(allFileList);
+    manager.getValidFiles(dataDir);
+    lastFileMap = manager.getLastLocalFilesMap();
+    for (Entry<String, Set<File>> entry : allFileList.entrySet()) {
+      assert lastFileMap.containsKey(entry.getKey());
+      assert lastFileMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+
+    // add some files and delete some files
+    correctToBeSyncedFiles.clear();
+    r = new Random(2);
+    for (int i = 0; i < 3; i++) {
+      for (int j = 0; j < 5; j++) {
+        if (!allFileList.containsKey(String.valueOf(i))) {
+          allFileList.put(String.valueOf(i), new HashSet<>());
+        }
+        correctToBeSyncedFiles.putIfAbsent(String.valueOf(i), new HashSet<>());
+        String rand = String.valueOf(r.nextInt(10000));
+        String fileName =
+            FilePathUtils.regularizePath(dataDir) + IoTDBConstant.SEQUENCE_FLODER_NAME
+                + File.separator + i
+                + File.separator + rand;
+        File file = new File(fileName);
+        allFileList.get(String.valueOf(i)).add(file);
+        correctToBeSyncedFiles.get(String.valueOf(i)).add(file);
+        if (!file.getParentFile().exists()) {
+          file.getParentFile().mkdirs();
+        }
+        if (!file.exists() && !file.createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+        if (!new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).exists()
+            && !new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+      }
+    }
+    int count = 0;
+    Map<String, Set<File>> correctDeleteFile = new HashMap<>();
+    for (Entry<String, Set<File>> entry : allFileList.entrySet()) {
+      correctDeleteFile.put(entry.getKey(), new HashSet<>());
+      for (File file : entry.getValue()) {
+        count++;
+        if (count % 3 == 0 && lastFileMap.get(entry.getKey()).contains(file)) {
+          correctDeleteFile.get(entry.getKey()).add(file);
+        }
+      }
+    }
+    for (Entry<String, Set<File>> entry : correctDeleteFile.entrySet()) {
+      for (File file : entry.getValue()) {
+        file.delete();
+        new File(file.getAbsolutePath() + TsFileResource.RESOURCE_SUFFIX).delete();
+        allFileList.get(entry.getKey()).remove(file);
+      }
+    }
+    manager.getValidFiles(dataDir);
+    lastFileMap = manager.getLastLocalFilesMap();
+    curFileMap = manager.getCurrentSealedLocalFilesMap();
+    deletedFilesMap = manager.getDeletedFilesMap();
+    toBeSyncedFilesMap = manager.getToBeSyncedFilesMap();
+    for (Entry<String, Set<File>> entry : allFileList.entrySet()) {
+      assert curFileMap.containsKey(entry.getKey());
+      assert curFileMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    for (Entry<String, Set<File>> entry : correctDeleteFile.entrySet()) {
+      assert deletedFilesMap.containsKey(entry.getKey());
+      assert deletedFilesMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    for (Entry<String, Set<File>> entry : correctToBeSyncedFiles.entrySet()) {
+      assert toBeSyncedFilesMap.containsKey(entry.getKey());
+      assert toBeSyncedFilesMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+
+    // add some invalid files
+    r = new Random(3);
+    for (int i = 0; i < 3; i++) {
+      for (int j = 0; j < 5; j++) {
+        if (!allFileList.containsKey(String.valueOf(i))) {
+          allFileList.put(String.valueOf(i), new HashSet<>());
+        }
+        String rand = String.valueOf(r.nextInt(10000));
+        String fileName =
+            FilePathUtils.regularizePath(dataDir) + IoTDBConstant.SEQUENCE_FLODER_NAME
+                + File.separator + i
+                + File.separator + rand;
+        File file = new File(fileName);
+        allFileList.get(String.valueOf(i)).add(file);
+        if (!file.getParentFile().exists()) {
+          file.getParentFile().mkdirs();
+        }
+        if (!file.exists() && !file.createNewFile()) {
+          logger.error("Can not create new file {}", file.getPath());
+        }
+      }
+    }
+    manager.getValidFiles(dataDir);
+    lastFileMap = manager.getLastLocalFilesMap();
+    curFileMap = manager.getCurrentSealedLocalFilesMap();
+    deletedFilesMap = manager.getDeletedFilesMap();
+    toBeSyncedFilesMap = manager.getToBeSyncedFilesMap();
+    for (Entry<String, Set<File>> entry : curFileMap.entrySet()) {
+      assert allFileList.containsKey(entry.getKey());
+      assert allFileList.get(entry.getKey()).size() != entry.getValue().size();
+      assert allFileList.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    for (Entry<String, Set<File>> entry : correctDeleteFile.entrySet()) {
+      assert deletedFilesMap.containsKey(entry.getKey());
+      assert deletedFilesMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+    for (Entry<String, Set<File>> entry : correctToBeSyncedFiles.entrySet()) {
+      assert toBeSyncedFilesMap.containsKey(entry.getKey());
+      assert toBeSyncedFilesMap.get(entry.getKey()).containsAll(entry.getValue());
+    }
+  }
+
+  private void updateLastLocalFiles(Map<String, Set<File>> lastLocalFilesMap) {
+    try (BufferedWriter bw = new BufferedWriter(
+        new FileWriter(new File(config.getLastFileInfo())))) {
+      for (Set<File> currentLocalFiles : lastLocalFilesMap.values()) {
+        for (File file : currentLocalFiles) {
+          bw.write(file.getAbsolutePath());
+          bw.newLine();
+        }
+        bw.flush();
+      }
+    } catch (IOException e) {
+      logger.error("Can not clear sync log {}", config.getLastFileInfo(), e);
+    }
+  }
+
+  private boolean isEmpty(Map<String, Set<File>> sendingFileList) {
+    for (Entry<String, Set<File>> entry : sendingFileList.entrySet()) {
+      if (!entry.getValue().isEmpty()) {
+        return false;
+      }
+    }
+    return true;
+  }
+}
\ No newline at end of file