You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2021/12/01 02:57:45 UTC

[iotdb] 01/01: Merge branch 'master' into expr

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

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

commit 6dd6dbccb2404997edea52826f000e5fb46e57d0
Merge: ba4355a f43085e
Author: jt <jt...@163.com>
AuthorDate: Wed Dec 1 10:56:46 2021 +0800

    Merge branch 'master' into expr
    
    # Conflicts:
    #	cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/DataClusterServer.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/RaftServer.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
    #	cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java

 .github/workflows/cluster.yml                      |   50 +
 .github/workflows/main-unix.yml                    |    2 +-
 .github/workflows/main-win.yml                     |    2 +-
 .gitignore                                         |    1 -
 LICENSE-binary                                     |    6 +-
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4    |   27 +-
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |   76 +-
 cli/pom.xml                                        |   16 +-
 cli/src/assembly/resources/sbin/start-cli.bat      |    2 +-
 .../java/org/apache/iotdb/cli/AbstractCli.java     |    2 +-
 cli/src/main/java/org/apache/iotdb/cli/Cli.java    |   40 +-
 .../apache/iotdb/cli/IoTDBSyntaxHighlighter.java   |   76 +
 cli/src/main/java/org/apache/iotdb/cli/WinCli.java |  175 --
 .../org/apache/iotdb/cli/utils/JlineUtils.java     |   99 +
 .../org/apache/iotdb/tool/AbstractCsvTool.java     |    3 +-
 .../main/java/org/apache/iotdb/tool/ExportCsv.java |   97 +-
 .../main/java/org/apache/iotdb/tool/ImportCsv.java |   24 +-
 client-cpp/pom.xml                                 |    2 +-
 client-cpp/src/main/Session.h                      |    4 +
 client-py/SessionExample.py                        |   11 +-
 client-py/iotdb/Session.py                         |    1 +
 client-py/iotdb/utils/BitMap.py                    |    3 +-
 client-py/iotdb/utils/IoTDBConstants.py            |    1 +
 client-py/iotdb/utils/IoTDBRpcDataSet.py           |  140 +-
 client-py/iotdb/utils/SessionDataSet.py            |   34 +-
 client-py/iotdb/utils/Tablet.py                    |   10 +-
 client-py/tests/tablet_performance_comparison.py   |  129 +-
 client-py/tests/test_dataframe.py                  |   29 +-
 client-py/tests/test_todf.py                       |  216 ++
 cluster/pom.xml                                    |    4 +
 .../resources/conf/iotdb-cluster.properties        |    5 -
 cluster/src/assembly/resources/sbin/add-node.bat   |    2 +-
 cluster/src/assembly/resources/sbin/add-node.sh    |    2 +-
 .../src/assembly/resources/sbin/remove-node.bat    |    4 +-
 cluster/src/assembly/resources/sbin/remove-node.sh |    2 +-
 cluster/src/assembly/resources/sbin/start-node.bat |    4 +-
 cluster/src/assembly/resources/sbin/start-node.sh  |    2 +-
 cluster/src/assembly/resources/sbin/stop-node.bat  |    2 +-
 cluster/src/assembly/resources/sbin/stop-node.sh   |    2 +-
 .../java/org/apache/iotdb/cluster/ClientMain.java  |    3 +-
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |  693 +++++
 .../apache/iotdb/cluster/ClusterIoTDBMBean.java    |   36 +
 .../java/org/apache/iotdb/cluster/ClusterMain.java |  331 ---
 .../apache/iotdb/cluster/client/BaseFactory.java   |   54 +
 .../iotdb/cluster/client/ClientCategory.java       |   38 +
 .../apache/iotdb/cluster/client/ClientManager.java |  223 ++
 .../iotdb/cluster/client/ClientPoolFactory.java    |   98 +
 .../iotdb/cluster/client/DataClientProvider.java   |   95 -
 .../iotdb/cluster/client/IClientManager.java       |   35 +
 .../cluster/client/async/AsyncBaseFactory.java     |   68 +
 .../cluster/client/async/AsyncClientFactory.java   |   65 -
 .../cluster/client/async/AsyncClientPool.java      |  216 --
 .../cluster/client/async/AsyncDataClient.java      |  199 +-
 .../client/async/AsyncDataHeartbeatClient.java     |   81 -
 .../cluster/client/async/AsyncMetaClient.java      |  147 +-
 .../client/async/AsyncMetaHeartbeatClient.java     |   81 -
 .../cluster/client/sync/SyncClientAdaptor.java     |   60 +-
 .../cluster/client/sync/SyncClientFactory.java     |   40 -
 .../iotdb/cluster/client/sync/SyncClientPool.java  |  169 --
 .../iotdb/cluster/client/sync/SyncDataClient.java  |  114 +-
 .../client/sync/SyncDataHeartbeatClient.java       |   79 -
 .../iotdb/cluster/client/sync/SyncMetaClient.java  |  121 +-
 .../client/sync/SyncMetaHeartbeatClient.java       |   78 -
 .../apache/iotdb/cluster/config/ClusterConfig.java |    9 -
 .../iotdb/cluster/config/ClusterConstant.java      |   86 +
 .../iotdb/cluster/config/ClusterDescriptor.java    |   12 +-
 .../iotdb/cluster/coordinator/Coordinator.java     |  179 +-
 .../cluster/expr/ExprAppendNodeEntryHandler.java   |   24 -
 .../org/apache/iotdb/cluster/expr/ExprBench.java   |  123 -
 .../org/apache/iotdb/cluster/expr/ExprMember.java  |  305 ---
 .../org/apache/iotdb/cluster/expr/ExprServer.java  |  106 -
 .../apache/iotdb/cluster/expr/ExprVotingLog.java   |   59 -
 .../apache/iotdb/cluster/expr/SWRaftMember.java    |  206 ++
 .../apache/iotdb/cluster/expr/SequencerExpr.java   |  126 -
 .../apache/iotdb/cluster/expr/VotingLogList.java   |  111 -
 .../apache/iotdb/cluster/log/LogDispatcher.java    |   13 +-
 .../apache/iotdb/cluster/log/VotingLogList.java    |  104 +
 .../cluster/log/applier/AsyncDataLogApplier.java   |    4 +-
 .../iotdb/cluster/log/applier/BaseApplier.java     |   12 +-
 .../iotdb/cluster/log/applier/DataLogApplier.java  |   17 +-
 .../iotdb/cluster/log/catchup/LogCatchUpTask.java  |    5 +-
 .../manage/FilePartitionedSnapshotLogManager.java  |    4 +-
 .../log/manage/MetaSingleSnapshotLogManager.java   |   12 +-
 .../log/manage/PartitionedSnapshotLogManager.java  |    7 +-
 .../iotdb/cluster/log/manage/RaftLogManager.java   |   23 +-
 .../iotdb/cluster/log/snapshot/FileSnapshot.java   |   14 +-
 .../cluster/log/snapshot/MetaSimpleSnapshot.java   |   42 +-
 .../cluster/log/snapshot/PullSnapshotTask.java     |    5 +-
 .../log/snapshot/PullSnapshotTaskDescriptor.java   |    2 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   |  430 ++--
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |   79 +-
 .../cluster/partition/NodeAdditionResult.java      |    4 +-
 .../iotdb/cluster/partition/NodeRemovalResult.java |    4 +-
 .../iotdb/cluster/partition/PartitionGroup.java    |   36 +-
 .../iotdb/cluster/partition/PartitionTable.java    |    8 +-
 .../partition/balancer/DefaultSlotBalancer.java    |    6 +-
 .../cluster/partition/balancer/SlotBalancer.java   |    4 +-
 .../iotdb/cluster/partition/slot/SlotManager.java  |    2 +-
 .../partition/slot/SlotNodeAdditionResult.java     |    2 +-
 .../cluster/partition/slot/SlotPartitionTable.java |   48 +-
 .../iotdb/cluster/partition/slot/SlotStrategy.java |    2 +-
 .../partition/slot/SlotTimePartitionFilter.java    |    3 +-
 .../cluster/query/ClusterDataQueryExecutor.java    |    6 +-
 .../cluster/query/ClusterPhysicalGenerator.java    |   16 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |  388 ++-
 .../iotdb/cluster/query/ClusterPlanRouter.java     |   16 +-
 .../iotdb/cluster/query/ClusterQueryRouter.java    |   25 +-
 .../iotdb/cluster/query/LocalQueryExecutor.java    |   88 +-
 .../query/aggregate/ClusterAggregateExecutor.java  |    2 +-
 .../cluster/query/aggregate/ClusterAggregator.java |   38 +-
 .../cluster/query/fill/ClusterFillExecutor.java    |    7 +-
 .../cluster/query/fill/ClusterLinearFill.java      |   12 +-
 .../cluster/query/fill/ClusterPreviousFill.java    |   91 +-
 .../cluster/query/fill/PreviousFillArguments.java  |    2 +-
 .../ClusterGroupByFillNoVFilterDataSet.java        |   56 +
 .../groupby/ClusterGroupByFillVFilterDataSet.java  |   67 +
 .../groupby/ClusterGroupByNoVFilterDataSet.java    |    8 +-
 .../groupby/ClusterGroupByVFilterDataSet.java      |    6 +-
 .../query/groupby/MergeGroupByExecutor.java        |    2 +-
 .../query/groupby/RemoteGroupByExecutor.java       |   85 +-
 .../query/last/ClusterLastQueryExecutor.java       |   73 +-
 .../query/manage/ClusterSessionManager.java        |  137 +
 .../cluster/query/reader/ClusterReaderFactory.java |   87 +-
 .../cluster/query/reader/ClusterTimeGenerator.java |    2 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |   83 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |   15 +-
 .../query/reader/RemoteSimpleSeriesReader.java     |   15 +-
 .../mult/AssignPathAscPriorityMergeReader.java     |   49 +
 .../mult/AssignPathDescPriorityMergeReader.java    |   49 +
 .../reader/mult/AssignPathManagedMergeReader.java  |   43 +-
 .../reader/mult/AssignPathPriorityMergeReader.java |   66 -
 .../mult/IAssignPathPriorityMergeReader.java       |   47 +
 .../query/reader/mult/MultDataSourceInfo.java      |   63 +-
 .../cluster/query/reader/mult/MultElement.java     |   49 +
 .../query/reader/mult/RemoteMultSeriesReader.java  |   41 +-
 .../apache/iotdb/cluster/server/ClientServer.java  |  311 ---
 .../iotdb/cluster/server/ClusterRPCService.java    |  109 +
 .../cluster/server/ClusterRPCServiceMBean.java     |   35 +
 .../iotdb/cluster/server/ClusterTSServiceImpl.java |   99 +
 .../iotdb/cluster/server/DataClusterServer.java    | 1139 ---------
 .../iotdb/cluster/server/MetaClusterServer.java    |  423 ----
 .../cluster/server/PullSnapshotHintService.java    |   20 +-
 .../apache/iotdb/cluster/server/RaftServer.java    |  285 ---
 .../org/apache/iotdb/cluster/server/Response.java  |    3 +
 .../iotdb/cluster/server/StoppedMemberManager.java |   11 +-
 .../server/clusterinfo/ClusterInfoServer.java      |    1 +
 .../handlers/caller/AppendNodeEntryHandler.java    |    7 +-
 .../server/handlers/caller/HeartbeatHandler.java   |    6 +-
 .../handlers/caller/PreviousFillHandler.java       |   26 +-
 .../handlers/caller/ShowTimeSeriesHandler.java     |  133 +
 .../server/heartbeat/DataHeartbeatServer.java      |   83 -
 .../cluster/server/heartbeat/HeartbeatServer.java  |  212 --
 .../cluster/server/heartbeat/HeartbeatThread.java  |   29 +-
 .../server/heartbeat/MetaHeartbeatServer.java      |   92 -
 .../server/heartbeat/MetaHeartbeatThread.java      |    7 +-
 .../cluster/server/member/DataGroupMember.java     |   97 +-
 .../server/member/DataGroupMemberMBean.java        |   25 +
 .../cluster/server/member/MetaGroupMember.java     |  501 ++--
 .../server/member/MetaGroupMemberMBean.java        |   35 +
 .../iotdb/cluster/server/member/RaftMember.java    |  306 ++-
 .../cluster/server/member/RaftMemberMBean.java     |   53 +
 .../server/raft/AbstractDataRaftService.java       |   54 +
 .../server/raft/AbstractMetaRaftService.java       |   52 +
 .../cluster/server/raft/AbstractRaftService.java   |   76 +
 .../server/raft/DataRaftHeartBeatService.java      |   68 +
 .../server/raft/DataRaftHeartBeatServiceMBean.java |   22 +
 .../iotdb/cluster/server/raft/DataRaftService.java |   65 +
 .../cluster/server/raft/DataRaftServiceMBean.java  |   22 +
 .../server/raft/MetaRaftHeartBeatService.java      |   68 +
 .../server/raft/MetaRaftHeartBeatServiceMBean.java |   22 +
 .../iotdb/cluster/server/raft/MetaRaftService.java |   65 +
 .../cluster/server/raft/MetaRaftServiceMBean.java  |   22 +
 .../cluster/server/raft/RaftServiceHandler.java    |   43 +
 .../cluster/server/service/DataGroupEngine.java    |  510 ++++
 .../server/service/DataGroupEngineMBean.java       |   31 +
 .../server/service/DataGroupServiceImpls.java      |  776 ++++++
 .../cluster/server/service/MetaAsyncService.java   |   42 +-
 .../cluster/server/service/MetaSyncService.java    |   50 +-
 .../apache/iotdb/cluster/utils/ClientUtils.java    |   64 +-
 .../iotdb/cluster/utils/ClusterQueryUtils.java     |   57 +-
 .../apache/iotdb/cluster/utils/ClusterUtils.java   |   53 +-
 .../apache/iotdb/cluster/utils/PartitionUtils.java |   12 +-
 .../cluster/utils/nodetool/ClusterMonitor.java     |   32 +-
 .../cluster/utils/nodetool/function/Slot.java      |    2 +-
 .../iotdb/cluster/client/BaseClientTest.java       |  156 ++
 .../iotdb/cluster/client/ClientManagerTest.java    |  212 ++
 .../cluster/client/ClientPoolFactoryTest.java      |  262 ++
 .../cluster/client/DataClientProviderTest.java     |  242 --
 .../iotdb/cluster/client/MockClientManager.java    |   47 +
 .../cluster/client/async/AsyncClientPoolTest.java  |  209 --
 .../cluster/client/async/AsyncDataClientTest.java  |  109 +-
 .../client/async/AsyncDataHeartbeatClientTest.java |   60 -
 .../cluster/client/async/AsyncMetaClientTest.java  |  108 +-
 .../client/async/AsyncMetaHeartbeatClientTest.java |   61 -
 .../cluster/client/sync/SyncClientAdaptorTest.java |   18 +-
 .../cluster/client/sync/SyncClientPoolTest.java    |  167 --
 .../cluster/client/sync/SyncDataClientTest.java    |  172 +-
 .../client/sync/SyncDataHeartbeatClientTest.java   |   66 -
 .../cluster/client/sync/SyncMetaClientTest.java    |  170 +-
 .../client/sync/SyncMetaHeartbeatClientTest.java   |   66 -
 .../org/apache/iotdb/cluster/common/IoTDBTest.java |   18 +-
 .../cluster/common/TestAsyncClientFactory.java     |   55 -
 .../iotdb/cluster/common/TestAsyncDataClient.java  |    3 +-
 .../iotdb/cluster/common/TestAsyncMetaClient.java  |    9 +-
 .../iotdb/cluster/common/TestLogApplier.java       |    2 +-
 .../apache/iotdb/cluster/common/TestSnapshot.java  |    6 +-
 .../cluster/common/TestSyncClientFactory.java      |   88 -
 .../org/apache/iotdb/cluster/common/TestUtils.java |   21 +-
 .../cluster/integration/BaseSingleNodeTest.java    |   16 +-
 .../iotdb/cluster/integration/SingleNodeTest.java  |    7 +-
 .../apache/iotdb/cluster/log/LogParserTest.java    |    8 +-
 .../log/applier/AsyncDataLogApplierTest.java       |    2 +-
 .../cluster/log/applier/DataLogApplierTest.java    |  182 +-
 .../cluster/log/applier/MetaLogApplierTest.java    |    6 +-
 .../iotdb/cluster/log/catchup/CatchUpTaskTest.java |    5 -
 .../cluster/log/catchup/LogCatchUpTaskTest.java    |    7 +-
 .../log/catchup/SnapshotCatchUpTaskTest.java       |    9 +-
 .../cluster/log/logtypes/SerializeLogTest.java     |    8 +-
 .../FilePartitionedSnapshotLogManagerTest.java     |    2 +-
 .../manage/MetaSingleSnapshotLogManagerTest.java   |    2 +-
 .../cluster/log/snapshot/DataSnapshotTest.java     |   12 +-
 .../cluster/log/snapshot/FileSnapshotTest.java     |    2 +-
 .../log/snapshot/MetaSimpleSnapshotTest.java       |   46 +-
 .../log/snapshot/PartitionedSnapshotTest.java      |    2 +-
 .../cluster/log/snapshot/PullSnapshotTaskTest.java |    7 +-
 .../iotdb/cluster/partition/MManagerWhiteBox.java  |    2 +-
 .../cluster/partition/SlotPartitionTableTest.java  |    6 +-
 .../apache/iotdb/cluster/query/BaseQueryTest.java  |    9 +-
 .../query/ClusterAggregateExecutorTest.java        |   49 +-
 .../query/ClusterDataQueryExecutorTest.java        |    7 +-
 .../query/ClusterPhysicalGeneratorTest.java        |    3 +-
 .../cluster/query/ClusterPlanExecutorTest.java     |    8 +-
 .../iotdb/cluster/query/ClusterPlannerTest.java    |    1 -
 .../cluster/query/ClusterQueryRouterTest.java      |   54 +-
 .../query/fill/ClusterFillExecutorTest.java        |   17 +-
 .../ClusterGroupByNoVFilterDataSetTest.java        |   11 +-
 .../groupby/ClusterGroupByVFilterDataSetTest.java  |   17 +-
 .../query/groupby/MergeGroupByExecutorTest.java    |    7 +-
 .../query/groupby/RemoteGroupByExecutorTest.java   |    7 +-
 .../cluster/query/manage/QueryCoordinatorTest.java |    8 +-
 .../query/reader/ClusterReaderFactoryTest.java     |   11 +-
 .../query/reader/ClusterTimeGeneratorTest.java     |    9 +-
 .../cluster/query/reader/DatasourceInfoTest.java   |   55 +-
 .../reader/RemoteSeriesReaderByTimestampTest.java  |  132 +-
 .../query/reader/RemoteSimpleSeriesReaderTest.java |  104 +-
 .../mult/AssignPathManagedMergeReaderTest.java     |  120 +-
 .../reader/mult/RemoteMultSeriesReaderTest.java    |  222 +-
 .../server/clusterinfo/ClusterInfoServerTest.java  |    5 +-
 .../clusterinfo/ClusterInfoServiceImplTest.java    |   28 +-
 .../caller/AppendGroupEntryHandlerTest.java        |    3 +-
 .../caller/AppendNodeEntryHandlerTest.java         |    3 +-
 .../handlers/caller/ElectionHandlerTest.java       |    3 +-
 .../handlers/caller/HeartbeatHandlerTest.java      |    3 +-
 .../handlers/caller/LogCatchUpHandlerTest.java     |    3 +-
 .../handlers/forwarder/ForwardPlanHandlerTest.java |    2 +-
 .../server/heartbeat/DataHeartbeatThreadTest.java  |    5 -
 .../server/heartbeat/HeartbeatThreadTest.java      |   23 +-
 .../server/heartbeat/MetaHeartbeatThreadTest.java  |    7 +-
 .../iotdb/cluster/server/member/BaseMember.java    |   66 +-
 .../cluster/server/member/DataGroupMemberTest.java |   69 +-
 .../cluster/server/member/MetaGroupMemberTest.java |  192 +-
 .../cluster/server/member/RaftMemberTest.java      |    4 +-
 .../cluster/utils/CreateTemplatePlanUtil.java      |   74 +
 .../iotdb/cluster/utils/SerializeUtilTest.java     |    2 +-
 .../resources/node1conf/iotdb-engine.properties    |   12 +-
 .../resources/node2conf/iotdb-engine.properties    |   12 +-
 .../resources/node3conf/iotdb-engine.properties    |   12 +-
 compile-tools/thrift/pom.xml                       |    2 +-
 distribution/src/assembly/all.xml                  |    4 +
 distribution/src/assembly/server.xml               |    4 +
 docs/Development/ContributeGuide.md                |    2 +-
 docs/Download/README.md                            |   34 +-
 docs/SystemDesign/DataQuery/AlignByDeviceQuery.md  |   12 +-
 docs/UserGuide/API/Programming-Java-Native-API.md  |  151 +-
 docs/UserGuide/Advanced-Features/Triggers.md       |    2 +-
 docs/UserGuide/Appendix/SQL-Reference.md           |   89 +-
 docs/UserGuide/Appendix/Status-Codes.md            |    1 +
 docs/UserGuide/Cluster/Cluster-Setup-Example.md    |   73 +-
 .../Data-Concept/Data-Model-and-Terminology.md     |   34 +-
 .../UserGuide/Data-Concept/Measurement-Template.md |   84 -
 docs/UserGuide/Data-Concept/Schema-Template.md     |   84 +
 .../Integration-Test-refactoring-tutorial.md       |  161 ++
 .../DDL-Data-Definition-Language.md                |   75 +-
 .../DML-Data-Manipulation-Language.md              |   83 +-
 .../IoTDB-SQL-Language/Maintenance-Command.md      |    4 +
 .../IoTDB-SQL-Language/Syntax-Conventions.md       |   15 +-
 docs/UserGuide/System-Tools/CSV-Tool.md            |   10 +-
 docs/zh/Download/README.md                         |   34 +-
 .../SystemDesign/DataQuery/AlignByDeviceQuery.md   |   12 +-
 .../UserGuide/API/Programming-Java-Native-API.md   |  139 +-
 docs/zh/UserGuide/Advanced-Features/Triggers.md    |    2 +-
 docs/zh/UserGuide/Appendix/SQL-Reference.md        |   87 +-
 docs/zh/UserGuide/Appendix/Status-Codes.md         |    2 +
 docs/zh/UserGuide/Cluster/Cluster-Setup-Example.md |   72 +-
 .../Communication-Service-Protocol/RestService.md  |  268 ++
 docs/zh/UserGuide/Comparison/TSDB-Comparison.md    |    2 +-
 .../Data-Concept/Data-Model-and-Terminology.md     |   33 +-
 .../UserGuide/Data-Concept/Measurement-Template.md |   81 -
 docs/zh/UserGuide/Data-Concept/Schema-Template.md  |   81 +
 .../Integration-Test-refactoring-tutorial.md       |  163 ++
 .../DDL-Data-Definition-Language.md                |   72 +-
 .../DML-Data-Manipulation-Language.md              |   84 +-
 .../IoTDB-SQL-Language/Maintenance-Command.md      |    3 +
 .../IoTDB-SQL-Language/Syntax-Conventions.md       |   15 +-
 docs/zh/UserGuide/System-Tools/CSV-Tool.md         |   69 +-
 example/client-cpp-example/pom.xml                 |    2 +-
 .../java/org/apache/iotdb/flink/TsFileUtils.java   |    4 +-
 .../iotdb/hadoop/tsfile/TSMRWriteExample.java      |    6 +-
 .../apache/iotdb/hadoop/tsfile/TsFileHelper.java   |    8 +-
 .../iotdb/hadoop/tsfile/TsFileWriteToHDFS.java     |    6 +-
 .../iotdb/AlignedTimeseriesSessionExample.java     |  222 +-
 .../iotdb/HybridTimeseriesSessionExample.java      |   11 +-
 .../org/apache/iotdb/SessionConcurrentExample.java |   46 +-
 .../main/java/org/apache/iotdb/SessionExample.java |  269 +-
 .../org/apache/iotdb/trigger/TriggerExample.java   |    2 +-
 .../iotdb/tsfile/TsFileForceAppendWrite.java       |   12 +-
 .../java/org/apache/iotdb/tsfile/TsFileRead.java   |    8 +-
 .../apache/iotdb/tsfile/TsFileSequenceRead.java    |   87 +-
 .../tsfile/TsFileWriteAlignedWithTSRecord.java     |   89 +
 .../iotdb/tsfile/TsFileWriteAlignedWithTablet.java |  141 ++
 .../iotdb/tsfile/TsFileWriteVectorWithTablet.java  |  118 -
 .../iotdb/tsfile/TsFileWriteWithTSRecord.java      |   66 +-
 .../apache/iotdb/tsfile/TsFileWriteWithTablet.java |  106 +-
 flink-iotdb-connector/pom.xml                      |    5 +
 .../iotdb/flink/tsfile/TsFileInputFormat.java      |    6 +-
 .../tsfile/RowTsFileOutputFormatTestBase.java      |    4 +-
 grafana/pom.xml                                    |    4 +-
 .../controller/DatabaseConnectController.java      |   63 +-
 .../iotdb/web/grafana/dao/impl/BasicDaoImpl.java   |   18 +-
 .../grafana/service/DatabaseConnectService.java    |    2 -
 .../service/impl/DatabaseConnectServiceImpl.java   |    5 -
 .../apache/iotdb/hadoop/fileSystem/HDFSInput.java  |    5 +
 .../iotdb/hadoop/tsfile/TSFRecordReader.java       |    4 +-
 .../apache/iotdb/hadoop/tsfile/TSFHadoopTest.java  |   49 +-
 .../iotdb/hadoop/tsfile/TsFileTestHelper.java      |    2 +-
 hive-connector/pom.xml                             |   16 -
 .../org/apache/iotdb/hive/TSFHiveRecordWriter.java |    3 +-
 .../apache/iotdb/hive/TSFHiveInputFormatTest.java  |   27 +-
 .../apache/iotdb/hive/TSFHiveRecordReaderTest.java |   28 +-
 .../org/apache/iotdb/hive/TsFileTestHelper.java    |    2 +-
 integration/README.md                              |  120 +
 integration/pic/Add_New_Configuration.png          |  Bin 0 -> 129654 bytes
 integration/pic/Cluster_Category.png               |  Bin 0 -> 175311 bytes
 integration/pic/Fork_mode.png                      |  Bin 0 -> 188976 bytes
 integration/pic/Run(Menu).png                      |  Bin 0 -> 99077 bytes
 integration/pic/Standalone_Category.png            |  Bin 0 -> 183256 bytes
 integration/pom.xml                                |  283 +++
 integration/src/assembly/cluster.xml               |   47 +
 .../iotdb/integration/env/ClusterEnvBase.java      |  245 ++
 .../iotdb/integration/env/ClusterEnvConfig.java    |  117 +
 .../apache/iotdb/integration/env/ClusterNode.java  |  166 ++
 .../iotdb/integration/env/ConfigFactory.java       |   52 +
 .../apache/iotdb/integration/env/EnvFactory.java   |   57 +
 .../iotdb/integration/env/FiveNodeCluster1Env.java |   64 +
 .../iotdb/integration/env/RemoteEnvConfig.java     |   23 +
 .../iotdb/integration/env/RemoteServerEnv.java     |   81 +
 .../apache/iotdb/itbase/category/ClusterTest.java  |   21 +
 .../iotdb/itbase/category/LocalStandaloneTest.java |   21 +
 .../apache/iotdb/itbase/category/RemoteTest.java   |   21 +
 .../org/apache/iotdb/itbase/env/BaseConfig.java    |   88 +
 .../java/org/apache/iotdb/itbase/env/BaseEnv.java  |   35 +
 .../db/engine/trigger/example/Accumulator.java     |    0
 .../iotdb/db/engine/trigger/example/Counter.java   |    0
 .../iotdb/db/integration/IOTDBGroupByIT.java       |  996 ++++++++
 .../integration/IOTDBGroupByInnerIntervalIT.java   |  335 +++
 .../db/integration/IOTDBInsertAlignedValuesIT.java |  222 ++
 .../apache/iotdb/db/integration/IOTDBInsertIT.java |  126 +
 .../apache/iotdb/db/integration/IoTDBAliasIT.java  |  364 +++
 .../iotdb/db/integration/IoTDBAlignByDeviceIT.java |  960 +++++++
 .../iotdb/db/integration/IoTDBArithmeticIT.java    |  287 +++
 .../org/apache/iotdb/db/integration/IoTDBAsIT.java |  564 +++++
 .../db/integration/IoTDBAutoCreateSchemaIT.java    |  209 ++
 .../iotdb/db/integration/IoTDBCheckConfigIT.java   |  145 ++
 .../iotdb/db/integration/IoTDBClearCacheIT.java    |  171 ++
 .../apache/iotdb/db/integration/IoTDBCloseIT.java  |  191 ++
 .../iotdb/db/integration/IoTDBCompleteIT.java      |  488 ++++
 .../iotdb/db/integration/IoTDBCompressTypeIT.java  |  101 +
 .../db/integration/IoTDBContinuousQueryIT.java     |  416 +++
 .../IoTDBCreateAlignedTimeseriesIT.java            |  109 +
 .../db/integration/IoTDBCreateSnapshotIT.java      |  180 ++
 .../db/integration/IoTDBCreateStorageGroupIT.java  |  131 +
 .../db/integration/IoTDBCreateTimeseriesIT.java    |  170 ++
 .../apache/iotdb/db/integration/IoTDBDaemonIT.java |  446 ++++
 .../db/integration/IoTDBDeleteStorageGroupIT.java  |  160 ++
 .../db/integration/IoTDBDeleteTimeseriesIT.java    |  215 ++
 .../iotdb/db/integration/IoTDBDeletionIT.java      |  500 ++++
 .../iotdb/db/integration/IoTDBDisableAlignIT.java  |  392 +++
 .../iotdb/db/integration/IoTDBEncodingIT.java      |  350 +++
 .../db/integration/IoTDBEngineTimeGeneratorIT.java |  292 +++
 .../iotdb/db/integration/IoTDBExecuteBatchIT.java  |  194 ++
 .../iotdb/db/integration/IoTDBFilePathUtilsIT.java |   99 +
 .../apache/iotdb/db/integration/IoTDBFillIT.java   |  972 +++++++
 .../db/integration/IoTDBFloatPrecisionIT.java      |  170 ++
 .../db/integration/IoTDBFlushQueryMergeIT.java     |  203 ++
 .../iotdb/db/integration/IoTDBFuzzyQueryIT.java    |  295 +++
 .../iotdb/db/integration/IoTDBGroupByFillIT.java   | 2647 ++++++++++++++++++++
 .../db/integration/IoTDBGroupByFillMixPathsIT.java |  489 ++++
 .../integration/IoTDBGroupByFillWithRangeIT.java   |  179 ++
 .../db/integration/IoTDBGroupByMonthFillIT.java    |  277 ++
 .../iotdb/db/integration/IoTDBGroupByMonthIT.java  |  273 ++
 .../iotdb/db/integration/IoTDBGroupByUnseqIT.java  |  185 ++
 .../org/apache/iotdb/db/integration/IoTDBInIT.java |  247 ++
 .../db/integration/IoTDBInsertMultiRowIT.java      |  128 +
 .../iotdb/db/integration/IoTDBInsertNaNIT.java     |  197 ++
 .../db/integration/IoTDBInsertWithQueryIT.java     |  468 ++++
 .../db/integration/IoTDBInsertWithoutTimeIT.java   |  132 +
 .../iotdb/db/integration/IoTDBKillQueryIT.java     |   80 +
 .../iotdb/db/integration/IoTDBLargeDataIT.java     |  373 +++
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |  599 +++++
 .../iotdb/db/integration/IoTDBLimitSlimitIT.java   |  204 ++
 ...IoTDBLoadExternalTsFileWithTimePartitionIT.java |  330 +++
 .../db/integration/IoTDBLoadExternalTsfileIT.java  |  825 ++++++
 .../integration/IoTDBManageTsFileResourceIT.java   |  295 +++
 .../apache/iotdb/db/integration/IoTDBMergeIT.java  |  332 +++
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |  603 +++++
 .../iotdb/db/integration/IoTDBMultiDeviceIT.java   |  292 +++
 .../IoTDBMultiOverlappedChunkInUnseqIT.java        |  110 +
 .../db/integration/IoTDBMultiOverlappedPageIT.java |  166 ++
 .../iotdb/db/integration/IoTDBMultiSeriesIT.java   |  471 ++++
 .../db/integration/IoTDBMultiStatementsIT.java     |  187 ++
 .../iotdb/db/integration/IoTDBNestedQueryIT.java   |  591 +++++
 .../db/integration/IoTDBNewTsFileCompactionIT.java | 1067 ++++++++
 .../iotdb/db/integration/IoTDBNumberPathIT.java    |  483 ++++
 .../db/integration/IoTDBOverlappedPageIT.java      |  194 ++
 .../db/integration/IoTDBPathNumOverLimitIT.java    |   75 +
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     |  685 +++++
 .../db/integration/IoTDBQueryMemoryControlIT.java  |  277 ++
 .../iotdb/db/integration/IoTDBQueryTimeoutIT.java  |  156 ++
 .../iotdb/db/integration/IoTDBQuotedPathIT.java    |  125 +
 .../iotdb/db/integration/IoTDBRecoverIT.java       |  438 ++++
 .../db/integration/IoTDBRecoverUnclosedIT.java     |  291 +++
 .../db/integration/IoTDBRemovePartitionIT.java     |  333 +++
 .../iotdb/db/integration/IoTDBRestartIT.java       |  462 ++++
 .../iotdb/db/integration/IoTDBResultSetIT.java     |  134 +
 .../db/integration/IoTDBRpcCompressionIT.java      |  140 ++
 .../IoTDBSameMeasurementsDifferentTypesIT.java     |  182 ++
 .../db/integration/IoTDBSchemaTemplateIT.java      |  180 ++
 .../iotdb/db/integration/IoTDBSelectIntoIT.java    |  673 +++++
 .../iotdb/db/integration/IoTDBSensorUpdateIT.java  |   87 +
 .../db/integration/IoTDBSequenceDataQueryIT.java   |  329 +++
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |  453 ++++
 .../db/integration/IoTDBSessionTimeoutIT.java      |   85 +
 .../IoTDBSetSystemReadOnlyWritableIT.java          |  256 ++
 .../apache/iotdb/db/integration/IoTDBSettleIT.java |   97 +
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   | 1286 ++++++++++
 .../integration/IoTDBSizeTieredCompactionIT.java   | 1344 ++++++++++
 .../integration/IoTDBSortedShowTimeseriesIT.java   |  326 +++
 .../iotdb/db/integration/IoTDBTagAlterIT.java      |  624 +++++
 .../apache/iotdb/db/integration/IoTDBTagIT.java    | 1114 ++++++++
 .../iotdb/db/integration/IoTDBTimePartitionIT.java |   92 +
 .../iotdb/db/integration/IoTDBTimeZoneIT.java      |  158 ++
 .../iotdb/db/integration/IoTDBTracingIT.java       |   84 +
 .../db/integration/IoTDBTriggerExecutionIT.java    |  618 +++++
 .../db/integration/IoTDBTriggerManagementIT.java   |  503 ++++
 .../apache/iotdb/db/integration/IoTDBTtlIT.java    |  221 ++
 .../iotdb/db/integration/IoTDBUDFManagementIT.java |  396 +++
 .../db/integration/IoTDBUDFWindowQueryIT.java      |  632 +++++
 .../integration/IoTDBUDTFAlignByTimeQueryIT.java   |  823 ++++++
 .../db/integration/IoTDBUDTFBuiltinFunctionIT.java |  356 +++
 .../db/integration/IoTDBUDTFHybridQueryIT.java     |  162 ++
 .../db/integration/IoTDBUDTFNonAlignQueryIT.java   |  341 +++
 .../iotdb/db/integration/IoTDBVersionIT.java       |   68 +
 .../db/integration/IoTDBWithoutAllNullIT.java      |  257 ++
 .../db/integration/IoTDBWithoutAnyNullIT.java      |  216 ++
 .../aggregation/IoTDBAggregationByLevelIT.java     |  537 ++++
 .../aggregation/IoTDBAggregationDeleteIT.java      |   94 +
 .../aggregation/IoTDBAggregationIT.java            | 1020 ++++++++
 .../aggregation/IoTDBAggregationLargeDataIT.java   | 1037 ++++++++
 .../aggregation/IoTDBAggregationSmallDataIT.java   |  808 ++++++
 .../db/integration/aligned/AlignedWriteUtil.java   |  142 ++
 .../IoTDBAggregationWithoutValueFilter2IT.java     |   66 +
 .../IoTDBAggregationWithoutValueFilterIT.java      |  447 ++++
 ...gregationWithoutValueFilterWithDeletion2IT.java |   83 +
 ...ggregationWithoutValueFilterWithDeletionIT.java |  447 ++++
 .../aligned/IoTDBDeleteTimeseriesIT.java           |  218 ++
 .../db/integration/aligned/IoTDBDeletionIT.java    |  522 ++++
 .../db/integration/aligned/IoTDBLastQuery2IT.java  |   66 +
 .../db/integration/aligned/IoTDBLastQueryIT.java   |  377 +++
 .../aligned/IoTDBLastQueryWithDeletion2IT.java     |   81 +
 .../aligned/IoTDBLastQueryWithDeletionIT.java      |  380 +++
 .../aligned/IoTDBLastQueryWithoutLastCache2IT.java |   69 +
 .../aligned/IoTDBLastQueryWithoutLastCacheIT.java  |  382 +++
 ...DBLastQueryWithoutLastCacheWithDeletion2IT.java |   86 +
 ...TDBLastQueryWithoutLastCacheWithDeletionIT.java |  384 +++
 .../aligned/IoTDBRawQueryWithValueFilter2IT.java   |   66 +
 .../aligned/IoTDBRawQueryWithValueFilterIT.java    |  764 ++++++
 ...oTDBRawQueryWithValueFilterWithDeletion2IT.java |   83 +
 ...IoTDBRawQueryWithValueFilterWithDeletionIT.java |  779 ++++++
 .../IoTDBRawQueryWithoutValueFilter2IT.java        |   67 +
 .../aligned/IoTDBRawQueryWithoutValueFilterIT.java |  634 +++++
 ...BRawQueryWithoutValueFilterWithDeletion2IT.java |   84 +
 ...DBRawQueryWithoutValueFilterWithDeletionIT.java |  612 +++++
 .../db/integration/auth/IoTDBAuthorizationIT.java  | 1181 +++++++++
 .../iotdb/db/integration/env/StandaloneEnv.java    |   80 +
 .../db/integration/env/StandaloneEnvConfig.java    |  109 +
 .../iotdb/db/query/udf/example/Accumulator.java    |  110 +
 .../apache/iotdb/db/query/udf/example/Adder.java   |   96 +
 .../apache/iotdb/db/query/udf/example/Counter.java |    0
 .../org/apache/iotdb/db/query/udf/example/Max.java |    0
 .../iotdb/db/query/udf/example/Multiplier.java     |    0
 .../SlidingSizeWindowConstructorTester0.java       |    0
 .../SlidingSizeWindowConstructorTester1.java       |    0
 .../SlidingTimeWindowConstructionTester.java       |    0
 .../db/query/udf/example/TerminateTester.java      |    0
 .../iotdb/db/query/udf/example/ValidateTester.java |    0
 .../iotdb/session/IoTDBSessionComplexIT.java       |  930 +++++++
 .../iotdb/session/IoTDBSessionIteratorIT.java      |  354 +++
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java | 1487 +++++++++++
 .../src/test/resources/iotdb-engine.properties     |   20 +
 integration/src/test/resources/logback.xml         |   58 +
 jdbc/pom.xml                                       |    5 +
 .../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java     |    4 +-
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   10 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   |   20 +-
 .../org/apache/iotdb/jdbc/IoTDBResultMetadata.java |   58 +-
 .../java/org/apache/iotdb/jdbc/StringUtils.java    |   19 +-
 metrics/ReadMe.md                                  |  151 ++
 metrics/dropwizard-metrics/pom.xml                 |   54 +
 .../dropwizard/DropwizardMetricManager.java        |  410 +++
 .../iotdb/metrics/dropwizard/MetricName.java       |  134 +
 .../dropwizard/reporter/DropwizardJmxReporter.java |   75 +
 .../reporter/DropwizardPrometheusReporter.java     |   89 +
 .../prometheus/DropwizardMetricsExporter.java      |  197 ++
 .../dropwizard/reporter/prometheus/MetricType.java |   38 +
 .../reporter/prometheus/PrometheusReporter.java    |  233 ++
 .../reporter/prometheus/PrometheusSender.java      |   63 +
 .../reporter/prometheus/PrometheusTextWriter.java  |   79 +
 .../reporter/prometheus/PushGateway.java           |  150 ++
 .../dropwizard/reporter/prometheus/TextFormat.java |   27 +
 .../metrics/dropwizard/type/DropwizardCounter.java |   45 +
 .../metrics/dropwizard/type/DropwizardGauge.java   |   62 +
 .../dropwizard/type/DropwizardHistogram.java       |   47 +
 .../type/DropwizardHistogramSnapshot.java          |   73 +
 .../metrics/dropwizard/type/DropwizardRate.java    |   94 +
 .../metrics/dropwizard/type/DropwizardTimer.java   |   49 +
 .../org.apache.iotdb.metrics.MetricManager         |   18 +
 .../services/org.apache.iotdb.metrics.Reporter     |   19 +
 .../dropwizard/DropwizardMetricManagerTest.java    |  272 ++
 .../metrics/dropwizard/DropwizardMetricTest.java   |  181 ++
 .../dropwizard/DropwizardMetricTestPlan.java       |   62 +
 .../metrics/dropwizard/PrometheusRunTest.java      |   42 +
 .../src/test/resources/iotdb-metric.yml            |   42 +
 metrics/interface/pom.xml                          |   73 +
 metrics/interface/src/main/assembly/metric.xml     |   40 +
 .../main/assembly/resources/conf/iotdb-metric.yml  |   42 +
 .../apache/iotdb/metrics/CompositeReporter.java    |   81 +
 .../org/apache/iotdb/metrics/MetricManager.java    |  172 ++
 .../org/apache/iotdb/metrics/MetricService.java    |  156 ++
 .../java/org/apache/iotdb/metrics/Reporter.java    |   36 +
 .../apache/iotdb/metrics/config/MetricConfig.java  |  106 +
 .../metrics/config/MetricConfigDescriptor.java     |   88 +
 .../iotdb/metrics/config/MetricConstant.java       |   29 +
 .../iotdb/metrics/impl/DoNothingCounter.java       |   39 +
 .../apache/iotdb/metrics/impl/DoNothingGauge.java  |   34 +
 .../iotdb/metrics/impl/DoNothingHistogram.java     |   41 +
 .../metrics/impl/DoNothingHistogramSnapshot.java   |   66 +
 .../iotdb/metrics/impl/DoNothingMetricManager.java |  178 ++
 .../apache/iotdb/metrics/impl/DoNothingRate.java   |   59 +
 .../apache/iotdb/metrics/impl/DoNothingTimer.java  |   43 +
 .../org/apache/iotdb/metrics/type/Counter.java     |   31 +
 .../java/org/apache/iotdb/metrics/type/Gauge.java  |   28 +
 .../org/apache/iotdb/metrics/type/Histogram.java   |   31 +
 .../iotdb/metrics/type/HistogramSnapshot.java      |   54 +
 .../org/apache/iotdb/metrics/type/IMetric.java     |   22 +
 .../java/org/apache/iotdb/metrics/type/Rate.java   |   43 +
 .../java/org/apache/iotdb/metrics/type/Timer.java  |   53 +
 .../apache/iotdb/metrics/utils/MonitorType.java    |   55 +
 .../iotdb/metrics/utils/PredefinedMetric.java      |   24 +
 .../apache/iotdb/metrics/utils/ReporterType.java   |   33 +
 .../iotdb/metrics/config/MetricConfigTest.java     |   57 +
 .../src/main/test/resources/iotdb-metric.yml       |   43 +
 metrics/micrometer-metrics/pom.xml                 |   57 +
 .../iotdb/metrics/micrometer/MeterIdUtils.java     |   32 +
 .../micrometer/MicrometerMetricManager.java        |  492 ++++
 .../micrometer/reporter/MicrometerJmxReporter.java |   82 +
 .../reporter/MicrometerPrometheusReporter.java     |  102 +
 .../metrics/micrometer/type/MicrometerCounter.java |   45 +
 .../metrics/micrometer/type/MicrometerGauge.java   |   47 +
 .../micrometer/type/MicrometerHistogram.java       |   47 +
 .../type/MicrometerHistogramSnapshot.java          |   90 +
 .../metrics/micrometer/type/MicrometerRate.java    |   81 +
 .../metrics/micrometer/type/MicrometerTimer.java   |   54 +
 .../org.apache.iotdb.metrics.MetricManager         |   18 +
 .../services/org.apache.iotdb.metrics.Reporter     |   19 +
 .../micrometer/MicrometerMetricManagerTest.java    |   52 +
 .../metrics/micrometer/MicrometerMetricTest.java   |  181 ++
 .../micrometer/MicrometerMetricTestPlan.java       |   62 +
 .../src/test/resources/iotdb-metric.yml            |   42 +
 metrics/pom.xml                                    |   40 +
 openapi/pom.xml                                    |  124 +
 openapi/src/main/openapi3/iotdb-rest.yaml          |  167 ++
 pom.xml                                            |   49 +-
 server/pom.xml                                     |   11 +
 .../resources/conf/iotdb-engine.properties         |   13 +-
 server/src/assembly/resources/conf/iotdb-env.bat   |   28 +-
 server/src/assembly/resources/conf/iotdb-env.sh    |   11 +-
 .../assembly/resources/conf/iotdb-rest.properties  |   55 +
 server/src/assembly/server.xml                     |    4 +
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |    7 +-
 .../iotdb/db/auth/authorizer/OpenIdAuthorizer.java |    2 +-
 .../db/concurrent/IoTDBDaemonThreadFactory.java    |   37 +
 .../db/concurrent/IoTDBThreadPoolFactory.java      |  186 +-
 .../org/apache/iotdb/db/concurrent/ThreadName.java |   13 +-
 .../db/concurrent/threadpool/IThreadPoolMBean.java |   45 +
 .../WrappedScheduledExecutorService.java           |  193 ++
 .../WrappedScheduledExecutorServiceMBean.java      |   22 +
 .../WrappedSingleThreadExecutorService.java        |  119 +
 .../WrappedSingleThreadExecutorServiceMBean.java   |   22 +
 .../WrappedSingleThreadScheduledExecutor.java      |  141 ++
 .../WrappedSingleThreadScheduledExecutorMBean.java |   22 +
 .../threadpool/WrappedThreadPoolExecutor.java      |   82 +
 .../threadpool/WrappedThreadPoolExecutorMBean.java |   22 +
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |   39 +-
 .../org/apache/iotdb/db/conf/IoTDBConfigCheck.java |   37 +-
 .../org/apache/iotdb/db/conf/IoTDBConstant.java    |    6 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   23 +-
 .../iotdb/db/conf/rest/IoTDBRestServiceCheck.java  |   65 +
 .../iotdb/db/conf/rest/IoTDBRestServiceConfig.java |  143 ++
 .../db/conf/rest/IoTDBRestServiceDescriptor.java   |  162 ++
 .../org/apache/iotdb/db/constant/TestConstant.java |  143 ++
 .../apache/iotdb/db/cq/ContinuousQueryService.java |    4 +-
 .../apache/iotdb/db/cq/ContinuousQueryTask.java    |    2 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |   34 +-
 .../iotdb/db/engine/cache/AccountableString.java   |   64 -
 .../iotdb/db/engine/cache/BloomFilterCache.java    |  188 ++
 .../db/engine/cache/CacheHitRatioMonitor.java      |   25 +
 .../engine/cache/CacheHitRatioMonitorMXBean.java   |   10 +
 .../db/engine/cache/TimeSeriesMetadataCache.java   |  203 +-
 .../db/engine/compaction/CompactionScheduler.java  |    3 +-
 .../engine/compaction/CompactionTaskManager.java   |   44 +-
 .../db/engine/compaction/TsFileIdentifier.java     |  184 ++
 .../AbstractCrossSpaceCompactionSelector.java      |    1 +
 .../compaction/cross/CrossCompactionStrategy.java  |    2 +-
 .../cross/inplace/InplaceCompactionTask.java       |    7 -
 .../inplace/manage/CrossSpaceMergeContext.java     |    2 +-
 .../inplace/manage/CrossSpaceMergeResource.java    |    7 +-
 .../cross/inplace/manage/MergeManager.java         |    4 +-
 .../recover/InplaceCompactionLogAnalyzer.java      |  353 +++
 .../inplace/recover/InplaceCompactionLogger.java   |  150 ++
 .../cross/inplace/recover/LogAnalyzer.java         |  328 ---
 .../cross/inplace/recover/MergeLogger.java         |  140 --
 .../cross/inplace/selector/IMergePathSelector.java |    2 +-
 .../cross/inplace/selector/NaivePathSelector.java  |    2 +-
 .../cross/inplace/task/CrossSpaceMergeTask.java    |   25 +-
 .../cross/inplace/task/MergeFileTask.java          |   28 +-
 .../cross/inplace/task/MergeMultiChunkTask.java    |   30 +-
 .../cross/inplace/task/RecoverCrossMergeTask.java  |   25 +-
 .../AbstractInnerSpaceCompactionSelector.java      |    1 +
 .../inner/AbstractInnerSpaceCompactionTask.java    |    2 +
 .../compaction/inner/InnerCompactionStrategy.java  |    2 +-
 .../SizeTieredCompactionRecoverTask.java           |   85 +-
 .../sizetiered/SizeTieredCompactionSelector.java   |    2 +-
 .../inner/sizetiered/SizeTieredCompactionTask.java |  121 +-
 .../inner/utils/InnerSpaceCompactionUtils.java     |   20 +-
 .../utils/SizeTieredCompactionLogAnalyzer.java     |   27 +-
 .../inner/utils/SizeTieredCompactionLogger.java    |   13 +-
 .../compaction/task/AbstractCompactionTask.java    |   10 +-
 .../compaction/task/CompactionRecoverTask.java     |    7 +-
 .../apache/iotdb/db/engine/flush/FlushManager.java |    3 +-
 .../iotdb/db/engine/flush/MemTableFlushTask.java   |  155 +-
 .../iotdb/db/engine/flush/NotifyFlushMemTable.java |    7 -
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  353 ++-
 .../engine/memtable/AlignedWritableMemChunk.java   |  363 +++
 .../memtable/AlignedWritableMemChunkGroup.java     |  108 +
 .../apache/iotdb/db/engine/memtable/IMemTable.java |   27 +-
 .../db/engine/memtable/IWritableMemChunk.java      |   37 +-
 .../db/engine/memtable/IWritableMemChunkGroup.java |   53 +
 .../db/engine/memtable/PrimitiveMemTable.java      |   18 +-
 .../iotdb/db/engine/memtable/WritableMemChunk.java |  141 +-
 .../db/engine/memtable/WritableMemChunkGroup.java  |  137 +
 .../iotdb/db/engine/modification/Deletion.java     |    2 +-
 .../iotdb/db/engine/modification/Modification.java |    2 +-
 .../db/engine/modification/ModificationFile.java   |   10 +-
 .../io/LocalTextModificationAccessor.java          |   35 +-
 .../engine/modification/io/ModificationReader.java |    3 +-
 .../engine/modification/io/ModificationWriter.java |    4 +-
 .../modification/utils/TracedBufferedReader.java   |  462 ++++
 .../querycontext/AlignedReadOnlyMemChunk.java      |  165 ++
 .../db/engine/querycontext/ReadOnlyMemChunk.java   |  147 +-
 .../selectinto/InsertTabletPlanGenerator.java      |    2 +-
 .../selectinto/InsertTabletPlansIterator.java      |    2 +-
 .../engine/storagegroup/StorageGroupProcessor.java |  164 +-
 .../db/engine/storagegroup/TsFileProcessor.java    |  337 ++-
 .../db/engine/storagegroup/TsFileResource.java     |  127 +-
 .../virtualSg/HashVirtualPartitioner.java          |    2 +-
 .../storagegroup/virtualSg/VirtualPartitioner.java |    2 +-
 .../virtualSg/VirtualStorageGroupManager.java      |   10 +-
 .../service/TriggerRegistrationInformation.java    |    2 +-
 .../service/TriggerRegistrationService.java        |    2 +-
 .../sink/local/LocalIoTDBConfiguration.java        |    2 +-
 .../trigger/sink/local/LocalIoTDBHandler.java      |    6 +-
 .../trigger/sink/mqtt/MQTTConfiguration.java       |    2 +-
 .../iotdb/db/exception/ConfigurationException.java |   44 +
 .../exception/StorageGroupNotReadyException.java   |   27 +
 .../metadata/TemplateImcompatibeException.java     |   40 +
 .../exception/query/PathNumOverLimitException.java |    6 +-
 .../db/exception/query/QueryProcessException.java  |    4 +
 .../org/apache/iotdb/db/metadata/MManager.java     |  623 ++---
 .../org/apache/iotdb/db/metadata/PartialPath.java  |  361 ---
 .../iotdb/db/metadata/VectorPartialPath.java       |  122 -
 .../db/metadata/lastCache/LastCacheManager.java    |  136 +-
 .../lastCache/container/ILastCacheContainer.java   |   13 -
 .../lastCache/container/LastCacheContainer.java    |   52 +-
 .../lastCache/container/value/ILastCacheValue.java |   12 -
 .../lastCache/container/value/LastCacheValue.java  |   55 +
 .../container/value/UnaryLastCacheValue.java       |  106 -
 .../container/value/VectorLastCacheValue.java      |   86 -
 .../iotdb/db/metadata/logfile/MLogTxtWriter.java   |   80 +-
 .../iotdb/db/metadata/logfile/MLogUpgrader.java    |    2 +-
 .../iotdb/db/metadata/logfile/MLogWriter.java      |   28 +-
 .../db/metadata/logfile/MetadataOperationType.java |    2 +
 .../iotdb/db/metadata/mnode/EntityMNode.java       |   10 +-
 .../iotdb/db/metadata/mnode/IEntityMNode.java      |    5 +
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |    4 +-
 .../iotdb/db/metadata/mnode/IMeasurementMNode.java |   13 +-
 .../iotdb/db/metadata/mnode/InternalMNode.java     |   13 +
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |    2 +-
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |   72 +-
 .../db/metadata/mnode/MultiMeasurementMNode.java   |   65 -
 .../db/metadata/mnode/UnaryMeasurementMNode.java   |   63 -
 .../org/apache/iotdb/db/metadata/mtree/MTree.java  |  595 +++--
 .../mtree/traverser/PathGrouperByStorageGroup.java |  103 -
 .../db/metadata/mtree/traverser/Traverser.java     |  117 +-
 .../collector/BelongedEntityPathCollector.java     |   83 -
 .../traverser/collector/CollectorTraverser.java    |    8 +-
 .../mtree/traverser/collector/EntityCollector.java |   62 +
 .../traverser/collector/EntityPathCollector.java   |   66 -
 .../collector/FlatMeasurementCollector.java        |  138 -
 .../collector/FlatMeasurementPathCollector.java    |   60 -
 .../collector/FlatMeasurementSchemaCollector.java  |  117 -
 .../mtree/traverser/collector/MNodeCollector.java  |    2 +-
 .../traverser/collector/MeasurementCollector.java  |   52 +-
 .../traverser/collector/StorageGroupCollector.java |   60 +
 .../collector/StorageGroupPathCollector.java       |   65 -
 .../mtree/traverser/counter/CounterTraverser.java  |    2 +-
 .../mtree/traverser/counter/EntityCounter.java     |    2 +-
 .../traverser/counter/FlatMeasurementCounter.java  |   78 -
 .../mtree/traverser/counter/MNodeLevelCounter.java |    2 +-
 .../traverser/counter/MeasurementCounter.java      |    2 +-
 .../traverser/counter/StorageGroupCounter.java     |    2 +-
 .../apache/iotdb/db/metadata/path/AlignedPath.java |  470 ++++
 .../iotdb/db/metadata/path/MeasurementPath.java    |  329 +++
 .../apache/iotdb/db/metadata/path/PartialPath.java |  454 ++++
 .../apache/iotdb/db/metadata/tag/TagManager.java   |    2 +-
 .../iotdb/db/metadata/template/Template.java       |  583 ++++-
 .../db/metadata/template/TemplateManager.java      |   79 +-
 .../db/metadata/template/TemplateQueryType.java    |   27 +
 .../iotdb/db/metadata/utils/MetaFormatUtils.java   |    2 +-
 .../apache/iotdb/db/metadata/utils/MetaUtils.java  |   36 +-
 .../iotdb/db/metrics/server/ServerArgument.java    |    6 +-
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |   32 +-
 .../org/apache/iotdb/db/mqtt/PublishHandler.java   |   86 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |   12 +-
 .../apache/iotdb/db/qp/executor/IPlanExecutor.java |    2 +-
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |  101 +-
 .../org/apache/iotdb/db/qp/logical/Operator.java   |    8 +-
 .../qp/logical/crud/AggregationQueryOperator.java  |    2 +-
 .../db/qp/logical/crud/BasicFunctionOperator.java  |    6 +-
 .../db/qp/logical/crud/DeleteDataOperator.java     |    2 +-
 .../db/qp/logical/crud/FillQueryOperator.java      |   17 +-
 .../iotdb/db/qp/logical/crud/FilterOperator.java   |    7 +-
 .../iotdb/db/qp/logical/crud/FromComponent.java    |    2 +-
 .../iotdb/db/qp/logical/crud/FunctionOperator.java |    3 +-
 .../qp/logical/crud/GroupByFillQueryOperator.java  |   13 -
 .../iotdb/db/qp/logical/crud/InOperator.java       |   10 +-
 .../iotdb/db/qp/logical/crud/InsertOperator.java   |   23 +-
 .../iotdb/db/qp/logical/crud/LikeOperator.java     |   17 +-
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |   91 +-
 .../iotdb/db/qp/logical/crud/RegexpOperator.java   |   17 +-
 .../iotdb/db/qp/logical/crud/SelectComponent.java  |    2 +-
 .../db/qp/logical/crud/SelectIntoOperator.java     |    2 +-
 .../qp/logical/sys/ActivateTemplateOperator.java   |   51 +
 .../db/qp/logical/sys/AlterTimeSeriesOperator.java |    2 +-
 .../iotdb/db/qp/logical/sys/AuthorOperator.java    |    2 +-
 .../iotdb/db/qp/logical/sys/CountOperator.java     |    2 +-
 .../sys/CreateAlignedTimeSeriesOperator.java       |  131 +
 .../logical/sys/CreateContinuousQueryOperator.java |    2 +-
 .../db/qp/logical/sys/CreateIndexOperator.java     |    2 +-
 .../db/qp/logical/sys/CreateTemplateOperator.java  |  122 +
 .../qp/logical/sys/CreateTimeSeriesOperator.java   |    2 +-
 .../db/qp/logical/sys/CreateTriggerOperator.java   |    2 +-
 .../db/qp/logical/sys/DeletePartitionOperator.java |    2 +-
 .../qp/logical/sys/DeleteStorageGroupOperator.java |    2 +-
 .../qp/logical/sys/DeleteTimeSeriesOperator.java   |    2 +-
 .../iotdb/db/qp/logical/sys/DropIndexOperator.java |    2 +-
 .../iotdb/db/qp/logical/sys/FlushOperator.java     |    2 +-
 .../db/qp/logical/sys/SetStorageGroupOperator.java |    2 +-
 .../iotdb/db/qp/logical/sys/SetTTLOperator.java    |    2 +-
 .../db/qp/logical/sys/SetTemplateOperator.java     |   60 +
 .../iotdb/db/qp/logical/sys/SettleOperator.java    |    2 +-
 .../db/qp/logical/sys/ShowChildNodesOperator.java  |    2 +-
 .../db/qp/logical/sys/ShowChildPathsOperator.java  |    2 +-
 .../db/qp/logical/sys/ShowDevicesOperator.java     |    2 +-
 .../db/qp/logical/sys/ShowLockInfoOperator.java    |    2 +-
 .../qp/logical/sys/ShowStorageGroupOperator.java   |    2 +-
 .../iotdb/db/qp/logical/sys/ShowTTLOperator.java   |    2 +-
 .../db/qp/logical/sys/ShowTimeSeriesOperator.java  |    2 +-
 .../iotdb/db/qp/logical/sys/UnSetTTLOperator.java  |    2 +-
 .../db/qp/logical/sys/UnsetTemplateOperator.java   |   60 +
 .../org/apache/iotdb/db/qp/physical/BatchPlan.java |    2 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |   82 +-
 .../iotdb/db/qp/physical/crud/AggregationPlan.java |    6 +-
 .../db/qp/physical/crud/AlignByDevicePlan.java     |   13 +-
 .../db/qp/physical/crud/CreateTemplatePlan.java    |  270 --
 .../db/qp/physical/crud/DeletePartitionPlan.java   |    2 +-
 .../iotdb/db/qp/physical/crud/DeletePlan.java      |    4 +-
 .../db/qp/physical/crud/InsertMultiTabletPlan.java |   10 +-
 .../iotdb/db/qp/physical/crud/InsertPlan.java      |   55 +-
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |   55 +-
 .../physical/crud/InsertRowsOfOneDevicePlan.java   |   23 +-
 .../iotdb/db/qp/physical/crud/InsertRowsPlan.java  |    9 +-
 .../db/qp/physical/crud/InsertTabletPlan.java      |   32 +-
 .../iotdb/db/qp/physical/crud/LastQueryPlan.java   |    1 -
 .../iotdb/db/qp/physical/crud/QueryPlan.java       |   32 +-
 .../db/qp/physical/crud/RawDataQueryPlan.java      |   59 +-
 .../iotdb/db/qp/physical/crud/SelectIntoPlan.java  |    7 +-
 .../db/qp/physical/crud/SetSchemaTemplatePlan.java |   94 -
 .../apache/iotdb/db/qp/physical/crud/UDTFPlan.java |   31 +-
 .../qp/physical/crud/UnsetSchemaTemplatePlan.java  |   96 -
 .../db/qp/physical/sys/ActivateTemplatePlan.java   |   83 +
 .../db/qp/physical/sys/AlterTimeSeriesPlan.java    |    2 +-
 .../db/qp/physical/sys/AppendTemplatePlan.java     |  218 ++
 .../iotdb/db/qp/physical/sys/AuthorPlan.java       |    4 +-
 .../qp/physical/sys/AutoCreateDeviceMNodePlan.java |    4 +-
 .../iotdb/db/qp/physical/sys/ChangeAliasPlan.java  |    4 +-
 .../db/qp/physical/sys/ChangeTagOffsetPlan.java    |    4 +-
 .../iotdb/db/qp/physical/sys/ClearCachePlan.java   |    4 +-
 .../apache/iotdb/db/qp/physical/sys/CountPlan.java |    2 +-
 .../physical/sys/CreateAlignedTimeSeriesPlan.java  |   39 +-
 .../qp/physical/sys/CreateContinuousQueryPlan.java |    4 +-
 .../db/qp/physical/sys/CreateFunctionPlan.java     |    2 +-
 .../iotdb/db/qp/physical/sys/CreateIndexPlan.java  |    4 +-
 .../qp/physical/sys/CreateMultiTimeSeriesPlan.java |    5 +-
 .../db/qp/physical/sys/CreateSnapshotPlan.java     |    4 +-
 .../db/qp/physical/sys/CreateTemplatePlan.java     |  515 ++++
 .../db/qp/physical/sys/CreateTimeSeriesPlan.java   |    4 +-
 .../db/qp/physical/sys/CreateTriggerPlan.java      |    4 +-
 .../iotdb/db/qp/physical/sys/DataAuthPlan.java     |    4 +-
 .../db/qp/physical/sys/DeleteStorageGroupPlan.java |    4 +-
 .../db/qp/physical/sys/DeleteTimeSeriesPlan.java   |    4 +-
 .../qp/physical/sys/DropContinuousQueryPlan.java   |    4 +-
 .../iotdb/db/qp/physical/sys/DropFunctionPlan.java |    2 +-
 .../iotdb/db/qp/physical/sys/DropIndexPlan.java    |    4 +-
 .../iotdb/db/qp/physical/sys/DropTriggerPlan.java  |    4 +-
 .../apache/iotdb/db/qp/physical/sys/DummyPlan.java |    5 +-
 .../apache/iotdb/db/qp/physical/sys/FlushPlan.java |    4 +-
 .../iotdb/db/qp/physical/sys/KillQueryPlan.java    |    2 +-
 .../db/qp/physical/sys/LoadConfigurationPlan.java  |    2 +-
 .../iotdb/db/qp/physical/sys/LoadDataPlan.java     |    2 +-
 .../apache/iotdb/db/qp/physical/sys/LogPlan.java   |    2 +-
 .../apache/iotdb/db/qp/physical/sys/MNodePlan.java |    4 +-
 .../db/qp/physical/sys/MeasurementMNodePlan.java   |    4 +-
 .../apache/iotdb/db/qp/physical/sys/MergePlan.java |    4 +-
 .../iotdb/db/qp/physical/sys/OperateFilePlan.java  |    2 +-
 .../db/qp/physical/sys/PruneTemplatePlan.java      |  107 +
 .../db/qp/physical/sys/SetStorageGroupPlan.java    |    4 +-
 .../db/qp/physical/sys/SetSystemModePlan.java      |    4 +-
 .../iotdb/db/qp/physical/sys/SetTTLPlan.java       |    4 +-
 .../iotdb/db/qp/physical/sys/SetTemplatePlan.java  |   94 +
 .../physical/sys/SetUsingSchemaTemplatePlan.java   |   83 -
 .../iotdb/db/qp/physical/sys/SettlePlan.java       |    2 +-
 .../db/qp/physical/sys/ShowChildNodesPlan.java     |    2 +-
 .../db/qp/physical/sys/ShowChildPathsPlan.java     |    2 +-
 .../iotdb/db/qp/physical/sys/ShowDevicesPlan.java  |    2 +-
 .../iotdb/db/qp/physical/sys/ShowLockInfoPlan.java |    2 +-
 .../apache/iotdb/db/qp/physical/sys/ShowPlan.java  |    2 +-
 .../db/qp/physical/sys/ShowStorageGroupPlan.java   |    2 +-
 .../iotdb/db/qp/physical/sys/ShowTTLPlan.java      |    2 +-
 .../db/qp/physical/sys/ShowTimeSeriesPlan.java     |    2 +-
 .../iotdb/db/qp/physical/sys/StartTriggerPlan.java |    4 +-
 .../iotdb/db/qp/physical/sys/StopTriggerPlan.java  |    4 +-
 .../db/qp/physical/sys/StorageGroupMNodePlan.java  |    4 +-
 .../iotdb/db/qp/physical/sys/TracingPlan.java      |    2 +-
 .../db/qp/physical/sys/UnsetTemplatePlan.java      |   96 +
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |  376 ++-
 .../iotdb/db/qp/strategy/LogicalGenerator.java     |    2 +-
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   12 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |   21 +-
 .../optimizer/MergeSingleFilterOptimizer.java      |    2 +-
 .../qp/strategy/optimizer/RemoveNotOptimizer.java  |    2 +-
 .../apache/iotdb/db/qp/utils/DatetimeUtils.java    |   12 +-
 .../iotdb/db/qp/utils/EmptyOutputStream.java       |   35 +
 .../iotdb/db/qp/utils/GroupByLevelController.java  |    4 +-
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java |   27 +-
 .../db/query/aggregation/AggregateResult.java      |   14 +-
 .../db/query/aggregation/impl/AvgAggrResult.java   |    9 +-
 .../db/query/aggregation/impl/CountAggrResult.java |   10 +-
 .../query/aggregation/impl/ExtremeAggrResult.java  |    7 +-
 .../aggregation/impl/FirstValueAggrResult.java     |   19 +-
 .../aggregation/impl/FirstValueDescAggrResult.java |   12 +-
 .../aggregation/impl/LastValueAggrResult.java      |    7 +-
 .../aggregation/impl/LastValueDescAggrResult.java  |   12 +-
 .../query/aggregation/impl/MaxTimeAggrResult.java  |    5 +-
 .../aggregation/impl/MaxTimeDescAggrResult.java    |   10 +-
 .../query/aggregation/impl/MaxValueAggrResult.java |   10 +-
 .../query/aggregation/impl/MinTimeAggrResult.java  |   10 +-
 .../aggregation/impl/MinTimeDescAggrResult.java    |   10 +-
 .../query/aggregation/impl/MinValueAggrResult.java |   10 +-
 .../db/query/aggregation/impl/SumAggrResult.java   |    9 +-
 .../iotdb/db/query/context/QueryContext.java       |   21 +-
 .../iotdb/db/query/control/FileReaderManager.java  |  110 +-
 .../iotdb/db/query/control/QueryFileManager.java   |   38 +-
 .../db/query/control/QueryResourceManager.java     |   11 +-
 .../iotdb/db/query/control/SessionManager.java     |    2 +-
 .../db/query/control/SessionTimeoutManager.java    |   17 +-
 .../db/query/dataset/AlignByDeviceDataSet.java     |   71 +-
 .../apache/iotdb/db/query/dataset/ListDataSet.java |    2 +-
 .../db/query/dataset/NonAlignEngineDataSet.java    |    2 +-
 .../dataset/RawQueryDataSetWithValueFilter.java    |   19 +-
 .../dataset/RawQueryDataSetWithoutValueFilter.java |   42 +-
 .../query/dataset/ShowContinuousQueriesResult.java |    2 +-
 .../iotdb/db/query/dataset/ShowDevicesDataSet.java |    2 +-
 .../db/query/dataset/ShowTimeseriesDataSet.java    |    2 +-
 .../iotdb/db/query/dataset/SingleDataSet.java      |    6 +-
 .../db/query/dataset/UDTFAlignByTimeDataSet.java   |    2 +
 .../apache/iotdb/db/query/dataset/UDTFDataSet.java |    2 +-
 .../dataset/groupby/GroupByEngineDataSet.java      |  159 +-
 .../query/dataset/groupby/GroupByFillDataSet.java  |  220 --
 .../dataset/groupby/GroupByFillEngineDataSet.java  |  412 +++
 .../groupby/GroupByFillWithValueFilterDataSet.java |  438 ++++
 .../GroupByFillWithoutValueFilterDataSet.java      |  258 ++
 .../query/dataset/groupby/GroupByLevelDataSet.java |    6 +-
 .../groupby/GroupByWithValueFilterDataSet.java     |   16 +-
 .../groupby/GroupByWithoutValueFilterDataSet.java  |   11 +-
 .../dataset/groupby/LocalGroupByExecutor.java      |    2 +-
 .../db/query/executor/AggregationExecutor.java     |  155 +-
 .../iotdb/db/query/executor/FillQueryExecutor.java |    5 +-
 .../iotdb/db/query/executor/LastQueryExecutor.java |   61 +-
 .../iotdb/db/query/executor/QueryRouter.java       |   82 +-
 .../db/query/executor/RawDataQueryExecutor.java    |    8 +-
 .../executor/fill/AlignedLastPointReader.java      |   58 +
 .../apache/iotdb/db/query/executor/fill/IFill.java |   88 +-
 .../db/query/executor/fill/LastPointReader.java    |   56 +-
 .../iotdb/db/query/executor/fill/LinearFill.java   |   83 +-
 .../iotdb/db/query/executor/fill/PreviousFill.java |   45 +-
 .../iotdb/db/query/executor/fill/ValueFill.java    |    6 +-
 .../iotdb/db/query/expression/Expression.java      |   50 +-
 .../iotdb/db/query/expression/ResultColumn.java    |   15 +-
 .../query/expression/binary/BinaryExpression.java  |   30 +-
 .../db/query/expression/unary/ConstantOperand.java |  111 +
 .../query/expression/unary/FunctionExpression.java |   14 +-
 .../query/expression/unary/NegationExpression.java |   14 +-
 .../query/expression/unary/TimeSeriesOperand.java  |   14 +-
 .../iotdb/db/query/pool/QueryTaskPoolManager.java  |   10 +-
 .../query/reader/chunk/DiskAlignedChunkLoader.java |   67 +
 .../db/query/reader/chunk/DiskChunkLoader.java     |   12 +
 .../query/reader/chunk/MemAlignedChunkLoader.java  |   52 +
 .../query/reader/chunk/MemAlignedChunkReader.java  |  110 +
 .../query/reader/chunk/MemAlignedPageReader.java   |  109 +
 .../db/query/reader/chunk/MemChunkLoader.java      |    8 +-
 .../iotdb/db/query/reader/chunk/MemPageReader.java |   10 +-
 .../metadata/DiskAlignedChunkMetadataLoader.java   |  109 +
 .../chunk/metadata/DiskChunkMetadataLoader.java    |   68 +-
 .../metadata/MemAlignedChunkMetadataLoader.java    |   89 +
 .../chunk/metadata/MemChunkMetadataLoader.java     |   31 +-
 .../series/AlignedSeriesAggregateReader.java       |  201 ++
 .../query/reader/series/AlignedSeriesReader.java   |  109 +
 .../query/reader/series/SeriesAggregateReader.java |    5 +-
 .../reader/series/SeriesRawDataBatchReader.java    |    8 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |  118 +-
 .../reader/series/SeriesReaderByTimestamp.java     |   23 +-
 .../reader/series/VectorSeriesAggregateReader.java |  177 --
 .../universal/AlignedDescPriorityMergeReader.java  |   39 +
 .../universal/AlignedPriorityMergeReader.java      |   51 +
 .../reader/universal/PriorityMergeReader.java      |   20 +-
 .../query/timegenerator/ServerTimeGenerator.java   |   29 +-
 .../api/customizer/parameter/UDFParameters.java    |    2 +-
 .../db/query/udf/builtin/BuiltinFunction.java      |    1 +
 .../iotdb/db/query/udf/builtin/UDTFCast.java       |  259 ++
 .../db/query/udf/core/executor/UDTFExecutor.java   |    6 +
 .../udf/core/layer/ConstantIntermediateLayer.java  |   66 +
 .../layer/MultiInputColumnIntermediateLayer.java   |    8 +-
 .../query/udf/core/layer/RawQueryInputLayer.java   |    7 +-
 ...InputColumnMultiReferenceIntermediateLayer.java |    5 +
 ...nputColumnSingleReferenceIntermediateLayer.java |    4 +
 .../udf/core/reader/ConstantLayerPointReader.java  |  132 +
 .../db/query/udf/core/reader/LayerPointReader.java |    2 +
 .../transformer/ArithmeticBinaryTransformer.java   |   17 +
 .../transformer/ArithmeticNegationTransformer.java |    5 +
 .../udf/core/transformer/UDFQueryTransformer.java  |    5 +
 .../tv/ElasticSerializableTVList.java              |    5 +
 .../iotdb/db/rescon/AbstractPoolManager.java       |   11 +
 .../apache/iotdb/db/rescon/TVListAllocator.java    |   19 +-
 .../java/org/apache/iotdb/db/rest/RestService.java |  156 ++
 .../iotdb/db/rest/filter/ApiOriginFilter.java      |   45 +
 .../iotdb/db/rest/filter/AuthorizationFilter.java  |  125 +
 .../iotdb/db/rest/filter/BasicSecurityContext.java |   56 +
 .../java/org/apache/iotdb/db/rest/filter/User.java |   38 +
 .../org/apache/iotdb/db/rest/filter/UserCache.java |   56 +
 .../db/rest/handler/AuthorizationHandler.java      |   56 +
 .../iotdb/db/rest/handler/ExceptionHandler.java    |   69 +
 .../handler/PhysicalPlanConstructionHandler.java   |  156 ++
 .../iotdb/db/rest/handler/QueryDataSetHandler.java |   95 +
 .../db/rest/handler/RequestValidationHandler.java  |   39 +
 .../iotdb/db/rest/impl/PingApiServiceImpl.java     |   37 +
 .../iotdb/db/rest/impl/RestApiServiceImpl.java     |  149 ++
 .../java/org/apache/iotdb/db/service/IoTDB.java    |   17 +-
 .../apache/iotdb/db/service/MetricsService.java    |    4 +-
 .../org/apache/iotdb/db/service/RPCService.java    |   14 +-
 .../iotdb/db/service/RPCServiceThriftHandler.java  |    2 +-
 .../org/apache/iotdb/db/service/ServiceType.java   |   11 +-
 .../org/apache/iotdb/db/service/SettleService.java |    2 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  564 ++---
 .../org/apache/iotdb/db/service/UpgradeSevice.java |    9 +-
 .../db/service/basic/BasicOpenSessionResp.java     |   34 +
 .../db/service/basic/BasicServiceProvider.java     |  263 ++
 .../db/service/basic/QueryFrequencyRecorder.java   |   54 +
 .../iotdb/db/service/thrift/ThriftService.java     |   22 +-
 .../db/service/thrift/ThriftServiceThread.java     |  213 +-
 .../iotdb/db/sync/receiver/SyncServerManager.java  |    6 +
 .../db/sync/receiver/transfer/SyncServiceImpl.java |   14 +-
 .../iotdb/db/sync/sender/transfer/SyncClient.java  |   23 +-
 .../apache/iotdb/db/tools/IoTDBDataDirViewer.java  |    4 +-
 .../apache/iotdb/db/tools/TsFileRewriteTool.java   |   14 +-
 .../org/apache/iotdb/db/tools/mlog/MLogParser.java |   25 +-
 .../db/tools/settle/TsFileAndModSettleTool.java    |    6 +-
 .../db/tools/virtualsg/DeviceMappingViewer.java    |    2 +-
 .../iotdb/db/tools/vis/TsFileExtractVisdata.java   |    2 +-
 .../db/tools/watermark/WatermarkDetector.java      |    4 +-
 .../iotdb/db/utils/AlignedValueIterator.java       |   58 +
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  347 +++
 .../apache/iotdb/db/utils/ErrorHandlingUtils.java  |  152 ++
 .../org/apache/iotdb/db/utils/FileLoaderUtils.java |  157 +-
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |   72 +-
 .../java/org/apache/iotdb/db/utils/MergeUtils.java |   37 +-
 .../apache/iotdb/db/utils/QueryDataSetUtils.java   |    3 +-
 .../java/org/apache/iotdb/db/utils/QueryUtils.java |   72 +-
 .../org/apache/iotdb/db/utils/SchemaTestUtils.java |   39 +
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |   16 +-
 .../org/apache/iotdb/db/utils/SerializeUtils.java  |   77 +-
 .../org/apache/iotdb/db/utils/ValueIterator.java   |   56 +
 .../db/utils/datastructure/AlignedTVList.java      |  989 ++++++++
 .../iotdb/db/utils/datastructure/TVList.java       |   82 +-
 .../iotdb/db/utils/datastructure/VectorTVList.java |  718 ------
 .../writelog/manager/MultiFileLogNodeManager.java  |    5 +-
 .../db/writelog/node/ExclusiveWriteLogNode.java    |   21 +-
 .../iotdb/db/writelog/recover/LogReplayer.java     |   50 +-
 .../apache/iotdb/db/auth/AuthorityCheckerTest.java |    2 +-
 .../org/apache/iotdb/db/constant/TestConstant.java |  140 --
 .../iotdb/db/engine/MetadataManagerHelper.java     |    2 +-
 .../db/engine/cache/BloomFilterCacheTest.java      |  208 ++
 .../iotdb/db/engine/cache/ChunkCacheTest.java      |   12 +-
 .../engine/compaction/CompactionSchedulerTest.java |   20 +-
 .../compaction/CompactionTaskManagerTest.java      |  252 ++
 .../db/engine/compaction/TsFileIdentifierUT.java   |  194 ++
 .../compaction/cross/CrossSpaceCompactionTest.java |    2 +-
 .../engine/compaction/cross/MergeOverLapTest.java  |   12 +-
 .../db/engine/compaction/cross/MergeTaskTest.java  |   40 +-
 .../db/engine/compaction/cross/MergeTest.java      |    6 +-
 .../engine/compaction/cross/MergeUpgradeTest.java  |    3 +-
 .../compaction/inner/InnerCompactionCacheTest.java |  148 --
 .../compaction/inner/InnerCompactionChunkTest.java |    4 +-
 .../compaction/inner/InnerCompactionLogTest.java   |    4 +-
 .../inner/InnerCompactionMoreDataTest.java         |   16 +-
 .../inner/InnerCompactionSchedulerTest.java        |    4 +-
 .../compaction/inner/InnerCompactionTest.java      |   14 +-
 .../compaction/inner/InnerSeqCompactionTest.java   |   23 +-
 .../inner/InnerSpaceCompactionUtilsTest.java       |   21 +-
 .../compaction/inner/InnerUnseqCompactionTest.java |    9 +-
 .../SizeTieredCompactionRecoverTest.java           |  376 ++-
 .../inner/sizetiered/SizeTieredCompactionTest.java |    3 +-
 .../recover/SizeTieredCompactionRecoverTest.java   |  732 ++++++
 .../task/FakedInnerSpaceCompactionTask.java        |   44 +-
 .../compaction/utils/CompactionCheckerUtils.java   |    2 +-
 .../compaction/utils/CompactionClearUtils.java     |    1 -
 .../utils/CompactionFileGeneratorUtils.java        |   11 +-
 .../db/engine/memtable/MemTableFlushTaskTest.java  |   22 +-
 .../db/engine/memtable/MemTableTestUtils.java      |   24 +-
 .../db/engine/memtable/MemtableBenchmark.java      |    7 +-
 .../db/engine/memtable/PrimitiveMemTableTest.java  |  291 ++-
 .../engine/modification/DeletionFileNodeTest.java  |   17 +-
 .../db/engine/modification/DeletionQueryTest.java  |  101 +-
 .../engine/modification/ModificationFileTest.java  |    2 +-
 .../io/LocalTextModificationAccessorTest.java      |   51 +-
 .../engine/storagegroup/FakedTsFileResource.java   |   11 +
 .../storagegroup/FileNodeManagerBenchmark.java     |    2 +-
 .../storagegroup/StorageGroupProcessorTest.java    |   29 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |   18 +-
 .../engine/storagegroup/TsFileProcessorTest.java   |  123 +-
 .../virtualSg/HashVirtualPartitionerTest.java      |    2 +-
 .../iotdb/db/integration/IOTDBGroupByIT.java       | 1007 --------
 .../integration/IOTDBGroupByInnerIntervalIT.java   |  341 ---
 .../db/integration/IOTDBInsertAlignedValuesIT.java |  219 --
 .../apache/iotdb/db/integration/IOTDBInsertIT.java |  126 -
 .../apache/iotdb/db/integration/IoTDBAliasIT.java  |  338 ---
 .../iotdb/db/integration/IoTDBAlignByDeviceIT.java | 1307 ----------
 .../iotdb/db/integration/IoTDBArithmeticIT.java    |  284 ---
 .../org/apache/iotdb/db/integration/IoTDBAsIT.java |  610 -----
 .../db/integration/IoTDBAutoCreateSchemaIT.java    |  206 --
 .../iotdb/db/integration/IoTDBCheckConfigIT.java   |  161 --
 .../iotdb/db/integration/IoTDBClearCacheIT.java    |  175 --
 .../apache/iotdb/db/integration/IoTDBCloseIT.java  |  197 --
 .../iotdb/db/integration/IoTDBCompleteIT.java      |  488 ----
 .../iotdb/db/integration/IoTDBCompressTypeIT.java  |  104 -
 .../db/integration/IoTDBContinuousQueryIT.java     |  413 ---
 .../db/integration/IoTDBCreateSnapshotIT.java      |  187 --
 .../db/integration/IoTDBCreateStorageGroupIT.java  |  130 -
 .../db/integration/IoTDBCreateTimeseriesIT.java    |  167 --
 .../apache/iotdb/db/integration/IoTDBDaemonIT.java |  470 ----
 .../db/integration/IoTDBDeleteStorageGroupIT.java  |  169 --
 .../db/integration/IoTDBDeleteTimeseriesIT.java    |  221 --
 .../iotdb/db/integration/IoTDBDeletionIT.java      |  516 ----
 .../iotdb/db/integration/IoTDBDisableAlignIT.java  |  414 ---
 .../iotdb/db/integration/IoTDBEncodingIT.java      |  347 ---
 .../db/integration/IoTDBEngineTimeGeneratorIT.java |  283 ---
 .../iotdb/db/integration/IoTDBExecuteBatchIT.java  |  197 --
 .../iotdb/db/integration/IoTDBFilePathUtilsIT.java |  112 -
 .../apache/iotdb/db/integration/IoTDBFillIT.java   |  940 -------
 .../db/integration/IoTDBFloatPrecisionIT.java      |  174 --
 .../db/integration/IoTDBFlushQueryMergeIT.java     |  216 --
 .../iotdb/db/integration/IoTDBFuzzyQueryIT.java    |  292 ---
 .../iotdb/db/integration/IoTDBGroupByFillIT.java   |  825 ------
 .../integration/IoTDBGroupByFillWithRangeIT.java   |  182 --
 .../iotdb/db/integration/IoTDBGroupByMonthIT.java  |  279 ---
 .../iotdb/db/integration/IoTDBGroupByUnseqIT.java  |  185 --
 .../org/apache/iotdb/db/integration/IoTDBInIT.java |  255 --
 .../db/integration/IoTDBInsertMultiRowIT.java      |  125 -
 .../iotdb/db/integration/IoTDBInsertNaNIT.java     |  203 --
 .../db/integration/IoTDBInsertWithQueryIT.java     |  532 ----
 .../db/integration/IoTDBInsertWithoutTimeIT.java   |  129 -
 .../iotdb/db/integration/IoTDBKillQueryIT.java     |   81 -
 .../iotdb/db/integration/IoTDBLargeDataIT.java     |  388 ---
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |  584 -----
 .../iotdb/db/integration/IoTDBLimitSlimitIT.java   |  208 --
 ...IoTDBLoadExternalTsFileWithTimePartitionIT.java |  327 ---
 .../db/integration/IoTDBLoadExternalTsfileIT.java  |  822 ------
 .../integration/IoTDBManageTsFileResourceIT.java   |  292 ---
 .../apache/iotdb/db/integration/IoTDBMergeIT.java  |  339 ---
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |  631 -----
 .../iotdb/db/integration/IoTDBMultiDeviceIT.java   |  299 ---
 .../IoTDBMultiOverlappedChunkInUnseqIT.java        |  115 -
 .../db/integration/IoTDBMultiOverlappedPageIT.java |  173 --
 .../iotdb/db/integration/IoTDBMultiSeriesIT.java   |  504 ----
 .../db/integration/IoTDBMultiStatementsIT.java     |  194 --
 .../iotdb/db/integration/IoTDBNestedQueryIT.java   |  410 ---
 .../db/integration/IoTDBNewTsFileCompactionIT.java | 1064 --------
 .../iotdb/db/integration/IoTDBNumberPathIT.java    |  484 ----
 .../db/integration/IoTDBOverlappedPageIT.java      |  203 --
 .../iotdb/db/integration/IoTDBQueryDemoIT.java     |  707 ------
 .../db/integration/IoTDBQueryMemoryControlIT.java  |  294 ---
 .../iotdb/db/integration/IoTDBQueryTimeoutIT.java  |  153 --
 .../iotdb/db/integration/IoTDBQuotedPathIT.java    |  146 --
 .../iotdb/db/integration/IoTDBRecoverIT.java       |  435 ----
 .../db/integration/IoTDBRecoverUnclosedIT.java     |  288 ---
 .../db/integration/IoTDBRemovePartitionIT.java     |  330 ---
 .../iotdb/db/integration/IoTDBRestartIT.java       |  459 ----
 .../iotdb/db/integration/IoTDBResultSetIT.java     |  126 -
 .../db/integration/IoTDBRpcCompressionIT.java      |  151 --
 .../IoTDBSameMeasurementsDifferentTypesIT.java     |  186 --
 .../iotdb/db/integration/IoTDBSelectIntoIT.java    |  670 -----
 .../iotdb/db/integration/IoTDBSensorUpdateIT.java  |   85 -
 .../db/integration/IoTDBSequenceDataQueryIT.java   |  335 ---
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |  457 ----
 .../db/integration/IoTDBSessionTimeoutIT.java      |   82 -
 .../IoTDBSetSystemReadOnlyWritableIT.java          |  266 --
 .../apache/iotdb/db/integration/IoTDBSettleIT.java |   94 -
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   | 1361 ----------
 .../integration/IoTDBSizeTieredCompactionIT.java   | 1386 ----------
 .../integration/IoTDBSortedShowTimeseriesIT.java   |  335 ---
 .../iotdb/db/integration/IoTDBTagAlterIT.java      |  640 -----
 .../apache/iotdb/db/integration/IoTDBTagIT.java    | 1166 ---------
 .../iotdb/db/integration/IoTDBTimePartitionIT.java |   92 -
 .../iotdb/db/integration/IoTDBTimeZoneIT.java      |  163 --
 .../iotdb/db/integration/IoTDBTracingIT.java       |   88 -
 .../db/integration/IoTDBTriggerExecutionIT.java    |  614 -----
 .../db/integration/IoTDBTriggerManagementIT.java   |  500 ----
 .../apache/iotdb/db/integration/IoTDBTtlIT.java    |  230 --
 .../iotdb/db/integration/IoTDBUDFManagementIT.java |  393 ---
 .../db/integration/IoTDBUDFWindowQueryIT.java      |  562 -----
 .../integration/IoTDBUDTFAlignByTimeQueryIT.java   |  867 -------
 .../db/integration/IoTDBUDTFBuiltinFunctionIT.java |  367 ---
 .../db/integration/IoTDBUDTFHybridQueryIT.java     |  184 --
 .../db/integration/IoTDBUDTFNonAlignQueryIT.java   |  374 ---
 .../iotdb/db/integration/IoTDBVersionIT.java       |   70 -
 .../db/integration/IoTDBWithoutAllNullIT.java      |  264 --
 .../db/integration/IoTDBWithoutAnyNullIT.java      |  221 --
 .../aggregation/IoTDBAggregationByLevelIT.java     |  534 ----
 .../aggregation/IoTDBAggregationDeleteIT.java      |   91 -
 .../aggregation/IoTDBAggregationIT.java            | 1083 --------
 .../aggregation/IoTDBAggregationLargeDataIT.java   | 1048 --------
 .../aggregation/IoTDBAggregationSmallDataIT.java   |  855 -------
 .../db/integration/auth/IoTDBAuthorizationIT.java  | 1151 ---------
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |   30 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  504 ++--
 .../iotdb/db/metadata/MManagerImproveTest.java     |    1 +
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |   24 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |   31 +
 .../apache/iotdb/db/metadata/PartialPathTest.java  |    1 +
 .../org/apache/iotdb/db/metadata/TemplateTest.java |  252 ++
 .../iotdb/db/metadata/mlog/MLogUpgraderTest.java   |   74 +-
 .../apache/iotdb/db/mqtt/PublishHandlerTest.java   |   75 +-
 .../java/org/apache/iotdb/db/qp/PlannerTest.java   |    4 +-
 .../iotdb/db/qp/logical/LogicalPlanSmallTest.java  |    2 +-
 .../iotdb/db/qp/other/TSPlanContextAuthorTest.java |    2 +-
 .../iotdb/db/qp/physical/ConcatOptimizerTest.java  |    2 +-
 .../iotdb/db/qp/physical/InsertRowPlanTest.java    |  200 +-
 .../qp/physical/InsertRowsOfOneDevicePlanTest.java |    2 +-
 .../db/qp/physical/InsertTabletMultiPlanTest.java  |    2 +-
 .../iotdb/db/qp/physical/InsertTabletPlanTest.java |  228 +-
 .../db/qp/physical/PhysicalPlanSerializeTest.java  |    4 +-
 .../iotdb/db/qp/physical/PhysicalPlanTest.java     |  150 +-
 .../iotdb/db/qp/physical/SerializationTest.java    |    2 +-
 .../query/aggregation/DescAggregateResultTest.java |   63 +
 .../db/query/control/FileReaderManagerTest.java    |   19 +-
 .../query/dataset/UDTFAlignByTimeDataSetTest.java  |    2 +-
 .../dataset/groupby/GroupByFillDataSetTest.java    |    2 +-
 .../reader/series/SeriesAggregateReaderTest.java   |    9 +-
 .../reader/series/SeriesReaderByTimestampTest.java |    7 +-
 .../db/query/reader/series/SeriesReaderTest.java   |    2 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |    8 +-
 .../universal/AlignedPriorityMergeReaderTest.java  |   91 +
 .../iotdb/db/query/udf/example/Accumulator.java    |  103 -
 .../iotdb/db/rescon/ResourceManagerTest.java       |    6 +-
 .../apache/iotdb/db/rest/IoTDBRestServiceIT.java   |  280 +++
 .../org/apache/iotdb/db/sink/MQTTSinkTest.java     |    2 +-
 .../db/sync/receiver/load/FileLoaderTest.java      |    2 +-
 .../recover/SyncReceiverLogAnalyzerTest.java       |    2 +-
 .../db/sync/sender/manage/SyncFileManagerTest.java |    2 +-
 .../sender/recover/SyncSenderLogAnalyzerTest.java  |    2 +-
 .../org/apache/iotdb/db/tools/MLogParserTest.java  |   33 +-
 .../iotdb/db/tools/TsFileAndModSettleToolTest.java |    4 +-
 .../iotdb/db/tools/TsFileSketchToolTest.java       |   17 +-
 .../org/apache/iotdb/db/tools/WalCheckerTest.java  |    2 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |  345 ---
 .../org/apache/iotdb/db/utils/MemUtilsTest.java    |   12 +-
 .../org/apache/iotdb/db/utils/SchemaUtilsTest.java |    2 +-
 .../apache/iotdb/db/utils/SerializeUtilsTest.java  |  743 ++++++
 .../iotdb/db/utils/TsFileRewriteToolTest.java      |   15 +-
 .../db/utils/datastructure/VectorTVListTest.java   |   65 +-
 .../apache/iotdb/db/writelog/PerformanceTest.java  |    2 +-
 .../iotdb/db/writelog/WriteLogNodeManagerTest.java |    2 +-
 .../apache/iotdb/db/writelog/WriteLogNodeTest.java |  103 +-
 .../iotdb/db/writelog/io/LogWriterReaderTest.java  |    2 +-
 .../db/writelog/io/MultiFileLogReaderTest.java     |    2 +-
 .../db/writelog/recover/DeviceStringTest.java      |    8 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |   27 +-
 .../recover/RecoverResourceFromReaderTest.java     |   10 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |   32 +-
 .../writelog/recover/UnseqTsFileRecoverTest.java   |   10 +-
 server/src/test/resources/iotdb-rest.properties    |   55 +
 .../org/apache/iotdb/rpc/RpcTransportFactory.java  |   36 +-
 .../main/java/org/apache/iotdb/rpc/RpcUtils.java   |    7 +-
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |    6 +-
 .../java/org/apache/iotdb/session/Session.java     |  366 ++-
 .../apache/iotdb/session/SessionConnection.java    |   72 +-
 .../org/apache/iotdb/session/SessionDataSet.java   |    7 +-
 .../org/apache/iotdb/session/pool/SessionPool.java |  301 ++-
 .../iotdb/session/template/InternalNode.java       |   59 +
 .../iotdb/session/template/MeasurementNode.java    |   67 +
 .../apache/iotdb/session/template/Template.java    |  126 +
 .../iotdb/session/template/TemplateNode.java       |   55 +
 .../iotdb/session/template/TemplateQueryType.java  |   27 +
 .../iotdb/session/IoTDBSessionComplexIT.java       |  927 -------
 .../session/IoTDBSessionDisableMemControlIT.java   |  205 ++
 .../iotdb/session/IoTDBSessionIteratorIT.java      |  351 ---
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java | 1149 ---------
 .../session/IoTDBSessionVectorABDeviceIT.java      |   78 +-
 .../session/IoTDBSessionVectorAggregationIT.java   |   15 +-
 .../IoTDBSessionVectorAggregationWithUnSeqIT.java  |    4 +-
 .../iotdb/session/IoTDBSessionVectorInsertIT.java  |   93 +-
 .../java/org/apache/iotdb/session/SessionTest.java |  229 +-
 .../apache/iotdb/session/template/TemplateUT.java  |  103 +
 session/src/test/resources/iotdb-rest.properties   |   55 +
 site/pom.xml                                       |  158 +-
 site/src/main/.vuepress/config.js                  |    6 +-
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |    2 +
 .../org/apache/iotdb/spark/tsfile/qp/Executor.java |    4 +-
 .../apache/iotdb/spark/tsfile/DefaultSource.scala  |    6 +-
 .../iotdb/spark/tsfile/NarrowConverter.scala       |    2 +-
 .../apache/iotdb/spark/tsfile/WideConverter.scala  |    2 +-
 .../org/apache/iotdb/spark/tool/TsFileExample.java |   29 +-
 .../apache/iotdb/spark/tool/TsFileWriteTool.java   |   87 +-
 .../test/java/org/apache/iotdb/db/sql/Cases.java   |   76 +-
 testcontainer/src/tool/README.md                   |   33 +
 testcontainer/src/tool/parser.py                   |   79 +
 thrift-cluster/src/main/thrift/cluster.thrift      |   15 +-
 thrift/rpc-changelist.md                           |   16 +-
 thrift/src/main/thrift/rpc.thrift                  |   43 +-
 tsfile/pom.xml                                     |    6 +-
 .../iotdb/tsfile/common/cache/Accountable.java     |   26 -
 .../apache/iotdb/tsfile/compress/ICompressor.java  |   58 +-
 .../compress/GZIPCompressOverflowException.java    |   26 +
 .../iotdb/tsfile/file/header/PageHeader.java       |   12 +
 .../tsfile/file/metadata/AlignedChunkMetadata.java |  198 ++
 .../file/metadata/AlignedTimeSeriesMetadata.java   |  142 ++
 .../iotdb/tsfile/file/metadata/ChunkMetadata.java  |   42 +-
 .../iotdb/tsfile/file/metadata/IChunkMetadata.java |    4 -
 .../tsfile/file/metadata/ITimeSeriesMetadata.java  |    3 +-
 .../file/metadata/MetadataIndexConstructor.java    |    6 +-
 .../tsfile/file/metadata/TimeseriesMetadata.java   |   24 +-
 .../tsfile/file/metadata/VectorChunkMetadata.java  |  208 --
 .../file/metadata/VectorTimeSeriesMetadata.java    |  131 -
 .../fileOutputFactory/LocalFSOutputFactory.java    |    7 +-
 .../apache/iotdb/tsfile/read/ReadOnlyTsFile.java   |   60 -
 .../org/apache/iotdb/tsfile/read/TsFileReader.java |   60 +
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |  222 +-
 .../apache/iotdb/tsfile/read/common/BatchData.java |  123 +-
 .../org/apache/iotdb/tsfile/read/common/Chunk.java |   13 +-
 .../tsfile/read/common/DescReadWriteBatchData.java |   89 +
 .../tsfile/read/common/ExceptionBatchData.java     |   10 +-
 .../org/apache/iotdb/tsfile/read/common/Field.java |   26 +
 .../org/apache/iotdb/tsfile/read/common/Path.java  |    7 +-
 .../apache/iotdb/tsfile/read/common/RowRecord.java |    6 +-
 .../read/controller/CachedChunkLoaderImpl.java     |   18 +
 .../iotdb/tsfile/read/controller/IChunkLoader.java |    5 +
 .../read/controller/IChunkMetadataLoader.java      |    4 +-
 .../read/controller/MetadataQuerierByFileImpl.java |   87 +-
 .../iotdb/tsfile/read/filter/GroupByFilter.java    |   20 +-
 .../tsfile/read/filter/GroupByMonthFilter.java     |  114 +-
 .../iotdb/tsfile/read/filter/TimeFilter.java       |   11 +
 .../tsfile/read/filter/basic/BinaryFilter.java     |    8 +
 .../tsfile/read/filter/factory/FilterFactory.java  |    8 +
 .../read/filter/factory/FilterSerializeId.java     |    1 +
 .../iotdb/tsfile/read/filter/operator/In.java      |   15 +-
 .../iotdb/tsfile/read/filter/operator/Like.java    |   12 +-
 .../query/dataset/DataSetWithTimeGenerator.java    |   15 +-
 .../query/dataset/DataSetWithoutTimeGenerator.java |   24 +-
 .../tsfile/read/query/dataset/QueryDataSet.java    |   12 +
 .../tsfile/read/reader/IAlignedPageReader.java     |   28 +
 .../iotdb/tsfile/read/reader/LocalTsFileInput.java |    5 +
 .../iotdb/tsfile/read/reader/TsFileInput.java      |    2 +
 .../read/reader/chunk/AlignedChunkReader.java      |  309 +++
 .../chunk/AlignedChunkReaderByTimestamp.java       |   47 +
 .../read/reader/chunk/VectorChunkReader.java       |  278 --
 .../tsfile/read/reader/page/AlignedPageReader.java |  152 ++
 .../iotdb/tsfile/read/reader/page/PageReader.java  |    1 -
 .../tsfile/read/reader/page/TimePageReader.java    |   17 +
 .../tsfile/read/reader/page/ValuePageReader.java   |    3 +
 .../tsfile/read/reader/page/VectorPageReader.java  |  133 -
 .../reader/series/AbstractFileSeriesReader.java    |    4 +-
 .../read/reader/series/FileSeriesReader.java       |   18 +-
 .../reader/series/FileSeriesReaderByTimestamp.java |   28 +-
 .../org/apache/iotdb/tsfile/utils/BloomFilter.java |   39 +
 .../apache/iotdb/tsfile/utils/FilePathUtils.java   |   41 +-
 .../iotdb/tsfile/utils/MeasurementGroup.java       |   65 +
 .../iotdb/tsfile/utils/ReadWriteIOUtils.java       |   15 +-
 .../apache/iotdb/tsfile/utils/StringContainer.java |    8 +-
 .../tsfile/v2/read/TsFileSequenceReaderForV2.java  |   21 +-
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |  415 ++-
 .../write/chunk/AlignedChunkGroupWriterImpl.java   |  301 +++
 .../tsfile/write/chunk/AlignedChunkWriterImpl.java |  189 ++
 .../tsfile/write/chunk/ChunkGroupWriterImpl.java   |  241 --
 .../iotdb/tsfile/write/chunk/ChunkWriterImpl.java  |   41 +-
 .../tsfile/write/chunk/IChunkGroupWriter.java      |   17 +-
 .../iotdb/tsfile/write/chunk/IChunkWriter.java     |   45 -
 .../chunk/NonAlignedChunkGroupWriterImpl.java      |  188 ++
 .../iotdb/tsfile/write/chunk/TimeChunkWriter.java  |    4 +
 .../iotdb/tsfile/write/chunk/ValueChunkWriter.java |   67 +-
 .../tsfile/write/chunk/VectorChunkWriterImpl.java  |  204 --
 .../apache/iotdb/tsfile/write/page/PageWriter.java |    4 +
 .../iotdb/tsfile/write/page/TimePageWriter.java    |    4 +
 .../iotdb/tsfile/write/page/ValuePageWriter.java   |    8 +
 .../apache/iotdb/tsfile/write/record/Tablet.java   |   55 +-
 .../write/record/datapoint/BooleanDataPoint.java   |    6 +-
 .../tsfile/write/record/datapoint/DataPoint.java   |    9 +-
 .../write/record/datapoint/DoubleDataPoint.java    |    6 +-
 .../write/record/datapoint/FloatDataPoint.java     |    6 +-
 .../write/record/datapoint/IntDataPoint.java       |    6 +-
 .../write/record/datapoint/LongDataPoint.java      |    6 +-
 .../write/record/datapoint/StringDataPoint.java    |    6 +-
 .../tsfile/write/schema/IMeasurementSchema.java    |    2 +
 .../apache/iotdb/tsfile/write/schema/Schema.java   |   69 +-
 .../write/schema/UnaryMeasurementSchema.java       |    5 +
 .../write/schema/VectorMeasurementSchema.java      |   92 +-
 .../write/writer/RestorableTsFileIOWriter.java     |    6 +-
 .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |   77 +-
 .../org/apache/iotdb/tsfile/compress/GZIPTest.java |   17 +-
 .../org/apache/iotdb/tsfile/compress/LZ4Test.java  |   17 +-
 .../apache/iotdb/tsfile/compress/SnappyTest.java   |   17 +-
 .../file/metadata/TimeSeriesMetadataTest.java      |  110 -
 .../file/metadata/TimeseriesMetadataTest.java      |  110 +
 .../iotdb/tsfile/read/ReadInPartitionTest.java     |    4 +-
 .../iotdb/tsfile/read/ReadOnlyTsFileTest.java      |  241 --
 .../org/apache/iotdb/tsfile/read/ReadTest.java     |    4 +-
 .../iotdb/tsfile/read/TimePlainEncodeReadTest.java |    4 +-
 .../tsfile/read/TimeSeriesMetadataReadTest.java    |    7 +-
 .../apache/iotdb/tsfile/read/TsFileReaderTest.java |  477 ++++
 .../tsfile/read/TsFileSequenceReaderTest.java      |    4 +-
 .../tsfile/read/filter/FilterSerializeTest.java    |   25 +-
 .../read/query/timegenerator/ReadWriteTest.java    |    6 +-
 .../timegenerator/TimeGeneratorReadEmptyTest.java  |    6 +-
 .../timegenerator/TimeGeneratorReadWriteTest.java  |    6 +-
 .../TsFileGeneratorForSeriesReaderByTimestamp.java |   23 +-
 .../apache/iotdb/tsfile/utils/FileGenerator.java   |   45 +-
 .../iotdb/tsfile/utils/ReadWriteIOUtilsTest.java   |   30 +-
 .../org/apache/iotdb/tsfile/utils/RecordUtils.java |   17 +-
 .../apache/iotdb/tsfile/utils/RecordUtilsTest.java |   13 +-
 .../iotdb/tsfile/utils/TsFileGeneratorForTest.java |  147 +-
 .../tsfile/write/DefaultSchemaTemplateTest.java    |    8 +-
 .../tsfile/write/MetadataIndexConstructorTest.java |   73 +-
 .../org/apache/iotdb/tsfile/write/PerfTest.java    |   16 +-
 .../iotdb/tsfile/write/ReadPageInMemTest.java      |   16 +-
 ...SameMeasurementsWithDifferentDataTypesTest.java |    6 +-
 .../iotdb/tsfile/write/TsFileIOWriterTest.java     |   91 +-
 .../iotdb/tsfile/write/TsFileReadWriteTest.java    |   13 +-
 .../iotdb/tsfile/write/TsFileWriteApiTest.java     |  331 +++
 .../iotdb/tsfile/write/TsFileWriterTest.java       |  111 +-
 .../org/apache/iotdb/tsfile/write/WriteTest.java   |   10 +-
 .../write/schema/converter/SchemaBuilderTest.java  |   45 +-
 .../write/writer/AlignedChunkWriterImplTest.java   |  182 ++
 .../write/writer/ForceAppendTsFileWriterTest.java  |   16 +-
 .../write/writer/RestorableTsFileIOWriterTest.java |   63 +-
 .../write/writer/VectorChunkWriterImplTest.java    |  180 --
 .../write/writer/VectorMeasurementSchemaStub.java  |    6 +-
 .../zeppelin/iotdb/IoTDBInterpreterTest.java       |    9 +-
 1405 files changed, 102248 insertions(+), 66757 deletions(-)

diff --cc cluster/src/main/java/org/apache/iotdb/cluster/expr/SWRaftMember.java
index 0000000,0000000..52a99b9
new file mode 100644
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/expr/SWRaftMember.java
@@@ -1,0 -1,0 +1,206 @@@
++/*
++ * 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.cluster.expr;
++
++import org.apache.iotdb.cluster.client.ClientManager;
++import org.apache.iotdb.cluster.config.ClusterDescriptor;
++import org.apache.iotdb.cluster.log.Log;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
++import org.apache.iotdb.cluster.server.Response;
++import org.apache.iotdb.cluster.server.member.RaftMember;
++import org.apache.iotdb.cluster.server.monitor.Timer;
++import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
++
++import java.util.Arrays;
++import java.util.List;
++
++public abstract class SWRaftMember extends RaftMember {
++
++  private int windowCapacity =
++      ClusterDescriptor.getInstance().getConfig().getMaxNumOfLogsInMem() * 2;
++  private int windowLength = 0;
++  private Log[] logWindow = new Log[windowCapacity];
++  private long firstPosPrevIndex;
++  private long[] prevTerms = new long[windowCapacity];
++
++  public SWRaftMember(String name, ClientManager clientManager) {
++    super(name, clientManager);
++  }
++
++  @Override
++  public void start() {
++    super.start();
++    this.firstPosPrevIndex = logManager.getLastLogIndex();
++    this.prevTerms[0] = logManager.getLastLogTerm();
++  }
++
++  /**
++   * After insert an entry into the window, check if its previous and latter entries should be
++   * removed if it mismatches.
++   *
++   * @param pos
++   */
++  private void checkLog(int pos) {
++    checkLogPrev(pos);
++    checkLogNext(pos);
++  }
++
++  private void checkLogPrev(int pos) {
++    // check the previous entry
++    long prevLogTerm = prevTerms[pos];
++    if (pos > 0) {
++      Log prev = logWindow[pos - 1];
++      if (prev != null && prev.getCurrLogTerm() != prevLogTerm) {
++        logWindow[pos - 1] = null;
++      }
++    }
++  }
++
++  private void checkLogNext(int pos) {
++    // check the next entry
++    Log log = logWindow[pos];
++    boolean nextMismatch = false;
++    if (pos < windowCapacity - 1) {
++      long nextPrevTerm = prevTerms[pos + 1];
++      if (nextPrevTerm != log.getCurrLogTerm()) {
++        nextMismatch = true;
++      }
++    }
++    if (nextMismatch) {
++      for (int i = pos + 1; i < windowCapacity; i++) {
++        if (logWindow[i] != null) {
++          logWindow[i] = null;
++          if (i == windowLength - 1) {
++            windowLength = pos + 1;
++          }
++        } else {
++          break;
++        }
++      }
++    }
++  }
++
++  /**
++   * Flush window range [0, flushPos) into the LogManager, where flushPos is the first null position
++   * in the window.
++   *
++   * @param result
++   * @param leaderCommit
++   * @return
++   */
++  private long flushWindow(AppendEntryResult result, long leaderCommit) {
++    long windowPrevLogIndex = firstPosPrevIndex;
++    long windowPrevLogTerm = prevTerms[0];
++
++    int flushPos = 0;
++    for (; flushPos < windowCapacity; flushPos++) {
++      if (logWindow[flushPos] == null) {
++        break;
++      }
++    }
++
++    // flush [0, flushPos)
++    List<Log> logs = Arrays.asList(logWindow).subList(0, flushPos);
++    long success =
++        logManager.maybeAppend(windowPrevLogIndex, windowPrevLogTerm, leaderCommit, logs);
++    if (success != -1) {
++      System.arraycopy(logWindow, flushPos, logWindow, 0, windowCapacity - flushPos);
++      System.arraycopy(prevTerms, flushPos, prevTerms, 0, windowCapacity - flushPos);
++      for (int i = 1; i <= flushPos; i++) {
++        logWindow[windowCapacity - i] = null;
++      }
++    }
++    firstPosPrevIndex = logManager.getLastLogIndex();
++    result.status = Response.RESPONSE_STRONG_ACCEPT;
++    result.setLastLogIndex(firstPosPrevIndex);
++    result.setLastLogTerm(logManager.getLastLogTerm());
++    return success;
++  }
++
++  @Override
++  protected AppendEntryResult appendEntries(
++      long prevLogIndex, long prevLogTerm, long leaderCommit, List<Log> logs) {
++    if (logs.isEmpty()) {
++      return new AppendEntryResult(Response.RESPONSE_AGREE).setHeader(getHeader());
++    }
++
++    AppendEntryResult result = null;
++    for (Log log : logs) {
++      result = appendEntry(prevLogIndex, prevLogTerm, leaderCommit, log);
++
++      if (result.status != Response.RESPONSE_AGREE
++          && result.status != Response.RESPONSE_STRONG_ACCEPT
++          && result.status != Response.RESPONSE_WEAK_ACCEPT) {
++        return result;
++      }
++      prevLogIndex = log.getCurrLogIndex();
++      prevLogTerm = log.getCurrLogTerm();
++    }
++
++    return result;
++  }
++
++  @Override
++  protected AppendEntryResult appendEntry(
++      long prevLogIndex, long prevLogTerm, long leaderCommit, Log log) {
++
++    long startTime = Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.getOperationStartTime();
++    long appendedPos = 0;
++
++    AppendEntryResult result = new AppendEntryResult();
++    synchronized (logManager) {
++      int windowPos = (int) (log.getCurrLogIndex() - logManager.getLastLogIndex() - 1);
++      if (windowPos < 0) {
++        // the new entry may replace an appended entry
++        appendedPos = logManager.maybeAppend(prevLogIndex, prevLogTerm, leaderCommit, log);
++        result.status = Response.RESPONSE_STRONG_ACCEPT;
++        result.setLastLogIndex(logManager.getLastLogIndex());
++        result.setLastLogTerm(logManager.getLastLogTerm());
++      } else if (windowPos < windowCapacity) {
++        // the new entry falls into the window
++        logWindow[windowPos] = log;
++        prevTerms[windowPos] = prevLogTerm;
++        if (windowLength < windowPos + 1) {
++          windowLength = windowPos + 1;
++        }
++        checkLog(windowPos);
++        if (windowPos == 0) {
++          appendedPos = flushWindow(result, leaderCommit);
++        } else {
++          result.status = Response.RESPONSE_WEAK_ACCEPT;
++        }
++
++        Statistic.RAFT_WINDOW_LENGTH.add(windowLength);
++      } else {
++        Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.calOperationCostTimeFromStart(startTime);
++        result.setStatus(Response.RESPONSE_OUT_OF_WINDOW);
++        result.setHeader(getHeader());
++        return result;
++      }
++    }
++
++    Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.calOperationCostTimeFromStart(startTime);
++    if (appendedPos == -1) {
++      // the incoming log points to an illegal position, reject it
++      result.status = Response.RESPONSE_LOG_MISMATCH;
++    }
++    return result;
++  }
++}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
index beaaa77,226593a..bfb2295
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
@@@ -32,15 -29,12 +32,14 @@@ import org.apache.iotdb.cluster.server.
  import org.apache.iotdb.cluster.server.member.RaftMember;
  import org.apache.iotdb.cluster.server.monitor.Peer;
  import org.apache.iotdb.cluster.server.monitor.Timer;
 +import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
  import org.apache.iotdb.cluster.utils.ClientUtils;
 +import org.apache.iotdb.cluster.utils.ClusterUtils;
+ import org.apache.iotdb.db.concurrent.IoTDBThreadPoolFactory;
  import org.apache.iotdb.db.conf.IoTDBConstant;
  import org.apache.iotdb.db.conf.IoTDBDescriptor;
- import org.apache.iotdb.db.utils.CommonUtils;
  import org.apache.iotdb.db.utils.TestOnly;
  
- import com.google.common.util.concurrent.ThreadFactoryBuilder;
  import org.apache.thrift.TException;
  import org.apache.thrift.async.AsyncMethodCallback;
  import org.slf4j.Logger;
@@@ -68,28 -62,25 +66,29 @@@ import java.util.concurrent.atomic.Atom
  public class LogDispatcher {
  
    private static final Logger logger = LoggerFactory.getLogger(LogDispatcher.class);
 -  private RaftMember member;
 -  private boolean useBatchInLogCatchUp =
 -      ClusterDescriptor.getInstance().getConfig().isUseBatchInLogCatchUp();
 -  // each follower has a queue and a dispatch thread is attached in executorService.
 -  private List<BlockingQueue<SendLogRequest>> nodeLogQueues = new ArrayList<>();
 -  private ExecutorService executorService;
 -
 -  // TODO we have no way to close this pool.
 -  private static final ExecutorService serializationService =
 +  RaftMember member;
 +  private ClusterConfig clusterConfig = ClusterDescriptor.getInstance().getConfig();
 +  private boolean useBatchInLogCatchUp = clusterConfig.isUseBatchInLogCatchUp();
 +  List<BlockingQueue<SendLogRequest>> nodesLogQueues = new ArrayList<>();
 +  ExecutorService executorService;
 +  private static ExecutorService serializationService =
-       Executors.newFixedThreadPool(
-           CommonUtils.getCpuCores() * 2,
-           new ThreadFactoryBuilder().setDaemon(true).setNameFormat("DispatcherEncoder-%d").build());
+       IoTDBThreadPoolFactory.newFixedThreadPoolWithDaemonThread(
+           Runtime.getRuntime().availableProcessors(), "DispatcherEncoder");
+ 
 +  public static int bindingThreadNum = 1;
 +  public static int maxBatchSize = 1;
 +
    public LogDispatcher(RaftMember member) {
      this.member = member;
-     executorService = Executors.newCachedThreadPool();
+     executorService =
+         IoTDBThreadPoolFactory.newCachedThreadPool("LogDispatcher-" + member.getName());
 +    createQueueAndBindingThreads();
 +  }
 +
 +  void createQueueAndBindingThreads() {
      for (Node node : member.getAllNodes()) {
 -      if (!node.equals(member.getThisNode())) {
 -        nodeLogQueues.add(createQueueAndBindingThread(node));
 +      if (!ClusterUtils.isNodeEquals(node, member.getThisNode())) {
 +        nodesLogQueues.add(createQueueAndBindingThread(node));
        }
      }
    }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/log/VotingLogList.java
index 0000000,0000000..80878eb
new file mode 100644
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/VotingLogList.java
@@@ -1,0 -1,0 +1,104 @@@
++/*
++ * 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.cluster.log;
++
++import java.util.ArrayList;
++import java.util.List;
++
++public class VotingLogList {
++
++  private List<VotingLog> logList = new ArrayList<>();
++  private volatile long currTerm = -1;
++  private int quorumSize;
++
++  public VotingLogList(int quorumSize) {
++    this.quorumSize = quorumSize;
++  }
++
++  /**
++   * Insert a voting entry into the list. Notice the logs must be inserted in order of index, as
++   * they are inserted as soon as created
++   *
++   * @param log
++   */
++  public synchronized void insert(VotingLog log) {
++    if (log.getLog().getCurrLogTerm() != currTerm) {
++      logList.clear();
++      currTerm = log.getLog().getCurrLogTerm();
++    }
++    logList.add(log);
++  }
++
++  /**
++   * When an entry of index-term is strongly accepted by a node of acceptingNodeId, record the id in
++   * all entries whose index <= the accepted entry. If any entry is accepted by a quorum, remove it
++   * from the list.
++   *
++   * @param index
++   * @param term
++   * @param acceptingNodeId
++   * @return the lastly removed entry if any.
++   */
++  public void onStronglyAccept(long index, long term, int acceptingNodeId) {
++    int lastEntryIndexToCommit = -1;
++
++    List<VotingLog> acceptedLogs;
++    synchronized (this) {
++      for (int i = 0, logListSize = logList.size(); i < logListSize; i++) {
++        VotingLog votingLog = logList.get(i);
++        if (votingLog.getLog().getCurrLogIndex() <= index
++            && votingLog.getLog().getCurrLogTerm() == term) {
++          votingLog.getStronglyAcceptedNodeIds().add(acceptingNodeId);
++          if (votingLog.getStronglyAcceptedNodeIds().size() >= quorumSize) {
++            lastEntryIndexToCommit = i;
++          }
++          if (votingLog.getStronglyAcceptedNodeIds().size()
++                  + votingLog.getWeaklyAcceptedNodeIds().size()
++              >= quorumSize) {
++            votingLog.acceptedTime = System.nanoTime();
++          }
++        } else if (votingLog.getLog().getCurrLogIndex() > index) {
++          break;
++        }
++      }
++
++      List<VotingLog> tmpAcceptedLogs = logList.subList(0, lastEntryIndexToCommit + 1);
++      acceptedLogs = new ArrayList<>(tmpAcceptedLogs);
++      tmpAcceptedLogs.clear();
++    }
++
++    if (lastEntryIndexToCommit != -1) {
++      for (VotingLog acceptedLog : acceptedLogs) {
++        synchronized (acceptedLog) {
++          acceptedLog.acceptedTime = System.nanoTime();
++          acceptedLog.notifyAll();
++        }
++      }
++    }
++  }
++
++  public synchronized void clear() {
++    logList.clear();
++  }
++
++  public int size() {
++    return logList.size();
++  }
++}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
index fcb70cb,ea77244..233a90a
--- a/cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
@@@ -211,13 -213,13 +213,13 @@@ public class SlotPartitionTable impleme
      return ret;
    }
  
-   public PartitionGroup getHeaderGroup(RaftNode raftNode, List<Node> nodeRing) {
-     PartitionGroup ret = new PartitionGroup(raftNode.getRaftId());
+   public PartitionGroup getPartitionGroup(RaftNode header, List<Node> nodeRing) {
+     PartitionGroup ret = new PartitionGroup(header.getRaftId());
  
      // assuming the nodes are [1,2,3,4,5]
-     int nodeIndex = findNodeIndex(raftNode.getNode());
 -    int nodeIndex = nodeRing.indexOf(header.getNode());
++    int nodeIndex = findNodeIndex(header.getNode());
      if (nodeIndex == -1) {
-       logger.warn("Node {} is not in the cluster", raftNode.getNode());
+       logger.warn("Node {} is not in the cluster", header.getNode());
        return null;
      }
      int endIndex = nodeIndex + replicationNum;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
index b6c0df2,2945726..c243bca
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
@@@ -84,59 -83,50 +84,60 @@@ public class AppendNodeEntryHandler imp
        // someone has rejected this log because the leadership is stale
        return;
      }
 -    long resp = response;
 -    synchronized (voteCounter) {
 -      if (resp == RESPONSE_AGREE) {
 -        int remaining = voteCounter.decrementAndGet();
 -        logger.debug(
 -            "{}: Received an agreement from {} for {}, remaining votes to succeed: {}",
 -            member.getName(),
 -            receiver,
 -            log,
 -            remaining);
 -        if (remaining == 0) {
 -          logger.debug(
 -              "{}: Log [{}] {} is accepted by the quorum",
 -              member.getName(),
 -              log.getCurrLogIndex(),
 -              log);
 -          voteCounter.notifyAll();
 +
 +    long resp = response.status;
 +
 +    if (resp == RESPONSE_STRONG_ACCEPT) {
 +      synchronized (log) {
 +        if (log.getWeaklyAcceptedNodeIds().size() + log.getStronglyAcceptedNodeIds().size()
 +            >= quorumSize) {
 +          log.acceptedTime = System.nanoTime();
          }
 -        peer.setMatchIndex(Math.max(log.getCurrLogIndex(), peer.getMatchIndex()));
 -      } else if (resp > 0) {
 -        // a response > 0 is the follower's term
 -        // the leader ship is stale, wait for the new leader's heartbeat
 -        long prevReceiverTerm = receiverTerm.get();
 -        logger.debug(
 -            "{}: Received a rejection from {} because term is stale: {}/{} for log {}",
 -            member.getName(),
 -            receiver,
 -            prevReceiverTerm,
 -            resp,
 -            log);
 -        if (resp > prevReceiverTerm) {
 -          receiverTerm.set(resp);
 +        log.getStronglyAcceptedNodeIds().add(receiver.nodeIdentifier);
 +        log.notifyAll();
 +      }
 +      member
 +          .getVotingLogList()
 +          .onStronglyAccept(
 +              log.getLog().getCurrLogIndex(),
 +              log.getLog().getCurrLogTerm(),
 +              receiver.nodeIdentifier);
 +      peer.setMatchIndex(Math.max(log.getLog().getCurrLogIndex(), peer.getMatchIndex()));
 +    } else if (resp > 0) {
 +      // a response > 0 is the follower's term
 +      // the leader ship is stale, wait for the new leader's heartbeat
 +      long prevReceiverTerm = receiverTerm.get();
 +      logger.debug(
-           "{}: Received a rejection from {} because term is stale: {}/{}",
++          "{}: Received a rejection from {} because term is stale: {}/{}, log: {}",
 +          member.getName(),
 +          receiver,
 +          prevReceiverTerm,
-           resp);
++          resp,
++          log);
 +      if (resp > prevReceiverTerm) {
 +        receiverTerm.set(resp);
 +      }
 +      leaderShipStale.set(true);
 +      synchronized (log) {
 +        log.notifyAll();
 +      }
 +    } else if (resp == RESPONSE_WEAK_ACCEPT) {
 +      synchronized (log) {
 +        if (log.getWeaklyAcceptedNodeIds().size() + log.getStronglyAcceptedNodeIds().size()
 +            >= quorumSize) {
 +          log.acceptedTime = System.nanoTime();
          }
 -        leaderShipStale.set(true);
 -        voteCounter.notifyAll();
 -      } else {
 -        // e.g., Response.RESPONSE_LOG_MISMATCH
 -        logger.debug(
 -            "{}: The log {} is rejected by {} because: {}", member.getName(), log, receiver, resp);
 -        onFail();
 +        log.getWeaklyAcceptedNodeIds().add(receiver.nodeIdentifier);
 +        log.notifyAll();
        }
 -      // rejected because the receiver's logs are stale or the receiver has no cluster info, just
 -      // wait for the heartbeat to handle
 +    } else {
 +      // e.g., Response.RESPONSE_LOG_MISMATCH
 +      logger.debug(
 +          "{}: The log {} is rejected by {} because: {}", member.getName(), log, receiver, resp);
 +      onFail();
      }
 +    // rejected because the receiver's logs are stale or the receiver has no cluster info, just
 +    // wait for the heartbeat to handle
    }
  
    @Override
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
index 2ccc37f,38a314d..c503296
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
@@@ -31,9 -32,6 +32,7 @@@ import org.apache.iotdb.cluster.server.
  import org.apache.iotdb.cluster.server.handlers.caller.ElectionHandler;
  import org.apache.iotdb.cluster.server.handlers.caller.HeartbeatHandler;
  import org.apache.iotdb.cluster.server.member.RaftMember;
- import org.apache.iotdb.cluster.utils.ClientUtils;
 +import org.apache.iotdb.cluster.utils.ClusterUtils;
  
  import org.apache.thrift.TException;
  import org.apache.thrift.transport.TTransportException;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
index cb28a64,f8ce0b8..23a0724
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
@@@ -94,13 -87,10 +96,16 @@@ public class MetaHeartbeatThread extend
        // operation can be carried out in time.
        localMetaMember
            .getAppendLogThreadPool()
 -          .submit(() -> localMetaMember.processEmptyContentLog());
 +          .submit(
 +              () -> {
-                 while (localMetaMember.getPartitionTable() == null) {
++                while (!localMetaMember.isReady()) {
 +                  // wait until partition table is ready
 +                }
 +                localMetaMember.processPlanLocally(new DummyPlan());
 +              });
+       // this is a risk that (1) put a task into a pool
+       // and (2) the task puts more sub-tasks into the same pool, especially the task can only
+       // terminal when all sub-tasks finish.
      }
    }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
index 292dafe,690a826..6472835
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
@@@ -180,27 -193,28 +194,28 @@@ public class DataGroupMember extends Ra
      lastAppliedPartitionTableVersion = new LastAppliedPatitionTableVersion(getMemberDir());
    }
  
-   DataGroupMember(
-       TProtocolFactory factory,
-       PartitionGroup nodes,
-       Node thisNode,
-       MetaGroupMember metaGroupMember) {
+   DataGroupMember(TProtocolFactory factory, PartitionGroup nodes, MetaGroupMember metaGroupMember) {
+     // The name is used in JMX, so we have to avoid to use "(" "," "=" ")"
      super(
-         "Data("
+         "Data-"
              + nodes.getHeader().getNode().getInternalIp()
-             + ":"
-             + nodes.getHeader().getNode().getMetaPort()
-             + ", raftId="
-             + nodes.getId()
-             + ")",
-         new AsyncClientPool(new AsyncDataClient.FactoryAsync(factory)),
-         new SyncClientPool(new SyncDataClient.FactorySync(factory)),
-         new AsyncClientPool(new AsyncDataHeartbeatClient.FactoryAsync(factory)),
-         new SyncClientPool(new SyncDataHeartbeatClient.FactorySync(factory)),
-         new AsyncClientPool(new SingleManagerFactory(factory)));
-     this.thisNode = thisNode;
+             + "-"
+             + nodes.getHeader().getNode().getDataPort()
+             + "-raftId-"
+             + nodes.getRaftId()
+             + "",
+         new ClientManager(
+             ClusterDescriptor.getInstance().getConfig().isUseAsyncServer(),
+             ClientManager.Type.DataGroupClient));
      this.metaGroupMember = metaGroupMember;
 -    allNodes = nodes;
 +    setAllNodes(nodes);
+     mbeanName =
+         String.format(
+             "%s:%s=%s%d",
+             "org.apache.iotdb.cluster.service",
+             IoTDBConstant.JMX_TYPE,
+             "DataMember",
+             getRaftGroupId());
      setQueryManager(new ClusterQueryManager());
      slotManager = new SlotManager(ClusterConstant.SLOT_NUM, getMemberDir(), getName());
      dataLogApplier = new DataLogApplier(metaGroupMember, this);
@@@ -899,9 -925,10 +929,10 @@@
        logger.debug("{}: start to pre remove node {}", name, removedNode);
      }
      synchronized (allNodes) {
 -      if (allNodes.contains(removedNode) && allNodes.size() == config.getReplicationNum()) {
 +      if (containsNode(removedNode) && allNodes.size() == config.getReplicationNum()) {
          // update the group if the deleted node was in it
-         PartitionGroup newGroup = metaGroupMember.getPartitionTable().getHeaderGroup(getHeader());
+         PartitionGroup newGroup =
+             metaGroupMember.getPartitionTable().getPartitionGroup(getHeader());
          if (newGroup == null) {
            return;
          }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
index ad0f55c,f057131..aba662c
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
@@@ -272,12 -229,7 +229,8 @@@ public class MetaGroupMember extends Ra
      // load the identifier from the disk or generate a new one
      loadIdentifier();
      allNodes.add(thisNode);
 +    idNodeMap.put(thisNode.nodeIdentifier, thisNode);
  
-     Factory dataMemberFactory = new Factory(factory, this);
-     dataClusterServer = new DataClusterServer(thisNode, dataMemberFactory, this);
-     dataHeartbeatServer = new DataHeartbeatServer(thisNode, dataClusterServer);
-     clientServer = new ClientServer(this);
      startUpStatus = getNewStartUpStatus();
  
      // try loading the partition table if there was a previous cluster
@@@ -725,35 -648,8 +649,21 @@@
      if (response.isSetFollowerIdentifier()) {
        // register the follower, the response.getFollower() contains the node information of the
        // receiver.
 -      registerNodeIdentifier(response.getFollower(), response.getFollowerIdentifier());
 +      Node localNode = null;
 +      for (Node node : allNodes) {
 +        if (node.getInternalIp().equals(response.getFollower().internalIp)
 +            && node.getMetaPort() == response.getFollower().getMetaPort()) {
 +          localNode = node;
 +        }
 +      }
 +      if (localNode == null) {
 +        logger.warn(
 +            "Received a heartbeat response from a node that is not in the node list: {}",
 +            response.getFollower());
 +        return;
 +      }
 +      registerNodeIdentifier(localNode, response.getFollowerIdentifier());
-       // if all nodes' ids are known, we can build the partition table
-       if (allNodesIdKnown()) {
-         // When the meta raft group is established, the follower reports its node information to the
-         // leader through the first heartbeat. After the leader knows the node information of all
-         // nodes, it can replace the incomplete node information previously saved locally, and build
-         // partitionTable to send it to other followers.
-         setAllNodes(new PartitionGroup(idNodeMap.values()));
-         if (partitionTable == null) {
-           partitionTable = new SlotPartitionTable(allNodes, thisNode);
-           logger.info("Partition table is set up");
-         }
-         router = new ClusterPlanRouter(partitionTable);
-         this.coordinator.setRouter(router);
-         startSubServers();
-       }
+       buildMetaEngineServiceIfNotReady();
      }
      // record the requirement of partition table of the follower
      if (response.isRequirePartitionTable()) {
@@@ -761,6 -657,29 +671,29 @@@
      }
    }
  
+   public void buildMetaEngineServiceIfNotReady() {
+     // if all nodes' ids are known, we can build the partition table
+     if (!ready && allNodesIdKnown()) {
+       // Notice that this should only be called once.
+ 
+       // When the meta raft group is established, the follower reports its node information to the
+       // leader through the first heartbeat. After the leader knows the node information of all
+       // nodes, it can replace the incomplete node information previously saved locally, and build
+       // partitionTable to send it to other followers.
 -      allNodes = new PartitionGroup(idNodeMap.values());
++      setAllNodes(new PartitionGroup(idNodeMap.values()));
+       if (partitionTable == null) {
+         partitionTable = new SlotPartitionTable(allNodes, thisNode);
+         logger.info("Partition table is set up");
+       }
+ 
+       router = new ClusterPlanRouter(partitionTable);
+       this.coordinator.setRouter(router);
+       rebuildDataGroups();
+       logger.info("The Meta Engine is ready");
+       this.ready = true;
+     }
+   }
+ 
    /**
     * When a node requires a partition table in its heartbeat response, add it into blindNodes so in
     * the next heartbeat the partition table will be sent to the node.
@@@ -1201,13 -1172,12 +1152,13 @@@
          return null;
        }
        try {
 +        logger.debug("calling rpc");
          return client.checkStatus(getStartUpStatus());
        } catch (TException e) {
-         client.getInputProtocol().getTransport().close();
+         client.close();
          logger.warn("Error occurs when check status on node : {}", seedNode);
        } finally {
-         ClientUtils.putBackSyncClient(client);
+         client.returnSelf();
        }
      }
      return null;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
index cd54aa6,ad356fb..4c6bd8a
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
@@@ -37,7 -38,6 +39,8 @@@ import org.apache.iotdb.cluster.log.Log
  import org.apache.iotdb.cluster.log.LogDispatcher;
  import org.apache.iotdb.cluster.log.LogDispatcher.SendLogRequest;
  import org.apache.iotdb.cluster.log.LogParser;
 +import org.apache.iotdb.cluster.log.VotingLog;
++import org.apache.iotdb.cluster.log.VotingLogList;
  import org.apache.iotdb.cluster.log.catchup.CatchUpTask;
  import org.apache.iotdb.cluster.log.logtypes.PhysicalPlanLog;
  import org.apache.iotdb.cluster.log.manage.RaftLogManager;
@@@ -62,8 -57,7 +65,8 @@@ import org.apache.iotdb.cluster.server.
  import org.apache.iotdb.cluster.server.Response;
  import org.apache.iotdb.cluster.server.handlers.caller.AppendNodeEntryHandler;
  import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 +import org.apache.iotdb.cluster.server.handlers.forwarder.IndirectAppendHandler;
+ import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
  import org.apache.iotdb.cluster.server.monitor.Peer;
  import org.apache.iotdb.cluster.server.monitor.Timer;
  import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
@@@ -88,9 -84,7 +94,8 @@@ import org.apache.iotdb.db.utils.TestOn
  import org.apache.iotdb.rpc.RpcUtils;
  import org.apache.iotdb.rpc.TSStatusCode;
  import org.apache.iotdb.service.rpc.thrift.TSStatus;
 +import org.apache.iotdb.tsfile.utils.Pair;
  
- import com.google.common.util.concurrent.ThreadFactoryBuilder;
  import org.apache.thrift.TException;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@@ -111,12 -104,11 +116,10 @@@ import java.util.Random
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ExecutionException;
  import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
  import java.util.concurrent.Future;
  import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
  import java.util.concurrent.TimeUnit;
  import java.util.concurrent.atomic.AtomicBoolean;
 -import java.util.concurrent.atomic.AtomicInteger;
  import java.util.concurrent.atomic.AtomicLong;
  import java.util.concurrent.atomic.AtomicReference;
  
@@@ -126,18 -118,9 +129,17 @@@ import static org.apache.iotdb.cluster.
   * RaftMember process the common raft logic like leader election, log appending, catch-up and so on.
   */
  @SuppressWarnings("java:S3077") // reference volatile is enough
- public abstract class RaftMember {
- 
+ public abstract class RaftMember implements RaftMemberMBean {
    private static final Logger logger = LoggerFactory.getLogger(RaftMember.class);
 -  public static final boolean USE_LOG_DISPATCHER = false;
 +  public static boolean USE_LOG_DISPATCHER = false;
 +  public static boolean USE_INDIRECT_LOG_DISPATCHER = false;
 +  public static boolean ENABLE_WEAK_ACCEPTANCE = true;
 +  public static boolean ENABLE_COMMIT_RETURN = false;
 +
 +  protected static final LogSequencerFactory SEQUENCER_FACTORY =
 +      ClusterDescriptor.getInstance().getConfig().isUseAsyncSequencing()
 +          ? new Factory()
 +          : new SynchronousSequencer.Factory();
  
    private static final String MSG_FORWARD_TIMEOUT = "{}: Forward {} to {} time out";
    private static final String MSG_FORWARD_ERROR =
@@@ -193,12 -176,10 +195,12 @@@
     * offline.
     */
    volatile long lastHeartbeatReceivedTime;
 +
    /** the raft logs are all stored and maintained in the log manager */
 -  RaftLogManager logManager;
 +  protected RaftLogManager logManager;
 +
    /**
-    * s the single thread pool that runs the heartbeat thread, which send heartbeats to the follower
+    * the single thread pool that runs the heartbeat thread, which send heartbeats to the follower
     * when this node is a leader, or start elections when this node is an elector.
     */
    ExecutorService heartBeatService;
@@@ -266,43 -242,11 +263,19 @@@
     */
    protected PlanExecutor localExecutor;
  
 +  /** (logIndex, logTerm) -> append handler */
 +  protected Map<Pair<Long, Long>, AppendNodeEntryHandler> sentLogHandlers =
 +      new ConcurrentHashMap<>();
 +
 +  protected VotingLogList votingLogList;
 +
-   protected RaftMember() {}
- 
 +  protected LogSequencer logSequencer;
 +
-   protected RaftMember(
-       String name,
-       AsyncClientPool asyncPool,
-       SyncClientPool syncPool,
-       AsyncClientPool asyncHeartbeatPool,
-       SyncClientPool syncHeartbeatPool) {
-     this.name = name;
-     this.asyncClientPool = asyncPool;
-     this.syncClientPool = syncPool;
-     this.asyncHeartbeatClientPool = asyncHeartbeatPool;
-     this.syncHeartbeatClientPool = syncHeartbeatPool;
-     this.asyncSendLogClientPool = asyncClientPool;
-   }
- 
-   protected RaftMember(
-       String name,
-       AsyncClientPool asyncPool,
-       SyncClientPool syncPool,
-       AsyncClientPool asyncHeartbeatPool,
-       SyncClientPool syncHeartbeatPool,
-       AsyncClientPool asyncSendLogClientPool) {
+   protected RaftMember() {}
+ 
+   protected RaftMember(String name, ClientManager clientManager) {
      this.name = name;
-     this.asyncClientPool = asyncPool;
-     this.syncClientPool = syncPool;
-     this.asyncHeartbeatClientPool = asyncHeartbeatPool;
-     this.syncHeartbeatClientPool = syncHeartbeatPool;
-     this.asyncSendLogClientPool = asyncSendLogClientPool;
+     this.clientManager = clientManager;
    }
  
    /**
@@@ -698,26 -569,9 +664,8 @@@
      return localExecutor;
    }
  
-   /**
-    * Get an asynchronous heartbeat thrift client to the given node.
-    *
-    * @return an asynchronous thrift client or null if the caller tries to connect the local node.
-    */
-   public AsyncClient getAsyncHeartbeatClient(Node node) {
-     return getAsyncClient(node, asyncHeartbeatClientPool, false);
-   }
- 
-   /**
-    * NOTICE: client.putBack() must be called after use.
-    *
-    * @return the heartbeat client for the node
-    */
-   public Client getSyncHeartbeatClient(Node node) {
-     return getSyncClient(syncHeartbeatClientPool, node, false);
-   }
- 
    public void sendLogAsync(
 -      Log log,
 -      AtomicInteger voteCounter,
 +      VotingLog log,
        Node node,
        AtomicBoolean leaderShipStale,
        AtomicLong newLeaderTerm,
@@@ -888,8 -718,10 +832,10 @@@
     * @param plan a non-query plan.
     * @return A TSStatus indicating the execution result.
     */
 -  abstract TSStatus executeNonQueryPlan(PhysicalPlan plan);
 +  protected abstract TSStatus executeNonQueryPlan(PhysicalPlan plan);
  
+   abstract ClientCategory getClientCategory();
+ 
    /**
     * according to the consistency configuration, decide whether to execute syncLeader or not and
     * throws exception when failed. Note that the write request will always try to sync leader
@@@ -1130,39 -967,34 +1081,39 @@@
      long startTime = Timer.Statistic.RAFT_SENDER_APPEND_LOG.getOperationStartTime();
  
      Log log;
 +    if (plan instanceof LogPlan) {
 +      try {
 +        log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
 +      } catch (UnknownLogTypeException e) {
 +        logger.error("Can not parse LogPlan {}", plan, e);
 +        return StatusUtils.PARSE_LOG_ERROR;
 +      }
 +    } else {
 +      log = new PhysicalPlanLog();
 +      ((PhysicalPlanLog) log).setPlan(plan);
 +      plan.setIndex(logManager.getLastLogIndex() + 1);
 +    }
 +    // if a single log exceeds the threshold
 +    // we need to return error code to the client as in server mode
-     //    if (log.serialize().capacity() + Integer.BYTES
-     //        >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
-     //      logger.error(
-     //          "Log cannot fit into buffer, please increase raft_log_buffer_size;"
-     //              + "or reduce the size of requests you send.");
-     //      return StatusUtils.INTERNAL_ERROR;
-     //    }
++    if (log.serialize().capacity() + Integer.BYTES
++        >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
++      logger.error(
++          "Log cannot fit into buffer, please increase raft_log_buffer_size;"
++              + "or reduce the size of requests you send.");
++      return StatusUtils.INTERNAL_ERROR;
++    }
 +
      // assign term and index to the new log and append it
 +    VotingLog votingLog;
      synchronized (logManager) {
 -      if (plan instanceof LogPlan) {
 -        try {
 -          log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
 -        } catch (UnknownLogTypeException e) {
 -          logger.error("Can not parse LogPlan {}", plan, e);
 -          return StatusUtils.PARSE_LOG_ERROR;
 -        }
 -      } else {
 -        log = new PhysicalPlanLog();
 -        ((PhysicalPlanLog) log).setPlan(plan);
 -        plan.setIndex(logManager.getLastLogIndex() + 1);
 -      }
        log.setCurrLogTerm(getTerm().get());
        log.setCurrLogIndex(logManager.getLastLogIndex() + 1);
 -
 -      // if a single log exceeds the threshold
 -      // we need to return error code to the client as in server mode
 -      if (log.serialize().capacity() + Integer.BYTES
 -          >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
 -        logger.error(
 -            "Log cannot fit into buffer, please increase raft_log_buffer_size;"
 -                + "or reduce the size of requests you send.");
 -        return StatusUtils.INTERNAL_ERROR;
 -      }
        logManager.append(log);
 +      votingLog = buildVotingLog(log);
 +      votingLogList.insert(votingLog);
      }
 +    log.setCreateTime(System.nanoTime());
 +
      Timer.Statistic.RAFT_SENDER_APPEND_LOG.calOperationCostTimeFromStart(startTime);
  
      try {
@@@ -1181,32 -1012,54 +1132,32 @@@
      if (readOnly) {
        return StatusUtils.NODE_READ_ONLY;
      }
 -    // assign term and index to the new log and append it
 -    SendLogRequest sendLogRequest;
  
 -    long startTime =
 -        Statistic.RAFT_SENDER_COMPETE_LOG_MANAGER_BEFORE_APPEND_V2.getOperationStartTime();
      Log log;
 -    synchronized (logManager) {
 -      Statistic.RAFT_SENDER_COMPETE_LOG_MANAGER_BEFORE_APPEND_V2.calOperationCostTimeFromStart(
 -          startTime);
 -
 -      if (plan instanceof LogPlan) {
 -        try {
 -          log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
 -        } catch (UnknownLogTypeException e) {
 -          logger.error("Can not parse LogPlan {}", plan, e);
 -          return StatusUtils.PARSE_LOG_ERROR;
 -        }
 -      } else {
 -        log = new PhysicalPlanLog();
 -        ((PhysicalPlanLog) log).setPlan(plan);
 -        plan.setIndex(logManager.getLastLogIndex() + 1);
 -      }
 -      log.setCurrLogTerm(getTerm().get());
 -      log.setCurrLogIndex(logManager.getLastLogIndex() + 1);
 -
 -      startTime = Timer.Statistic.RAFT_SENDER_APPEND_LOG_V2.getOperationStartTime();
 -      // just like processPlanLocally,we need to check the size of log
 -      if (log.serialize().capacity() + Integer.BYTES
 -          >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
 -        logger.error(
 -            "Log cannot fit into buffer, please increase raft_log_buffer_size;"
 -                + "or reduce the size of requests you send.");
 -        return StatusUtils.INTERNAL_ERROR;
 +    if (plan instanceof LogPlan) {
 +      try {
 +        log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
 +      } catch (UnknownLogTypeException e) {
 +        logger.error("Can not parse LogPlan {}", plan, e);
 +        return StatusUtils.PARSE_LOG_ERROR;
        }
 -      // logDispatcher will serialize log, and set log size, and we will use the size after it
 -      logManager.append(log);
 -      Timer.Statistic.RAFT_SENDER_APPEND_LOG_V2.calOperationCostTimeFromStart(startTime);
 -
 -      startTime = Statistic.RAFT_SENDER_BUILD_LOG_REQUEST.getOperationStartTime();
 -      sendLogRequest = buildSendLogRequest(log);
 -      Statistic.RAFT_SENDER_BUILD_LOG_REQUEST.calOperationCostTimeFromStart(startTime);
 +    } else {
 +      log = new PhysicalPlanLog();
 +      ((PhysicalPlanLog) log).setPlan(plan);
 +    }
  
 -      startTime = Statistic.RAFT_SENDER_OFFER_LOG.getOperationStartTime();
 -      log.setCreateTime(System.nanoTime());
 -      getLogDispatcher().offer(sendLogRequest);
 -      Statistic.RAFT_SENDER_OFFER_LOG.calOperationCostTimeFromStart(startTime);
 +    // just like processPlanLocally,we need to check the size of log
-     //    if (log.serialize().capacity() + Integer.BYTES
-     //        >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
-     //      logger.error(
-     //          "Log cannot fit into buffer, please increase raft_log_buffer_size;"
-     //              + "or reduce the size of requests you send.");
-     //      return StatusUtils.INTERNAL_ERROR;
-     //    }
++    if (log.serialize().capacity() + Integer.BYTES
++        >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
++      logger.error(
++          "Log cannot fit into buffer, please increase raft_log_buffer_size;"
++              + "or reduce the size of requests you send.");
++      return StatusUtils.INTERNAL_ERROR;
+     }
  
 +    // assign term and index to the new log and append it
 +    SendLogRequest sendLogRequest = logSequencer.sequence(log);
 +
      try {
        AppendLogResult appendLogResult =
            waitAppendResult(
@@@ -1618,28 -1502,18 +1621,27 @@@
     * one follower tells the node that it is no longer a valid leader, or a timeout is triggered.
     */
    @SuppressWarnings({"java:S2445"}) // safe synchronized
 -  private AppendLogResult waitAppendResult(
 -      AtomicInteger voteCounter, AtomicBoolean leaderShipStale, AtomicLong newLeaderTerm) {
 +  protected AppendLogResult waitAppendResult(
 +      VotingLog log, AtomicBoolean leaderShipStale, AtomicLong newLeaderTerm, int quorumSize) {
      // wait for the followers to vote
      long startTime = Timer.Statistic.RAFT_SENDER_VOTE_COUNTER.getOperationStartTime();
 -    synchronized (voteCounter) {
 +    long nextTimeToPrint = 15000;
 +
 +    int stronglyAcceptedNodeNum = log.getStronglyAcceptedNodeIds().size();
 +    int weaklyAcceptedNodeNum = log.getWeaklyAcceptedNodeIds().size();
 +    int totalAccepted = stronglyAcceptedNodeNum + weaklyAcceptedNodeNum;
 +
 +    synchronized (log) {
        long waitStart = System.currentTimeMillis();
        long alreadyWait = 0;
 -      while (voteCounter.get() > 0
 +      while (stronglyAcceptedNodeNum < quorumSize
 +          && (!ENABLE_WEAK_ACCEPTANCE
 +              || (totalAccepted < allNodes.size() - 1)
 +              || votingLogList.size() > config.getMaxNumOfLogsInMem())
-           && alreadyWait < RaftServer.getWriteOperationTimeoutMS()
+           && alreadyWait < ClusterConstant.getWriteOperationTimeoutMS()
 -          && voteCounter.get() != Integer.MAX_VALUE) {
 +          && !log.getStronglyAcceptedNodeIds().contains(Integer.MAX_VALUE)) {
          try {
 -          voteCounter.wait(ClusterConstant.getWriteOperationTimeoutMS());
 +          log.wait(0);
-           logger.debug("{} ends waiting", log);
          } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            logger.warn("Unexpected interruption when sending a log", e);
@@@ -2168,8 -1964,8 +2170,9 @@@
      long alreadyWait = 0;
      Object logUpdateCondition = logManager.getLogUpdateCondition(prevLogIndex);
      long lastLogIndex = logManager.getLastLogIndex();
 +    Timer.Statistic.RAFT_RECEIVER_INDEX_DIFF.add(prevLogIndex - lastLogIndex);
-     while (lastLogIndex < prevLogIndex && alreadyWait <= RaftServer.getWriteOperationTimeoutMS()) {
+     while (lastLogIndex < prevLogIndex
+         && alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS()) {
        try {
          // each time new logs are appended, this will be notified
          synchronized (logUpdateCondition) {
@@@ -2186,10 -1982,10 +2189,10 @@@
        alreadyWait = System.currentTimeMillis() - waitStart;
      }
  
-     return alreadyWait <= RaftServer.getWriteOperationTimeoutMS();
+     return alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS();
    }
  
 -  private long checkPrevLogIndex(long prevLogIndex) {
 +  protected long checkPrevLogIndex(long prevLogIndex) {
      long lastLogIndex = logManager.getLastLogIndex();
      long startTime = Timer.Statistic.RAFT_RECEIVER_WAIT_FOR_PREV_LOG.getOperationStartTime();
      if (lastLogIndex < prevLogIndex && !waitForPrevLog(prevLogIndex)) {
@@@ -2281,40 -2075,13 +2284,40 @@@
    }
  
    public int getRaftGroupId() {
-     return allNodes.getId();
+     return allNodes.getRaftId();
    }
  
 -  enum AppendLogResult {
 +  protected enum AppendLogResult {
      OK,
      TIME_OUT,
 -    LEADERSHIP_STALE
 +    LEADERSHIP_STALE,
 +    WEAK_ACCEPT
 +  }
 +
 +  /**
 +   * Process the result from an indirect receiver of an entry.
 +   *
 +   * @param ack acknowledgement from an indirect receiver.
 +   */
 +  public void acknowledgeAppendLog(AppendEntryResult ack) {
 +    AppendNodeEntryHandler appendNodeEntryHandler =
 +        sentLogHandlers.get(new Pair<>(ack.lastLogIndex, ack.lastLogTerm));
 +    if (appendNodeEntryHandler != null) {
 +      appendNodeEntryHandler.onComplete(ack);
 +    }
 +  }
 +
 +  public void registerAppendLogHandler(
 +      Pair<Long, Long> indexTerm, AppendNodeEntryHandler appendNodeEntryHandler) {
 +    sentLogHandlers.put(indexTerm, appendNodeEntryHandler);
 +  }
 +
 +  public void removeAppendLogHandler(Pair<Long, Long> indexTerm) {
 +    sentLogHandlers.remove(indexTerm);
 +  }
 +
 +  public VotingLogList getVotingLogList() {
 +    return votingLogList;
    }
  
    public Object getHeartBeatWaitObject() {
@@@ -2329,13 -2096,32 +2332,42 @@@
      this.skipElection = skipElection;
    }
  
 +  protected boolean containsNode(Node node) {
 +    for (Node localNode : allNodes) {
 +      if ((localNode.getInternalIp().equals(node.getInternalIp())
 +          && localNode.getMetaPort() == node.getMetaPort())) {
 +        return true;
 +      }
 +    }
 +    return false;
 +  }
++
+   public long getLastReportedLogIndex() {
+     return lastReportedLogIndex;
+   }
+ 
+   @Override
+   public String getAllNodesAsString() {
+     return allNodes.toString();
+   }
+ 
+   @Override
+   public String getPeerMapAsString() {
+     return peerMap.toString();
+   }
+ 
+   @Override
+   public String getLeaderAsString() {
+     return leader.get().toString();
+   }
+ 
+   @Override
+   public String getLogManagerObject() {
+     return getLogManager().toString();
+   }
+ 
+   @Override
+   public String getLastCatchUpResponseTimeAsString() {
+     return lastCatchUpResponseTime.toString();
+   }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
index 0000000,2fec073..ddec446
mode 000000,100644..100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
@@@ -1,0 -1,743 +1,776 @@@
+ /*
+  * 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.cluster.server.service;
+ 
+ import org.apache.iotdb.cluster.rpc.thrift.AppendEntriesRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
+ import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
+ import org.apache.iotdb.cluster.rpc.thrift.GetAggrResultRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.GetAllPathsResult;
+ import org.apache.iotdb.cluster.rpc.thrift.GroupByRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
+ import org.apache.iotdb.cluster.rpc.thrift.LastQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.MultSeriesQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.Node;
+ import org.apache.iotdb.cluster.rpc.thrift.PreviousFillRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSchemaRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSchemaResp;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSnapshotRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSnapshotResp;
+ import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
+ import org.apache.iotdb.cluster.rpc.thrift.RequestCommitIndexResponse;
+ import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.SingleSeriesQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.TSDataService;
+ import org.apache.iotdb.cluster.utils.IOUtils;
+ import org.apache.iotdb.service.rpc.thrift.TSStatus;
+ 
+ import org.apache.thrift.TException;
+ import org.apache.thrift.async.AsyncMethodCallback;
+ 
+ import java.io.File;
+ import java.io.IOException;
+ import java.nio.ByteBuffer;
+ import java.nio.file.Files;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+ 
+ public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataService.Iface {
+ 
+   @Override
+   public void sendHeartbeat(
+       HeartBeatRequest request, AsyncMethodCallback<HeartBeatResponse> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.sendHeartbeat(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void startElection(ElectionRequest request, AsyncMethodCallback<Long> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.startElection(request, resultHandler);
+     }
+   }
+ 
+   @Override
 -  public void appendEntries(AppendEntriesRequest request, AsyncMethodCallback<Long> resultHandler) {
++  public void appendEntries(
++      AppendEntriesRequest request, AsyncMethodCallback<AppendEntryResult> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.appendEntries(request, resultHandler);
+     }
+   }
+ 
+   @Override
 -  public void appendEntry(AppendEntryRequest request, AsyncMethodCallback<Long> resultHandler) {
++  public void appendEntry(
++      AppendEntryRequest request, AsyncMethodCallback<AppendEntryResult> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.appendEntry(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void sendSnapshot(SendSnapshotRequest request, AsyncMethodCallback<Void> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.sendSnapshot(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void pullSnapshot(
+       PullSnapshotRequest request, AsyncMethodCallback<PullSnapshotResp> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.pullSnapshot(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void executeNonQueryPlan(
+       ExecutNonQueryReq request, AsyncMethodCallback<TSStatus> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.executeNonQueryPlan(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void requestCommitIndex(
+       RaftNode header, AsyncMethodCallback<RequestCommitIndexResponse> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Request commit index");
+     if (service != null) {
+       service.requestCommitIndex(header, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void readFile(
+       String filePath, long offset, int length, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     try {
+       resultHandler.onComplete(IOUtils.readFile(filePath, offset, length));
+     } catch (IOException e) {
+       resultHandler.onError(e);
+     }
+   }
+ 
+   @Override
+   public void querySingleSeries(
+       SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(
+                 request.getHeader(), resultHandler, "Query series:" + request.getPath());
+     if (service != null) {
+       service.querySingleSeries(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void queryMultSeries(
+       MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) throws TException {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(
+                 request.getHeader(), resultHandler, "Query series:" + request.getPath());
+     if (service != null) {
+       service.queryMultSeries(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void fetchSingleSeries(
+       RaftNode header, long readerId, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Fetch reader:" + readerId);
+     if (service != null) {
+       service.fetchSingleSeries(header, readerId, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void fetchMultSeries(
+       RaftNode header,
+       long readerId,
+       List<String> paths,
+       AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
+       throws TException {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Fetch reader:" + readerId);
+     if (service != null) {
+       service.fetchMultSeries(header, readerId, paths, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getAllPaths(
+       RaftNode header,
+       List<String> paths,
+       boolean withAlias,
+       AsyncMethodCallback<GetAllPathsResult> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Find path:" + paths);
+     if (service != null) {
+       service.getAllPaths(header, paths, withAlias, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void endQuery(
+       RaftNode header, Node thisNode, long queryId, AsyncMethodCallback<Void> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "End query");
+     if (service != null) {
+       service.endQuery(header, thisNode, queryId, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void querySingleSeriesByTimestamp(
+       SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(
+                 request.getHeader(),
+                 resultHandler,
+                 "Query by timestamp:"
+                     + request.getQueryId()
+                     + "#"
+                     + request.getPath()
+                     + " of "
+                     + request.getRequester());
+     if (service != null) {
+       service.querySingleSeriesByTimestamp(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void fetchSingleSeriesByTimestamps(
+       RaftNode header,
+       long readerId,
+       List<Long> timestamps,
+       AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Fetch by timestamp:" + readerId);
+     if (service != null) {
+       service.fetchSingleSeriesByTimestamps(header, readerId, timestamps, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void pullTimeSeriesSchema(
+       PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.pullTimeSeriesSchema(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void pullMeasurementSchema(
+       PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, "Pull measurement schema");
+     if (service != null) {
+       service.pullMeasurementSchema(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getAllDevices(
+       RaftNode header, List<String> paths, AsyncMethodCallback<Set<String>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Get all devices");
+     if (service != null) {
+       service.getAllDevices(header, paths, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getDevices(
 -      RaftNode header, ByteBuffer planBinary, AsyncMethodCallback<ByteBuffer> resultHandler)
 -      throws TException {
++      RaftNode header, ByteBuffer planBinary, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "get devices");
+     if (service != null) {
+       service.getDevices(header, planBinary, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getNodeList(
+       RaftNode header,
+       String path,
+       int nodeLevel,
+       AsyncMethodCallback<List<String>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Get node list");
+     if (service != null) {
+       service.getNodeList(header, path, nodeLevel, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getChildNodeInNextLevel(
+       RaftNode header, String path, AsyncMethodCallback<Set<String>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Get child node in next level");
+     if (service != null) {
+       service.getChildNodeInNextLevel(header, path, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getChildNodePathInNextLevel(
+       RaftNode header, String path, AsyncMethodCallback<Set<String>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Get child node path in next level");
+     if (service != null) {
+       service.getChildNodePathInNextLevel(header, path, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getAllMeasurementSchema(
+       RaftNode header, ByteBuffer planBytes, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Get all measurement schema");
+     if (service != null) {
+       service.getAllMeasurementSchema(header, planBytes, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getAggrResult(
+       GetAggrResultRequest request, AsyncMethodCallback<List<ByteBuffer>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.getAggrResult(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getUnregisteredTimeseries(
+       RaftNode header,
+       List<String> timeseriesList,
+       AsyncMethodCallback<List<String>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Check if measurements are registered");
+     if (service != null) {
+       service.getUnregisteredTimeseries(header, timeseriesList, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getGroupByExecutor(GroupByRequest request, AsyncMethodCallback<Long> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.getGroupByExecutor(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getGroupByResult(
+       RaftNode header,
+       long executorId,
+       long startTime,
+       long endTime,
+       AsyncMethodCallback<List<ByteBuffer>> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Fetch group by");
+     if (service != null) {
+       service.getGroupByResult(header, executorId, startTime, endTime, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void previousFill(
+       PreviousFillRequest request, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, request);
+     if (service != null) {
+       service.previousFill(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void matchTerm(
+       long index, long term, RaftNode header, AsyncMethodCallback<Boolean> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Match term");
+     if (service != null) {
+       service.matchTerm(index, term, header, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void last(LastQueryRequest request, AsyncMethodCallback<ByteBuffer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(request.getHeader(), resultHandler, "last");
+     if (service != null) {
+       service.last(request, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getPathCount(
+       RaftNode header,
+       List<String> pathsToQuery,
+       int level,
+       AsyncMethodCallback<Integer> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "count path");
+     if (service != null) {
+       service.getPathCount(header, pathsToQuery, level, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void getDeviceCount(
+       RaftNode header, List<String> pathsToQuery, AsyncMethodCallback<Integer> resultHandler)
+       throws TException {
+     DataAsyncService service =
+         DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "count device");
+     if (service != null) {
+       service.getDeviceCount(header, pathsToQuery, resultHandler);
+     }
+   }
+ 
+   @Override
+   public void onSnapshotApplied(
+       RaftNode header, List<Integer> slots, AsyncMethodCallback<Boolean> resultHandler) {
+     DataAsyncService service =
+         DataGroupEngine.getInstance()
+             .getDataAsyncService(header, resultHandler, "Snapshot applied");
+     if (service != null) {
+       service.onSnapshotApplied(header, slots, resultHandler);
+     }
+   }
+ 
+   @Override
+   public long querySingleSeries(SingleSeriesQueryRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .querySingleSeries(request);
+   }
+ 
+   @Override
+   public long queryMultSeries(MultSeriesQueryRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .queryMultSeries(request);
+   }
+ 
+   @Override
+   public ByteBuffer fetchSingleSeries(RaftNode header, long readerId) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .fetchSingleSeries(header, readerId);
+   }
+ 
+   @Override
+   public Map<String, ByteBuffer> fetchMultSeries(RaftNode header, long readerId, List<String> paths)
+       throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .fetchMultSeries(header, readerId, paths);
+   }
+ 
+   @Override
+   public long querySingleSeriesByTimestamp(SingleSeriesQueryRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .querySingleSeriesByTimestamp(request);
+   }
+ 
+   @Override
+   public ByteBuffer fetchSingleSeriesByTimestamps(
+       RaftNode header, long readerId, List<Long> timestamps) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .fetchSingleSeriesByTimestamps(header, readerId, timestamps);
+   }
+ 
+   @Override
+   public void endQuery(RaftNode header, Node thisNode, long queryId) throws TException {
+     DataGroupEngine.getInstance().getDataSyncService(header).endQuery(header, thisNode, queryId);
+   }
+ 
+   @Override
+   public GetAllPathsResult getAllPaths(RaftNode header, List<String> path, boolean withAlias)
+       throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getAllPaths(header, path, withAlias);
+   }
+ 
+   @Override
+   public Set<String> getAllDevices(RaftNode header, List<String> path) throws TException {
+     return DataGroupEngine.getInstance().getDataSyncService(header).getAllDevices(header, path);
+   }
+ 
+   @Override
+   public List<String> getNodeList(RaftNode header, String path, int nodeLevel) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getNodeList(header, path, nodeLevel);
+   }
+ 
+   @Override
+   public Set<String> getChildNodeInNextLevel(RaftNode header, String path) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getChildNodeInNextLevel(header, path);
+   }
+ 
+   @Override
+   public Set<String> getChildNodePathInNextLevel(RaftNode header, String path) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getChildNodePathInNextLevel(header, path);
+   }
+ 
+   @Override
+   public ByteBuffer getAllMeasurementSchema(RaftNode header, ByteBuffer planBinary)
+       throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getAllMeasurementSchema(header, planBinary);
+   }
+ 
+   @Override
+   public ByteBuffer getDevices(RaftNode header, ByteBuffer planBinary) throws TException {
+     return DataGroupEngine.getInstance().getDataSyncService(header).getDevices(header, planBinary);
+   }
+ 
+   @Override
+   public List<ByteBuffer> getAggrResult(GetAggrResultRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .getAggrResult(request);
+   }
+ 
+   @Override
+   public List<String> getUnregisteredTimeseries(RaftNode header, List<String> timeseriesList)
+       throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getUnregisteredTimeseries(header, timeseriesList);
+   }
+ 
+   @Override
+   public PullSnapshotResp pullSnapshot(PullSnapshotRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .pullSnapshot(request);
+   }
+ 
+   @Override
+   public long getGroupByExecutor(GroupByRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .getGroupByExecutor(request);
+   }
+ 
+   @Override
+   public List<ByteBuffer> getGroupByResult(
+       RaftNode header, long executorId, long startTime, long endTime) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getGroupByResult(header, executorId, startTime, endTime);
+   }
+ 
+   @Override
+   public PullSchemaResp pullTimeSeriesSchema(PullSchemaRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .pullTimeSeriesSchema(request);
+   }
+ 
+   @Override
+   public PullSchemaResp pullMeasurementSchema(PullSchemaRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .pullMeasurementSchema(request);
+   }
+ 
+   @Override
+   public ByteBuffer previousFill(PreviousFillRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .previousFill(request);
+   }
+ 
+   @Override
+   public ByteBuffer last(LastQueryRequest request) throws TException {
+     return DataGroupEngine.getInstance().getDataSyncService(request.getHeader()).last(request);
+   }
+ 
+   @Override
+   public int getPathCount(RaftNode header, List<String> pathsToQuery, int level) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getPathCount(header, pathsToQuery, level);
+   }
+ 
+   @Override
+   public boolean onSnapshotApplied(RaftNode header, List<Integer> slots) {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .onSnapshotApplied(header, slots);
+   }
+ 
+   @Override
+   public int getDeviceCount(RaftNode header, List<String> pathsToQuery) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .getDeviceCount(header, pathsToQuery);
+   }
+ 
+   @Override
+   public HeartBeatResponse sendHeartbeat(HeartBeatRequest request) {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .sendHeartbeat(request);
+   }
+ 
+   @Override
+   public long startElection(ElectionRequest request) {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .startElection(request);
+   }
+ 
+   @Override
 -  public long appendEntries(AppendEntriesRequest request) throws TException {
++  public AppendEntryResult appendEntries(AppendEntriesRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .appendEntries(request);
+   }
+ 
+   @Override
 -  public long appendEntry(AppendEntryRequest request) throws TException {
++  public AppendEntryResult appendEntry(AppendEntryRequest request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .appendEntry(request);
+   }
+ 
+   @Override
+   public void sendSnapshot(SendSnapshotRequest request) throws TException {
+     DataGroupEngine.getInstance().getDataSyncService(request.getHeader()).sendSnapshot(request);
+   }
+ 
+   @Override
+   public TSStatus executeNonQueryPlan(ExecutNonQueryReq request) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(request.getHeader())
+         .executeNonQueryPlan(request);
+   }
+ 
+   @Override
+   public RequestCommitIndexResponse requestCommitIndex(RaftNode header) throws TException {
+     return DataGroupEngine.getInstance().getDataSyncService(header).requestCommitIndex(header);
+   }
+ 
+   @Override
+   public ByteBuffer readFile(String filePath, long offset, int length) throws TException {
+     try {
+       return IOUtils.readFile(filePath, offset, length);
+     } catch (IOException e) {
+       throw new TException(e);
+     }
+   }
+ 
+   @Override
+   public boolean matchTerm(long index, long term, RaftNode header) {
+     return DataGroupEngine.getInstance().getDataSyncService(header).matchTerm(index, term, header);
+   }
+ 
+   @Override
+   public ByteBuffer peekNextNotNullValue(
+       RaftNode header, long executorId, long startTime, long endTime) throws TException {
+     return DataGroupEngine.getInstance()
+         .getDataSyncService(header)
+         .peekNextNotNullValue(header, executorId, startTime, endTime);
+   }
+ 
+   @Override
+   public void peekNextNotNullValue(
+       RaftNode header,
+       long executorId,
+       long startTime,
+       long endTime,
+       AsyncMethodCallback<ByteBuffer> resultHandler)
+       throws TException {
+     resultHandler.onComplete(
+         DataGroupEngine.getInstance()
+             .getDataSyncService(header)
+             .peekNextNotNullValue(header, executorId, startTime, endTime));
+   }
+ 
+   @Override
+   public void removeHardLink(String hardLinkPath) throws TException {
+     try {
+       Files.deleteIfExists(new File(hardLinkPath).toPath());
+     } catch (IOException e) {
+       throw new TException(e);
+     }
+   }
+ 
+   @Override
+   public void removeHardLink(String hardLinkPath, AsyncMethodCallback<Void> resultHandler) {
+     try {
+       Files.deleteIfExists(new File(hardLinkPath).toPath());
+       resultHandler.onComplete(null);
+     } catch (IOException e) {
+       resultHandler.onError(e);
+     }
+   }
++
++  @Override
++  public AppendEntryResult appendEntryIndirect(AppendEntryRequest request, List<Node> subReceivers)
++      throws TException {
++    return DataGroupEngine.getInstance()
++        .getDataSyncService(request.getHeader())
++        .appendEntryIndirect(request, subReceivers);
++  }
++
++  @Override
++  public void acknowledgeAppendEntry(AppendEntryResult ack) {
++    DataGroupEngine.getInstance().getDataSyncService(ack.getHeader()).acknowledgeAppendEntry(ack);
++  }
++
++  @Override
++  public void appendEntryIndirect(
++      AppendEntryRequest request,
++      List<Node> subReceivers,
++      AsyncMethodCallback<AppendEntryResult> resultHandler) {
++    DataGroupEngine.getInstance()
++        .getDataAsyncService(request.getHeader(), resultHandler, request)
++        .appendEntryIndirect(request, subReceivers, resultHandler);
++  }
++
++  @Override
++  public void acknowledgeAppendEntry(
++      AppendEntryResult ack, AsyncMethodCallback<Void> resultHandler) {
++    DataGroupEngine.getInstance()
++        .getDataAsyncService(ack.getHeader(), resultHandler, ack)
++        .acknowledgeAppendEntry(ack, resultHandler);
++  }
+ }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
index 4f547a3,659f953..878528b
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
@@@ -25,9 -25,9 +25,11 @@@ import org.apache.iotdb.cluster.excepti
  import org.apache.iotdb.cluster.exception.LeaderUnknownException;
  import org.apache.iotdb.cluster.exception.LogExecutionException;
  import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
++import org.apache.iotdb.cluster.exception.UnknownLogTypeException;
  import org.apache.iotdb.cluster.log.logtypes.RemoveNodeLog;
  import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
  import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
  import org.apache.iotdb.cluster.rpc.thrift.CheckStatusResponse;
  import org.apache.iotdb.cluster.rpc.thrift.Node;
  import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
@@@ -45,9 -45,9 +47,10 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import java.nio.ByteBuffer;
++import java.util.List;
  
  public class MetaAsyncService extends BaseAsyncService implements TSMetaService.AsyncIface {
- 
+   private static final String ERROR_MSG_META_NOT_READY = "The metadata not is not ready.";
    private static final Logger logger = LoggerFactory.getLogger(MetaAsyncService.class);
  
    private MetaGroupMember metaGroupMember;
@@@ -236,4 -252,4 +255,23 @@@
      metaGroupMember.handleHandshake(sender);
      resultHandler.onComplete(null);
    }
++
++  @Override
++  public void appendEntryIndirect(
++      AppendEntryRequest request,
++      List<Node> subReceivers,
++      AsyncMethodCallback<AppendEntryResult> resultHandler) {
++    try {
++      resultHandler.onComplete(metaGroupMember.appendEntryIndirect(request, subReceivers));
++    } catch (UnknownLogTypeException e) {
++      resultHandler.onError(e);
++    }
++  }
++
++  @Override
++  public void acknowledgeAppendEntry(
++      AppendEntryResult ack, AsyncMethodCallback<Void> resultHandler) {
++    metaGroupMember.acknowledgeAppendLog(ack);
++    resultHandler.onComplete(null);
++  }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
index 204c45a,f52b7c8..93a0ba6
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
@@@ -26,6 -26,6 +26,7 @@@ import org.apache.iotdb.cluster.excepti
  import org.apache.iotdb.cluster.exception.LeaderUnknownException;
  import org.apache.iotdb.cluster.exception.LogExecutionException;
  import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
++import org.apache.iotdb.cluster.exception.UnknownLogTypeException;
  import org.apache.iotdb.cluster.log.logtypes.RemoveNodeLog;
  import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
  import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
@@@ -47,6 -46,6 +48,7 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import java.nio.ByteBuffer;
++import java.util.List;
  
  public class MetaSyncService extends BaseSyncService implements TSMetaService.Iface {
  
@@@ -59,12 -58,23 +61,23 @@@
      this.metaGroupMember = metaGroupMember;
    }
  
+   // behavior of followers
    @Override
 -  public long appendEntry(AppendEntryRequest request) throws TException {
 +  public AppendEntryResult appendEntry(AppendEntryRequest request) throws TException {
-     if (metaGroupMember.getPartitionTable() == null) {
-       // this node lacks information of the cluster and refuse to work
-       logger.debug("This node is blind to the cluster and cannot accept logs");
-       return new AppendEntryResult(Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE);
+     // if the metaGroupMember is not ready (e.g., as a follower the PartitionTable is loaded
+     // locally, but the partition table is not verified), we do not handle the RPC requests.
+     if (!metaGroupMember.isReady()) {
+       // the only special case is that the leader will send an empty entry for letting followers
+       // submit  previous log
+       // at this time, the partitionTable has been loaded but is not verified. So the PRC is not
+       // ready.
+       if (metaGroupMember.getPartitionTable() == null) {
+         // this node lacks information of the cluster and refuse to work
+         logger.debug("This node is blind to the cluster and cannot accept logs, {}", request);
 -        return Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE;
++        return new AppendEntryResult(Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE);
+       } else {
+         // do nothing because we consider if the partitionTable is loaded, then it is corrected.
+       }
      }
  
      return super.appendEntry(request);
@@@ -226,4 -250,4 +253,19 @@@
    public void handshake(Node sender) {
      metaGroupMember.handleHandshake(sender);
    }
++
++  @Override
++  public AppendEntryResult appendEntryIndirect(AppendEntryRequest request, List<Node> subReceivers)
++      throws TException {
++    try {
++      return metaGroupMember.appendEntryIndirect(request, subReceivers);
++    } catch (UnknownLogTypeException e) {
++      throw new TException(e);
++    }
++  }
++
++  @Override
++  public void acknowledgeAppendEntry(AppendEntryResult ack) {
++    metaGroupMember.acknowledgeAppendLog(ack);
++  }
  }
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
index b6762aa,1303df1..9d65020
--- a/cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
@@@ -19,9 -19,9 +19,10 @@@
  
  package org.apache.iotdb.cluster.common;
  
+ import org.apache.iotdb.cluster.client.ClientCategory;
  import org.apache.iotdb.cluster.client.async.AsyncDataClient;
  import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
 +import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
  import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
  import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
  import org.apache.iotdb.cluster.rpc.thrift.GetAggrResultRequest;
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
index b5a984b,e468560..14eac19
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
@@@ -25,9 -25,9 +25,10 @@@ import org.apache.iotdb.cluster.common.
  import org.apache.iotdb.cluster.common.TestUtils;
  import org.apache.iotdb.cluster.config.ClusterDescriptor;
  import org.apache.iotdb.cluster.log.Log;
 +import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
  import org.apache.iotdb.cluster.server.Response;
  import org.apache.iotdb.cluster.server.member.RaftMember;
+ import org.apache.iotdb.db.exception.StorageEngineException;
  import org.apache.iotdb.db.utils.EnvironmentUtils;
  
  import org.junit.After;
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
index 406113b,d6ad1b7..9b5b6b8
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
@@@ -40,9 -43,9 +43,10 @@@ import org.apache.iotdb.cluster.partiti
  import org.apache.iotdb.cluster.partition.PartitionTable;
  import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
  import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
 +import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
  import org.apache.iotdb.cluster.rpc.thrift.Node;
  import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
+ import org.apache.iotdb.cluster.rpc.thrift.RaftService;
  import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
  import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
  import org.apache.iotdb.cluster.server.NodeCharacter;
diff --cc server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
index 8e03bae,86c7227..276ca36
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
@@@ -173,9 -173,10 +173,11 @@@ public abstract class Operator 
      SHOW_CONTINUOUS_QUERIES,
      SET_SYSTEM_MODE,
  
 +    EMPTY,
      SETTLE,
  
-     UNSET_SCHEMA_TEMPLATE
+     UNSET_TEMPLATE,
+     PRUNE_TEMPLATE,
+     APPEND_TEMPLATE
    }
  }
diff --cc server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
index 464d9cf,f77021a..33f1ca7
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
@@@ -488,9 -538,10 +542,11 @@@ public abstract class PhysicalPlan 
      CREATE_FUNCTION,
      DROP_FUNCTION,
      SELECT_INTO,
 +    DUMMY,
      SET_SYSTEM_MODE,
-     UNSET_SCHEMA_TEMPLATE
+     UNSET_TEMPLATE,
+     APPEND_TEMPLATE,
+     PRUNE_TEMPLATE
    }
  
    public long getIndex() {
diff --cc server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
index 58010c9,0000000..67f7637
mode 100644,000000..100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
@@@ -1,94 -1,0 +1,95 @@@
 +/*
 + * 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.qp.physical.sys;
 +
 +import org.apache.iotdb.db.exception.metadata.IllegalPathException;
- import org.apache.iotdb.db.metadata.PartialPath;
++import org.apache.iotdb.db.metadata.path.PartialPath;
 +import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
 +import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 +
 +import java.io.DataOutputStream;
 +import java.io.IOException;
 +import java.nio.ByteBuffer;
++import java.util.Collections;
 +import java.util.List;
 +
 +public class DummyPlan extends PhysicalPlan {
 +
 +  private byte[] workload;
 +  private boolean needForward;
 +
 +  public DummyPlan() {
 +    super(false, OperatorType.EMPTY);
 +  }
 +
 +  @Override
 +  public List<PartialPath> getPaths() {
-     return null;
++    return Collections.emptyList();
 +  }
 +
 +  @Override
 +  public void serialize(DataOutputStream stream) throws IOException {
 +    stream.write((byte) PhysicalPlanType.DUMMY.ordinal());
 +    stream.writeInt(workload == null ? 0 : workload.length);
 +    if (workload != null) {
 +      stream.write(workload);
 +    }
 +    stream.write(needForward ? 1 : 0);
 +  }
 +
 +  @Override
 +  public void serialize(ByteBuffer buffer) {
 +    buffer.put((byte) PhysicalPlanType.DUMMY.ordinal());
 +    buffer.putInt(workload == null ? 0 : workload.length);
 +    if (workload != null) {
 +      buffer.put(workload);
 +    }
 +    buffer.put(needForward ? (byte) 1 : 0);
 +  }
 +
 +  @Override
 +  public void deserialize(ByteBuffer buffer) throws IllegalPathException {
 +    int size = buffer.getInt();
 +    workload = new byte[size];
 +    buffer.get(workload);
 +    needForward = buffer.get() == 1;
 +  }
 +
 +  public void setWorkload(byte[] workload) {
 +    this.workload = workload;
 +  }
 +
 +  public boolean isNeedForward() {
 +    return needForward;
 +  }
 +
 +  public void setNeedForward(boolean needForward) {
 +    this.needForward = needForward;
 +  }
 +
 +  public byte[] getWorkload() {
 +    return workload;
 +  }
 +
 +  @Override
 +  public String toString() {
 +    return "ExprPlan";
 +  }
 +}
diff --cc thrift-cluster/src/main/thrift/cluster.thrift
index 74f670c,1bbd9e3..64914ba
--- a/thrift-cluster/src/main/thrift/cluster.thrift
+++ b/thrift-cluster/src/main/thrift/cluster.thrift
@@@ -88,18 -88,8 +88,12 @@@ struct AppendEntryRequest 
    // because a data server may play many data groups members, this is used to identify which
    // member should process the request or response. Only used in data group communication.
    7: optional RaftNode header
 +  // true if the request is sent from the leader, and the reiceiver just responds to the sender;
 +  // otherwise, the reiceiver should also notify the leader
 +  8: optional bool isFromLeader
  }
  
 +
- struct AppendEntryAcknowledgement {
-   1: required long term
-   2: required long index
-   3: required long response
- }
- 
  // leader -> follower
  struct AppendEntriesRequest {
    1: required long term // leader's
@@@ -273,17 -263,11 +267,18 @@@ struct LastQueryRequest 
  }
  
  struct GetAllPathsResult {
-   1: required list<list<string>> paths
-   2: optional list<string> aliasList
+   1: required list<string> paths
+   2: required list<byte> dataTypes
+   3: optional list<string> aliasList
  }
  
 +struct AppendEntryResult {
 +  1: required i64 status;
 +  2: optional i64 lastLogTerm;
 +  3: optional i64 lastLogIndex;
 +  4: optional RaftNode header;
 +}
 +
  
  service RaftService {
    /**