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 02:43:44 UTC

[incubator-iotdb] 03/03: add load log and clean up in receiver end

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 eeb1e3c6e0156e3d7851331445ea8c5defadfb6b
Author: lta <li...@163.com>
AuthorDate: Fri Aug 30 10:43:23 2019 +0800

    add load log and clean up in receiver end
---
 .../iotdb/db/sync/receiver/load/FileLoader.java    |   77 +-
 .../iotdb/db/sync/receiver/load/IFileLoader.java   |    7 +-
 .../iotdb/db/sync/receiver/load/ILoadLogger.java   |   18 +
 .../iotdb/db/sync/receiver/load/LoadLogger.java    |   50 +
 .../db/sync/receiver/transfer/SyncServiceImpl.java |    9 +-
 .../apache/iotdb/db/sync/sender/conf/Constans.java |    1 +
 .../storagegroup/FileNodeManagerBenchmark.java     |    2 +-
 .../iotdb/db/sync/sender/SingleClientSyncTest.java | 1192 ++++++++++----------
 .../iotdb/db/sync/sender/SyncFileManagerTest.java  |  748 ++++++------
 .../java/org/apache/iotdb/db/utils/RandomNum.java  |   70 ++
 10 files changed, 1178 insertions(+), 996 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 7681433..8db09c0 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
@@ -19,6 +19,7 @@
 package org.apache.iotdb.db.sync.receiver.load;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayDeque;
 import org.apache.iotdb.db.sync.sender.conf.Constans;
 import org.slf4j.Logger;
@@ -30,22 +31,28 @@ public class FileLoader implements IFileLoader {
 
   private static final int WAIT_TIME = 1000;
 
-  private File syncEndFile;
+  private String syncFolderPath;
 
   private String senderName;
 
   private ArrayDeque<LoadTask> queue = new ArrayDeque<>();
 
+  private LoadLogger loadLog;
+
+  private LoadType curType = LoadType.NONE;
+
   private volatile boolean endSync = false;
 
-  private FileLoader(String senderName, String syncFolderPath) {
+  private FileLoader(String senderName, String syncFolderPath) throws IOException {
     this.senderName = senderName;
-    this.syncEndFile = new File(syncFolderPath, Constans.SYNC_END);
+    this.syncFolderPath = syncFolderPath;
+    this.loadLog = new LoadLogger(new File(syncFolderPath, Constans.LOAD_LOG_NAME));
     FileLoaderManager.getInstance().addFileLoader(senderName, this);
     FileLoaderManager.getInstance().addLoadTaskRunner(loadTaskRunner);
   }
 
-  public static FileLoader createFileLoader(String senderName, String syncFolderPath) {
+  public static FileLoader createFileLoader(String senderName, String syncFolderPath)
+      throws IOException {
     return new FileLoader(senderName, syncFolderPath);
   }
 
@@ -67,23 +74,23 @@ public class FileLoader implements IFileLoader {
           handleLoadTask(queue.poll());
         }
       }
-    } catch (InterruptedException e) {
-      LOGGER.info("Close the run load task thread.");
+    } catch (InterruptedException | IOException e) {
+      LOGGER.error("Can not handle load task", e);
     }
   };
 
   @Override
-  public void addDeletedFileName(String sgName, File deletedFile) {
+  public void addDeletedFileName(File deletedFile) {
     synchronized (queue) {
-      queue.add(new LoadTask(sgName, deletedFile, LoadType.DELETE));
+      queue.add(new LoadTask(deletedFile, LoadType.DELETE));
       queue.notify();
     }
   }
 
   @Override
-  public void addTsfile(String sgName, File tsfile) {
+  public void addTsfile(File tsfile) {
     synchronized (queue) {
-      queue.add(new LoadTask(sgName, tsfile, LoadType.ADD));
+      queue.add(new LoadTask(tsfile, LoadType.ADD));
       queue.notify();
     }
   }
@@ -94,29 +101,63 @@ public class FileLoader implements IFileLoader {
   }
 
   @Override
-  public void handleLoadTask(LoadTask task) {
+  public void handleLoadTask(LoadTask task) throws IOException {
+    switch (task.type) {
+      case ADD:
+        loadDeletedFile(task.file);
+        break;
+      case DELETE:
+        loadNewTsfile(task.file);
+        break;
+      default:
+        LOGGER.error("Wrong load task type {}", task.type);
+    }
+  }
 
+  private void loadDeletedFile(File file) throws IOException {
+    if (curType != LoadType.DELETE) {
+      loadLog.startLoadDeletedFiles();
+      curType = LoadType.DELETE;
+    }
+    // TODO load deleted file
+    loadLog.finishLoadDeletedFile(file);
   }
 
+  private void loadNewTsfile(File file) throws IOException {
+    if (curType != LoadType.ADD) {
+      loadLog.startLoadTsFiles();
+      curType = LoadType.ADD;
+    }
+    // TODO load new tsfile
+    loadLog.finishLoadTsfile(file);
+  }
+
+
   @Override
   public void cleanUp() {
-    FileLoaderManager.getInstance().removeFileLoader(senderName);
+    try {
+      loadLog.close();
+      new File(syncFolderPath, Constans.SYNC_LOG_NAME).deleteOnExit();
+      new File(syncFolderPath, Constans.LOAD_LOG_NAME).deleteOnExit();
+      new File(syncFolderPath, Constans.SYNC_END).deleteOnExit();
+      FileLoaderManager.getInstance().removeFileLoader(senderName);
+    } catch (IOException e) {
+      LOGGER.error("Can not clean up sync resource.", e);
+    }
   }
 
   class LoadTask {
 
-    String sgName;
-    File file;
-    LoadType type;
+    private File file;
+    private LoadType type;
 
-    LoadTask(String sgName, File file, LoadType type) {
-      this.sgName = sgName;
+    LoadTask(File file, LoadType type) {
       this.file = file;
       this.type = type;
     }
   }
 
   private enum LoadType {
-    DELETE, ADD;
+    DELETE, ADD, NONE
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/IFileLoader.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/IFileLoader.java
index 98aeca9..69f6fda 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/IFileLoader.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/IFileLoader.java
@@ -19,17 +19,18 @@
 package org.apache.iotdb.db.sync.receiver.load;
 
 import java.io.File;
+import java.io.IOException;
 import org.apache.iotdb.db.sync.receiver.load.FileLoader.LoadTask;
 
 public interface IFileLoader {
 
-  void addDeletedFileName(String sgName, File deletedFile);
+  void addDeletedFileName(File deletedFile);
 
-  void addTsfile(String sgName, File tsfile);
+  void addTsfile(File tsfile);
 
   void endSync();
 
-  void handleLoadTask(LoadTask task);
+  void handleLoadTask(LoadTask task) throws IOException;
 
   void cleanUp();
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/ILoadLogger.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/ILoadLogger.java
new file mode 100644
index 0000000..2cad379
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/ILoadLogger.java
@@ -0,0 +1,18 @@
+package org.apache.iotdb.db.sync.receiver.load;
+
+import java.io.File;
+import java.io.IOException;
+
+public interface ILoadLogger {
+
+  void startLoadDeletedFiles() throws IOException;
+
+  void finishLoadDeletedFile(File file) throws IOException;
+
+  void startLoadTsFiles() throws IOException;
+
+  void finishLoadTsfile(File file) throws IOException;
+
+  void close() throws IOException;
+
+}
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/LoadLogger.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/LoadLogger.java
new file mode 100644
index 0000000..31b4c48
--- /dev/null
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/load/LoadLogger.java
@@ -0,0 +1,50 @@
+package org.apache.iotdb.db.sync.receiver.load;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+
+public class LoadLogger implements ILoadLogger {
+
+  public static final String LOAD_DELETED_FILE_NAME_START = "load deleted files start";
+  public static final String LOAD_TSFILE_START = "load tsfile start";
+  private BufferedWriter bw;
+
+  public LoadLogger(File logFile) throws IOException {
+    bw = new BufferedWriter(new FileWriter(logFile));
+  }
+
+  @Override
+  public void startLoadDeletedFiles() throws IOException {
+    bw.write(LOAD_DELETED_FILE_NAME_START);
+    bw.newLine();
+    bw.flush();
+  }
+
+  @Override
+  public void finishLoadDeletedFile(File file) throws IOException {
+    bw.write(file.getAbsolutePath());
+    bw.newLine();
+    bw.flush();
+  }
+
+  @Override
+  public void startLoadTsFiles() throws IOException {
+    bw.write(LOAD_TSFILE_START);
+    bw.newLine();
+    bw.flush();
+  }
+
+  @Override
+  public void finishLoadTsfile(File file) throws IOException {
+    bw.write(file.getAbsolutePath());
+    bw.newLine();
+    bw.flush();
+  }
+
+  @Override
+  public void close() throws IOException {
+    bw.close();
+  }
+}
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 e2f45a5..525244d 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
@@ -87,7 +87,7 @@ public class SyncServiceImpl implements SyncService.Iface {
   public ResultStatus check(String ipAddress, String uuid) {
     Thread.currentThread().setName(ThreadName.SYNC_SERVER.getName());
     if (SyncUtils.verifyIPSegment(config.getIpWhiteList(), ipAddress)) {
-      senderName.set(ipAddress + "-" + uuid);
+      senderName.set(ipAddress + Constans.SYNC_DIR_NAME_SEPARATOR + uuid);
       if (checkRecovery()) {
         return getSuccessResult();
       } else {
@@ -156,7 +156,7 @@ public class SyncServiceImpl implements SyncService.Iface {
     try {
       syncLog.get().finishSyncDeletedFileName(new File(fileName));
       FileLoaderManager.getInstance().getFileLoader(senderName.get())
-          .addDeletedFileName(currentSG.get(), new File(fileName));
+          .addDeletedFileName(new File(fileName));
     } catch (IOException e) {
       logger.error("Can not sync deleted file", e);
       return getErrorResult(
@@ -169,7 +169,7 @@ public class SyncServiceImpl implements SyncService.Iface {
   public ResultStatus initSyncData(String filename) throws TException {
     try {
       File file;
-      if (currentSG.get() == null) {
+      if (currentSG.get() == null) { // schema mlog.txt file
         file = new File(getSyncDataPath(), filename);
       } else {
         file = new File(getSyncDataPath(), currentSG.get() + File.separatorChar + filename);
@@ -221,7 +221,7 @@ public class SyncServiceImpl implements SyncService.Iface {
           if (!currentFile.get().getName().endsWith(TsFileResource.RESOURCE_SUFFIX)) {
             syncLog.get().finishSyncTsfile(currentFile.get());
             FileLoaderManager.getInstance().getFileLoader(senderName.get())
-                .addTsfile(currentSG.get(), currentFile.get());
+                .addTsfile(currentFile.get());
           }
         }
       }
@@ -306,6 +306,7 @@ public class SyncServiceImpl implements SyncService.Iface {
     try {
       syncLog.get().close();
       new File(getSyncDataPath(), Constans.SYNC_END).createNewFile();
+      FileLoaderManager.getInstance().getFileLoader(senderName.get()).endSync();
     } catch (IOException e) {
       logger.error("Can not end sync", e);
       return getErrorResult(String.format("Can not end sync because %s", e.getMessage()));
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/sender/conf/Constans.java b/server/src/main/java/org/apache/iotdb/db/sync/sender/conf/Constans.java
index 0825774..d3f8ff1 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/sender/conf/Constans.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/sender/conf/Constans.java
@@ -73,5 +73,6 @@ public class Constans {
 
   public static final String SYNC_END = "sync.end";
 
+  public static final String LOAD_LOG_NAME = "load.log";
 
 }
diff --git a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
index 7d16042..d98022e 100644
--- a/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
+++ b/server/src/test/java/org/apache/iotdb/db/engine/storagegroup/FileNodeManagerBenchmark.java
@@ -27,7 +27,7 @@ import org.apache.iotdb.db.exception.MetadataErrorException;
 import org.apache.iotdb.db.exception.PathErrorException;
 import org.apache.iotdb.db.metadata.MManager;
 import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
-import org.apache.iotdb.db.sync.test.RandomNum;
+import org.apache.iotdb.db.utils.RandomNum;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
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
index 4a7ac7e..4a258a5 100644
--- 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
@@ -1,596 +1,596 @@
-/**
- * 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;
-      }
-    }
-  }
-}
+///**
+// * 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;
+//      }
+//    }
+//  }
+//}
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
index 322dfe0..354ef74 100644
--- 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
@@ -1,374 +1,374 @@
-/**
- * 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
+///**
+// * 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/utils/RandomNum.java b/server/src/test/java/org/apache/iotdb/db/utils/RandomNum.java
new file mode 100644
index 0000000..436dc28
--- /dev/null
+++ b/server/src/test/java/org/apache/iotdb/db/utils/RandomNum.java
@@ -0,0 +1,70 @@
+/**
+ * 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.utils;
+
+import java.util.Random;
+
+public class RandomNum {
+
+  private static Random random = new Random();
+
+  private RandomNum() {
+    throw new IllegalStateException("Utility class");
+  }
+
+  public static long getRandomLong(long min, long max) {
+    return random.nextLong() % (max - min + 1) + min;
+  }
+
+  public static int getRandomInt(int min, int max) {
+    return (random.nextInt(10000) % (max - min) + min);
+  }
+
+  /**
+   * get random float between min and max.
+   */
+  public static float getRandomFloat(float min, float max) {
+
+    return (random.nextFloat() * (max - min) + min);
+  }
+
+  /**
+   * get random int between 0 and frequency.
+   */
+  public static int getAbnormalData(int frequency) {
+    return random.nextInt() % frequency;
+  }
+
+  /**
+   * get random text consisting of lowercase letters and numbers.
+   *
+   * @param length -the size of random text
+   */
+  public static String getRandomText(int length) {
+
+    String base = "abcdefghijklmnopqrstuvwxyz0123456789";
+    StringBuilder st = new StringBuilder();
+    for (int i = 0; i < length; i++) {
+      int number = random.nextInt(base.length());
+      st = st.append(base.charAt(number));
+    }
+    return st.toString();
+
+  }
+}
\ No newline at end of file