You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hx...@apache.org on 2021/08/10 16:46:46 UTC

[iotdb] branch cluster- updated (4f92cc5 -> 0625334)

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

hxd pushed a change to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


    from 4f92cc5  a temporary submit..
     add 25f7f55  [IOTDB-1506] CI fails because of JDBC connection exceptions (#3577)
     add 56ea509  Optimize the implementation of singleton (#3585)
     add df46873  add checkDeviceIdExist method to ITimeIndex (#3562)
     add 2797007  [IOTDB-1459] Unify integration test class names (#3588)
     add 2bff46a  [IOTDB-1492] Fix mLogParser.sh cannot parse the device template (#3573)
     add ed6d848  Add Google Analytics (#3592)
     add 31bf7e9  Wordings improvement of website nav bar (#3591)
     add af567ee  [IOTDB-1456] Fix Error occurred while executing delete timeseries statement (#3474)
     add 534bb93  Update Google Analytics tag id (#3594)
     add 7a09ecb  Add privacy disclosure (#3597)
     add 9ecb7a0  [IOTDB-1491] UDTF query supported in cluster mode (#3565)
     add 18e5ff7  add SessionConcurrentExample & fix template restart PathNotExistException (#3595)
     add 79e50d6  fix recover TsFileResource time interval bug (#3604)
     add c8edbcf  improve mlog compatibility from 0.12.2 to 0.13.0 (#3553)
     add 6e9f340  [IOTDB-1059] Support sql statement insert without timestamp (#3067)
     add 5a348a4  [IOTDB-1478]The whole IoTDB can not read/write if any one sg is not ready (#3554)
     add 3c6925c  [IOTDB-959]Add createStorageGroup Grammar (#3608)
     add 0791e07  mod note (#3615)
     add 72799f3  [IOTDB-1503] 1 node crash causes whole cluster cannot work (#3579)
     add 469f78b  Remove path registration in IoTDBSink (#3620)
     add 511d5f4  Update ContributeGuide.md (#3611)
     add 2ba8c78  [IOTDB-1509] show timeseries throw a bug (#3556)
     add e0ce236  remove unnecessary testcontainer IT (#3625)
     add c05a7c5  [IOTDB-1528] CQ IT unstable: sometimes fails on checkCQExecutionResult() (#3624)
     add 4fcd755  [IOTDB-1500] Remove current dynamic query memory control (#3563)
     add 9437339  Fix compile error in assignQueryId (#3629)
     add 47fa594  [IoTDB-1499] Remove series registeration using IoTDBSink -> master (#3574)
     add d984fe8  [IOTDB-1496] Timed flush memtable (#3610)
     add de1a622  [IOTDB-1524] Support SELECT ... INTO ... clause (#3614)
     add 716710c  [IOTDB-1519]add metadata checking option and change grammar for loading tsfile (#3576)
     add 95e3b69  [IOTDB-1529]Fix mlog recover idx bug and synchronize setStorageGroup (#3635)
     add d1729ea  [IOTDB-1530] Make documents style better by adding a space between full-corner and half-corner characters (#3632)
     add 1d0b6ff  [IOTDB-1477] Optimize code logic of generateAlignByDevicePlan() (#3607)
     add 0b2d0af  make sure memtable flush task has submitted before check (#3641)
     add c023443  add an example to customize MQTT Message (#3572)
     add ce385ab  [IOTDB-1532] CI fails on testSelectInto() in E2E test (#3639)
     add 868821c  Add a testcase of dataApplier about batch insert. (#3645)
     add ca3a4c2  [IOTDB-1517][IOTDB-1521] Refactor TsFile Index for Vector (multi-variable timeseries) (#3627)
     add 05a8f7c  [IOTDB-1498] MNode Abstraction and Structure Improvement (#3589)
     add 3a38a89  Function Improvement: add overlapped page rate in Tracing (#3602)
     add 9c4cd4b  introduction modify for README_ZH.md (#3646)
     add 902dbfb  [IOTDB-1511] Extract IStorageGroupMNode and IMeasurementMNode Interface (#3647)
     add 1a31750  Fix master order by time desc bug (#3655)
     add 2ed58eb  [IOTDB-1511] Implement EntityMNode (#3650)
     add 319674d  [IOTDB-1511] Rename DeviceTemplate to SchemaTemplate (#3656)
     add b484f2e  [IOTDB-1511] Rename Template Enum (#3657)
     new 5bdf918  temporary commit for refactor thrift rpc
     add ecf7bf2  add committer wangchao316 (#3661)
     add 9b89113  [IOTDB-1526] New Template Constraint (#3659)
     add 635a43e  skip non exist measurement in where clause (#3590) (#3665)
     add e3171bd  [Docs] Update expired link (#3663)
     add 443845c  [IOTDB-1542] Cpp client segment fault: char[] buffer overflow caused by long exception message (#3671)
     add 0427d28  Add Jenkins CI timeout threshold (#3677)
     add 204b7d3  [ISSUE-3674] Disable thrift code gen for Javascript (#3675)
     new 19c9456  Merge remote-tracking branch 'origin/master' into cluster-
     new bba25de  temporary commit
     add b5bc63a  add .asf.yaml file for updating website automatically (#3678)
     add 37f5c7a  [IOTDB-1545] Query dataset momory leak on server caused by cpp client (#3682)
     add 785e316  close compaction by default (#3686)
     add b1f30d0  [IOTDB-1486] Add a createTemplate Session example (#3697)
     add 3234abf  Cherry-pick 4 bug-fixing commits about upgrade tool from rel/0.12 to master branch (#3698)
     add a2c446a  [ISSUE-3690] Memory leaks on the server when cpp client invokes checkTimeseriesExists (#3692)
     add 40fa7b3  [ISSUE-3693] Memory leaks when executing select-into clauses (#3694)
     new ae1e677  Merge remote-tracking branch 'origin/master' into cluster-
     new 4246406  almost pass
     add 4dcae2b  [IOTDB-1372] delete devices field in FileTimeIndex (#3606)
     add 860c8de  JDBC - Adjust method not supported to specific prompt (#2444)
     add 8168911  fix defaut max_sync_log_lag (#3704)
     add 4884dc8  [IOTDB-1546] Optimize the Upgrade/Rewrite Tool rewrite logic to reduce the temp memory cost (#3701)
     new aae37ad  Merge remote-tracking branch 'origin/master' into cluster-
     new 0625334  pass manually test

The 7 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 CONTRIBUTING.md                                    |    2 +-
 Jenkinsfile                                        |    2 +-
 README.md                                          |    2 +-
 README_ZH.md                                       |    6 +-
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4   |   73 +-
 client-cpp/src/main/Session.cpp                    |  761 +++---
 client-cpp/src/main/Session.h                      |  565 ++--
 client-cpp/src/test/main.cpp                       |    6 +-
 cluster/pom.xml                                    |    6 +
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |  367 ++-
 ...adOnlyException.java => ClusterIoTDBMBean.java} |   18 +-
 .../cluster/client/async/AsyncClientPool.java      |    4 +
 .../cluster/client/async/AsyncDataClient.java      |    4 +-
 .../client/async/AsyncDataHeartbeatClient.java     |    4 +-
 .../cluster/client/async/AsyncMetaClient.java      |    4 +-
 .../client/async/AsyncMetaHeartbeatClient.java     |    4 +-
 .../cluster/client/sync/SyncClientAdaptor.java     |   56 +-
 .../cluster/client/sync/SyncClientFactory.java     |    5 +-
 .../iotdb/cluster/client/sync/SyncClientPool.java  |   29 +-
 .../iotdb/cluster/client/sync/SyncDataClient.java  |   13 +-
 .../client/sync/SyncDataHeartbeatClient.java       |   14 +-
 .../iotdb/cluster/client/sync/SyncMetaClient.java  |   15 +-
 .../client/sync/SyncMetaHeartbeatClient.java       |   12 +-
 .../iotdb/cluster/config/ClusterConstant.java      |   63 +
 .../iotdb/cluster/config/ClusterDescriptor.java    |    2 +-
 .../iotdb/cluster/coordinator/Coordinator.java     |   22 +-
 .../iotdb/cluster/log/applier/BaseApplier.java     |   17 +-
 .../iotdb/cluster/log/applier/DataLogApplier.java  |    9 +-
 .../iotdb/cluster/log/catchup/LogCatchUpTask.java  |    5 +-
 .../log/manage/PartitionedSnapshotLogManager.java  |    8 +-
 .../cluster/log/snapshot/MetaSimpleSnapshot.java   |    2 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   |  277 +-
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |   46 +-
 .../iotdb/cluster/partition/PartitionGroup.java    |    5 +
 .../cluster/partition/slot/SlotPartitionTable.java |    1 -
 .../cluster/query/ClusterPhysicalGenerator.java    |   18 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |   83 +-
 .../apache/iotdb/cluster/query/ClusterPlanner.java |   17 +-
 .../iotdb/cluster/query/ClusterQueryRouter.java    |   40 +
 .../cluster/query/ClusterUDTFQueryExecutor.java    |   12 +-
 .../iotdb/cluster/query/LocalQueryExecutor.java    |   32 +-
 .../cluster/query/aggregate/ClusterAggregator.java |   20 +-
 .../cluster/query/fill/ClusterPreviousFill.java    |   24 +-
 .../query/groupby/RemoteGroupByExecutor.java       |   44 +-
 .../query/last/ClusterLastQueryExecutor.java       |   37 +-
 .../cluster/query/manage/ClusterQueryManager.java  |    8 +-
 .../cluster/query/reader/ClusterReaderFactory.java |   20 +-
 .../cluster/query/reader/ClusterTimeGenerator.java |   14 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |   45 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |   11 +-
 .../query/reader/RemoteSimpleSeriesReader.java     |   11 +-
 .../query/reader/mult/MultDataSourceInfo.java      |   27 +-
 .../query/reader/mult/RemoteMultSeriesReader.java  |   18 +-
 .../iotdb/cluster/server/ClusterRPCService.java    |   17 +-
 .../iotdb/cluster/server/ClusterTSServiceImpl.java |  111 +-
 .../iotdb/cluster/server/MetaClusterServer.java    |  369 ---
 .../apache/iotdb/cluster/server/RaftServer.java    |  263 --
 .../org/apache/iotdb/cluster/server/Response.java  |    3 +
 .../iotdb/cluster/server/StoppedMemberManager.java |    9 +-
 .../server/clusterinfo/ClusterInfoServer.java      |    1 +
 .../handlers/caller/AppendNodeEntryHandler.java    |    9 +-
 .../server/handlers/caller/HeartbeatHandler.java   |    7 +-
 .../server/heartbeat/DataHeartbeatServer.java      |   83 -
 .../cluster/server/heartbeat/HeartbeatServer.java  |  212 --
 .../cluster/server/heartbeat/HeartbeatThread.java  |   33 +-
 .../server/heartbeat/MetaHeartbeatServer.java      |   91 -
 .../server/heartbeat/MetaHeartbeatThread.java      |    7 +-
 .../cluster/server/member/DataGroupMember.java     |   46 +-
 .../server/member/DataGroupMemberMBean.java}       |    6 +-
 .../cluster/server/member/MetaGroupMember.java     |  440 ++--
 ...package-info.java => MetaGroupMemberMBean.java} |   20 +-
 .../iotdb/cluster/server/member/RaftMember.java    |   70 +-
 .../member/RaftMemberMBean.java}                   |   38 +-
 .../DataGroupServiceImpls.java}                    |  133 +-
 ...e-info.java => DataGroupServiceImplsMBean.java} |   16 +-
 .../cluster/server/service/MetaSyncService.java    |   35 +-
 .../apache/iotdb/cluster/utils/PartitionUtils.java |    4 +-
 .../cluster/utils/nodetool/ClusterMonitor.java     |   26 +-
 .../cluster/client/async/AsyncDataClientTest.java  |   11 +-
 .../cluster/client/async/AsyncMetaClientTest.java  |   11 +-
 .../org/apache/iotdb/cluster/common/IoTDBTest.java |    7 +-
 .../org/apache/iotdb/cluster/common/TestUtils.java |    7 +-
 .../cluster/integration/BaseSingleNodeTest.java    |    8 +-
 .../cluster/log/applier/DataLogApplierTest.java    |  175 +-
 .../cluster/log/logtypes/SerializeLogTest.java     |    4 +-
 .../cluster/log/snapshot/FileSnapshotTest.java     |    2 +-
 .../log/snapshot/MetaSimpleSnapshotTest.java       |    2 +-
 .../iotdb/cluster/partition/MManagerWhiteBox.java  |    2 +-
 .../query/ClusterAggregateExecutorTest.java        |    4 +-
 .../query/ClusterDataQueryExecutorTest.java        |   10 +-
 .../cluster/query/ClusterFillExecutorTest.java     |    4 +-
 .../query/ClusterPhysicalGeneratorTest.java        |    3 +-
 .../cluster/query/ClusterPlanExecutorTest.java     |    8 +-
 .../cluster/query/ClusterQueryRouterTest.java      |   44 +-
 .../query/ClusterUDTFQueryExecutorTest.java        |  116 +
 .../iotdb/cluster/query/LoadConfigurationTest.java |    2 +-
 .../ClusterGroupByNoVFilterDataSetTest.java        |    2 +-
 .../groupby/ClusterGroupByVFilterDataSetTest.java  |    2 +-
 .../query/groupby/MergeGroupByExecutorTest.java    |    4 +-
 .../query/groupby/RemoteGroupByExecutorTest.java   |    4 +-
 .../query/manage/ClusterQueryManagerTest.java      |   12 +-
 .../query/reader/ClusterReaderFactoryTest.java     |    2 +-
 .../query/reader/ClusterTimeGeneratorTest.java     |    4 +-
 .../cluster/query/reader/DatasourceInfoTest.java   |   26 +-
 .../reader/RemoteSeriesReaderByTimestampTest.java  |  113 +-
 .../query/reader/RemoteSimpleSeriesReaderTest.java |   91 +-
 .../mult/AssignPathManagedMergeReaderTest.java     |  100 +-
 .../reader/mult/RemoteMultSeriesReaderTest.java    |  169 +-
 .../clusterinfo/ClusterInfoServiceImplTest.java    |   18 +-
 .../server/heartbeat/HeartbeatThreadTest.java      |    7 +-
 .../iotdb/cluster/server/member/BaseMember.java    |   31 +-
 .../cluster/server/member/DataGroupMemberTest.java |   48 +-
 .../cluster/server/member/MetaGroupMemberTest.java |  115 +-
 .../resources/node1conf/iotdb-engine.properties    |   12 +-
 .../resources/node2conf/iotdb-engine.properties    |   12 +-
 .../resources/node3conf/iotdb-engine.properties    |   12 +-
 compile-tools/thrift/pom.xml                       |    3 +-
 docs/Development/ContributeGuide.md                |   37 +-
 docs/SystemDesign/SchemaManager/SchemaManager.md   |   39 +-
 docs/SystemDesign/TsFile/Format.md                 |  477 ++--
 docs/UserGuide/Advanced-Features/Select-Into.md    |  235 ++
 .../Programming-MQTT.md                            |   79 +-
 .../Data-Concept/Data-Model-and-Terminology.md     |  195 +-
 docs/UserGuide/Data-Concept/Data-Type.md           |  125 +
 .../UserGuide/Ecosystem Integration/Flink IoTDB.md |    3 +-
 .../DDL-Data-Definition-Language.md                |    6 +-
 .../UserGuide/System-Tools/Load-External-Tsfile.md |   32 +-
 docs/zh/Community/Community-Powered By.md          |   41 +-
 docs/zh/Community/Feedback.md                      |   18 +-
 docs/zh/Development/Committer.md                   |   38 +-
 docs/zh/Development/ContributeGuide.md             |   59 +-
 docs/zh/Development/HowToCommit.md                 |   40 +-
 docs/zh/Development/VoteRelease.md                 |    7 +-
 docs/zh/Download/README.md                         |   73 +-
 docs/zh/SystemDesign/Architecture/Architecture.md  |    1 -
 docs/zh/SystemDesign/Client/RPC.md                 |    3 -
 docs/zh/SystemDesign/Connector/Hive-TsFile.md      |   11 +-
 docs/zh/SystemDesign/Connector/Spark-IOTDB.md      |   39 +-
 docs/zh/SystemDesign/Connector/Spark-TsFile.md     |   25 +-
 docs/zh/SystemDesign/DataQuery/AggregationQuery.md |   31 +-
 .../SystemDesign/DataQuery/AlignByDeviceQuery.md   |   12 +-
 docs/zh/SystemDesign/DataQuery/FillFunction.md     |   30 +-
 docs/zh/SystemDesign/DataQuery/GroupByFillQuery.md |   37 +-
 docs/zh/SystemDesign/DataQuery/GroupByQuery.md     |   48 +-
 docs/zh/SystemDesign/DataQuery/LastQuery.md        |   22 +-
 docs/zh/SystemDesign/DataQuery/OrderByTimeQuery.md |   75 +-
 .../zh/SystemDesign/DataQuery/QueryFundamentals.md |   58 +-
 docs/zh/SystemDesign/DataQuery/RawDataQuery.md     |   62 +-
 docs/zh/SystemDesign/DataQuery/SeriesReader.md     |   24 +-
 docs/zh/SystemDesign/QueryEngine/Planner.md        |    1 -
 .../QueryEngine/ResultSetConstruction.md           |    2 +-
 .../zh/SystemDesign/SchemaManager/SchemaManager.md |  190 +-
 docs/zh/SystemDesign/StorageEngine/Compaction.md   |   40 +-
 .../SystemDesign/StorageEngine/DataManipulation.md |   41 +-
 .../zh/SystemDesign/StorageEngine/DataPartition.md |   24 +-
 docs/zh/SystemDesign/StorageEngine/FileLists.md    |   39 +-
 docs/zh/SystemDesign/StorageEngine/FlushManager.md |    4 +-
 docs/zh/SystemDesign/StorageEngine/MergeManager.md |   22 +-
 docs/zh/SystemDesign/StorageEngine/Recover.md      |   29 +-
 .../zh/SystemDesign/StorageEngine/StorageEngine.md |    2 +-
 docs/zh/SystemDesign/StorageEngine/WAL.md          |    4 +-
 docs/zh/SystemDesign/Tools/Sync.md                 |  105 +-
 docs/zh/SystemDesign/TsFile/Format.md              |  584 ++---
 docs/zh/SystemDesign/TsFile/Read.md                |  110 +-
 docs/zh/SystemDesign/TsFile/TsFile.md              |    1 -
 docs/zh/SystemDesign/TsFile/Write.md               |    3 +-
 .../zh/UserGuide/API/Programming-Cpp-Native-API.md |   87 +-
 docs/zh/UserGuide/API/Programming-Go-Native-API.md |   18 +-
 docs/zh/UserGuide/API/Programming-JDBC.md          |   14 +-
 .../UserGuide/API/Programming-Java-Native-API.md   |   59 +-
 .../UserGuide/API/Programming-Python-Native-API.md |   70 +-
 docs/zh/UserGuide/API/Programming-TsFile-API.md    |  137 +-
 docs/zh/UserGuide/API/Time-zone.md                 |    1 -
 .../Administration-Management/Administration.md    |   35 +-
 docs/zh/UserGuide/Advanced-Features/Alerting.md    |   15 +-
 .../Advanced-Features/Continuous-Query.md          |   17 +-
 docs/zh/UserGuide/Advanced-Features/Select-Into.md |  234 ++
 docs/zh/UserGuide/Advanced-Features/Triggers.md    |  170 +-
 .../Advanced-Features/UDF-User-Defined-Function.md |  225 +-
 docs/zh/UserGuide/Appendix/Config-Manual.md        |  139 +-
 docs/zh/UserGuide/Appendix/SQL-Reference.md        |  160 +-
 docs/zh/UserGuide/Appendix/Status-Codes.md         |   19 +-
 docs/zh/UserGuide/CLI/Command-Line-Interface.md    |  123 +-
 docs/zh/UserGuide/Cluster/Cluster-Setup-Example.md |   12 +-
 docs/zh/UserGuide/Cluster/Cluster-Setup.md         |   67 +-
 .../Collaboration-of-Edge-and-Cloud/Sync-Tool.md   |   40 +-
 .../Programming-MQTT.md                            |  111 +-
 .../Programming-Thrift.md                          |   30 +-
 docs/zh/UserGuide/Comparison/TSDB-Comparison.md    |  201 +-
 docs/zh/UserGuide/Data-Concept/Compression.md      |   12 +-
 .../Data-Concept/Data-Model-and-Terminology.md     |  230 +-
 docs/zh/UserGuide/Data-Concept/Data-Type.md        |  127 +-
 docs/zh/UserGuide/Data-Concept/Encoding.md         |   24 +-
 docs/zh/UserGuide/Data-Concept/SDT.md              |   30 +-
 docs/zh/UserGuide/Ecosystem Integration/DBeaver.md |   20 +-
 .../UserGuide/Ecosystem Integration/Flink IoTDB.md |    5 +-
 .../Ecosystem Integration/Flink TsFile.md          |   17 +-
 docs/zh/UserGuide/Ecosystem Integration/Grafana.md |   72 +-
 .../UserGuide/Ecosystem Integration/Hive TsFile.md |   55 +-
 .../Ecosystem Integration/MapReduce TsFile.md      |   39 +-
 .../UserGuide/Ecosystem Integration/Spark IoTDB.md |   17 +-
 .../Ecosystem Integration/Spark TsFile.md          |   88 +-
 .../Ecosystem Integration/Writing Data on HDFS.md  |   46 +-
 .../Ecosystem Integration/Zeppelin-IoTDB.md        |   51 +-
 .../zh/UserGuide/FAQ/Frequently-asked-questions.md |   33 +-
 .../UserGuide/IoTDB-Introduction/Architecture.md   |   14 +-
 docs/zh/UserGuide/IoTDB-Introduction/Features.md   |    8 +-
 .../zh/UserGuide/IoTDB-Introduction/Publication.md |    2 +-
 docs/zh/UserGuide/IoTDB-Introduction/Scenario.md   |   20 +-
 .../UserGuide/IoTDB-Introduction/What-is-IoTDB.md  |    4 +-
 .../DDL-Data-Definition-Language.md                |   72 +-
 .../DML-Data-Manipulation-Language.md              |  364 ++-
 .../IoTDB-SQL-Language/Maintenance-Command.md      |   10 +-
 docs/zh/UserGuide/QuickStart/Files.md              |   17 +-
 docs/zh/UserGuide/QuickStart/QuickStart.md         |   78 +-
 docs/zh/UserGuide/QuickStart/ServerFileList.md     |   64 +-
 docs/zh/UserGuide/QuickStart/WayToGetIoTDB.md      |   43 +-
 docs/zh/UserGuide/System-Tools/CSV-Tool.md         |   24 +-
 docs/zh/UserGuide/System-Tools/JMX-Tool.md         |   24 +-
 .../UserGuide/System-Tools/Load-External-Tsfile.md |   58 +-
 docs/zh/UserGuide/System-Tools/MLogParser-Tool.md  |    7 +-
 .../System-Tools/Monitor-and-Log-Tools.md          |   96 +-
 docs/zh/UserGuide/System-Tools/NodeTool.md         |  117 +-
 .../Query-History-Visualization-Tool.md            |    6 +-
 docs/zh/UserGuide/System-Tools/Watermark-Tool.md   |   34 +-
 docs/zh/UserGuide/UserGuideReadme.md               |    9 +-
 .../org/apache/iotdb/flink/FlinkIoTDBSink.java     |   26 +-
 example/{mqtt => mqtt-customize}/README.md         |   17 +-
 example/{hadoop => mqtt-customize}/pom.xml         |   10 +-
 .../server/CustomizedJsonPayloadFormatter.java     |   62 +
 .../org.apache.iotdb.db.mqtt.PayloadFormatter      |    1 +
 example/pom.xml                                    |    1 +
 .../iotdb/HybridTimeseriesSessionExample.java      |  129 +
 .../org/apache/iotdb/SessionConcurrentExample.java |  199 ++
 .../main/java/org/apache/iotdb/SessionExample.java |   47 +
 ...ablet.java => TsFileWriteVectorWithTablet.java} |   50 +-
 .../java/org/apache/iotdb/flink/IoTDBSink.java     |   26 +-
 .../iotdb/flink/options/IoTDBSinkOptions.java      |   11 -
 ...tITCase.java => RowTSRecordOutputFormatIT.java} |    2 +-
 ...rmatITCase.java => RowTsFileInputFormatIT.java} |    2 +-
 .../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java     |   68 +-
 .../main/java/org/apache/iotdb/jdbc/Constant.java  |    3 +
 .../src/main/java/org/apache/iotdb/jdbc/Field.java |   52 +-
 .../iotdb/jdbc}/GroupedLSBWatermarkEncoder.java    |   21 +-
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   16 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   | 2744 +++++++++++++++++---
 .../org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java  |   58 +-
 .../iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java     |   38 +-
 .../apache/iotdb/jdbc/IoTDBPreparedStatement.java  |  585 ++++-
 .../org/apache/iotdb/jdbc/IoTDBResultMetadata.java |  173 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |   38 +-
 .../java/org/apache/iotdb/jdbc}/ListDataSet.java   |   12 +-
 .../java/org/apache/iotdb/jdbc/StringUtils.java    |   78 +
 .../org/apache/iotdb/jdbc}/WatermarkEncoder.java   |    3 +-
 .../org/apache/iotdb/jdbc/IoTDBConnectionTest.java |    3 +-
 .../iotdb/jdbc/IoTDBDatabaseMetadataTest.java      |  162 ++
 .../iotdb/jdbc/IoTDBPreparedStatementTest.java     |   32 +-
 .../apache/iotdb/jdbc/IoTDBResultMetadataTest.java |   21 +-
 pom.xml                                            |    2 +
 .../resources/conf/iotdb-engine.properties         |   30 +-
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |    1 +
 .../db/concurrent/IoTDBThreadPoolFactory.java      |   18 +
 .../org/apache/iotdb/db/concurrent/ThreadName.java |   11 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |   50 +
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   43 +-
 .../apache/iotdb/db/cost/statistic/Operation.java  |    3 +-
 .../apache/iotdb/db/cq/ContinuousQueryTask.java    |    6 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |  183 +-
 .../db/engine/cache/TimeSeriesMetadataCache.java   |   71 +-
 .../compaction/CompactionMergeTaskPoolManager.java |   13 +-
 .../level/LevelCompactionTsFileManagement.java     |    2 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |   15 +-
 .../apache/iotdb/db/engine/memtable/IMemTable.java |    2 +
 .../iotdb/db/engine/merge/task/MergeTask.java      |   10 +-
 .../selectinto/InsertTabletPlanGenerator.java      |  254 ++
 .../selectinto/InsertTabletPlansIterator.java      |  139 +
 .../engine/storagegroup/StorageGroupProcessor.java |  199 +-
 .../db/engine/storagegroup/TsFileProcessor.java    |   10 +-
 .../db/engine/storagegroup/TsFileResource.java     |   16 +-
 .../storagegroup/timeindex/DeviceTimeIndex.java    |   15 +-
 .../storagegroup/timeindex/FileTimeIndex.java      |   76 +-
 .../engine/storagegroup/timeindex/ITimeIndex.java  |   10 +-
 .../storagegroup/timeindex/TimeIndexLevel.java     |   10 -
 .../virtualSg/VirtualStorageGroupManager.java      |  110 +-
 .../db/engine/trigger/executor/TriggerEngine.java  |   16 +-
 .../engine/trigger/executor/TriggerExecutor.java   |    8 +-
 .../service/TriggerRegistrationService.java        |   10 +-
 .../iotdb/db/engine/upgrade/UpgradeTask.java       |   60 +-
 .../exception/query/PathNumOverLimitException.java |   13 +-
 .../org/apache/iotdb/db/metadata/MManager.java     | 1046 +++-----
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  708 +++--
 .../org/apache/iotdb/db/metadata/MetaUtils.java    |   18 +-
 .../iotdb/db/metadata/MetadataOperationType.java   |    4 +
 .../db/metadata/{ => logfile}/MLogTxtWriter.java   |   71 +-
 .../iotdb/db/metadata/logfile/MLogWriter.java      |   24 +-
 .../db/metadata/{ => logfile}/TagLogFile.java      |    2 +-
 .../iotdb/db/metadata/mnode/EntityMNode.java       |  117 +
 .../iotdb/db/metadata/mnode/IEntityMNode.java      |   55 +
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |   82 +
 .../iotdb/db/metadata/mnode/IMeasurementMNode.java |   58 +
 .../db/metadata/mnode/IStorageGroupMNode.java      |   10 +-
 .../iotdb/db/metadata/mnode/InternalMNode.java     |  271 ++
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |  339 +--
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |  207 +-
 ...roupMNode.java => StorageGroupEntityMNode.java} |   23 +-
 .../iotdb/db/metadata/mnode/StorageGroupMNode.java |   11 +-
 .../apache/iotdb/db/metadata/tag/TagManager.java   |  556 ++++
 .../iotdb/db/metadata/template/Template.java       |   11 +-
 .../db/metadata/template/TemplateManager.java      |   96 +
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |    2 +-
 .../main/java/org/apache/iotdb/db/qp/Planner.java  |   51 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |    4 +
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |   76 +-
 .../org/apache/iotdb/db/qp/logical/Operator.java   |    6 +-
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |  209 +-
 .../db/qp/logical/crud/SelectIntoOperator.java     |  110 +
 .../iotdb/db/qp/logical/sys/LoadFilesOperator.java |   25 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |   38 +-
 .../db/qp/physical/crud/AlignByDevicePlan.java     |   57 +-
 .../iotdb/db/qp/physical/crud/InsertPlan.java      |   12 +-
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |    3 +-
 .../iotdb/db/qp/physical/crud/MeasurementInfo.java |   75 +
 .../iotdb/db/qp/physical/crud/SelectIntoPlan.java  |  113 +
 ...emplatePlan.java => SetSchemaTemplatePlan.java} |   14 +-
 .../iotdb/db/qp/physical/sys/OperateFilePlan.java  |   23 +-
 ...tePlan.java => SetUsingSchemaTemplatePlan.java} |   16 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |  191 +-
 .../iotdb/db/qp/strategy/LogicalChecker.java       |    5 +
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   24 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |    8 +-
 .../qp/strategy/optimizer/ILogicalOptimizer.java   |    3 +-
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java |   28 +-
 .../db/query/control/QueryResourceManager.java     |  100 +-
 .../iotdb/db/query/control/QueryTimeManager.java   |   14 +
 .../iotdb/db/query/control/SessionManager.java     |   27 +-
 .../apache/iotdb/db/query/control/TracingInfo.java |   85 +
 .../iotdb/db/query/control/TracingManager.java     |  141 +-
 .../db/query/dataset/AlignByDeviceDataSet.java     |   26 +-
 .../iotdb/db/query/executor/LastQueryExecutor.java |    6 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |   99 +-
 .../reader/universal/DescPriorityMergeReader.java  |    5 +-
 .../reader/universal/PriorityMergeReader.java      |   13 +-
 .../apache/iotdb/db/rescon/MemTableManager.java    |    4 +
 .../apache/iotdb/db/rescon/TVListAllocator.java    |   12 +-
 .../java/org/apache/iotdb/db/service/IoTDB.java    |    4 +-
 .../org/apache/iotdb/db/service/RPCService.java    |    1 +
 .../org/apache/iotdb/db/service/ServiceType.java   |   10 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  391 +--
 .../org/apache/iotdb/db/service/UpgradeSevice.java |   33 +-
 .../iotdb/db/service/thrift/ThriftService.java     |   17 +-
 .../db/service/thrift/ThriftServiceThread.java     |  219 +-
 .../iotdb/db/sync/receiver/SyncServerManager.java  |    6 +
 .../apache/iotdb/db/tools/TsFileRewriteTool.java   |  174 +-
 .../apache/iotdb/db/tools/TsFileSketchTool.java    |  583 +++--
 .../org/apache/iotdb/db/tools/mlog/MLogParser.java |   19 +-
 .../db/tools/upgrade/TsFileOnlineUpgradeTool.java  |  155 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |   21 +-
 .../org/apache/iotdb/db/utils/UpgradeUtils.java    |   10 -
 .../iotdb/db/writelog/recover/LogReplayer.java     |    6 +-
 .../writelog/recover/TsFileRecoverPerformer.java   |   26 +-
 .../db/engine/memtable/MemTableFlushTaskTest.java  |   22 +-
 .../db/engine/memtable/MemTableTestUtils.java      |    5 +-
 .../db/engine/memtable/PrimitiveMemTableTest.java  |    3 +-
 .../storagegroup/StorageGroupProcessorTest.java    |   84 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |    9 +-
 .../engine/storagegroup/TsFileProcessorTest.java   |   14 +-
 .../iotdb/db/integration/IoTDBAddSubDeviceIT.java  |   11 +-
 .../iotdb/db/integration/IoTDBAlignByDeviceIT.java |   57 +-
 .../org/apache/iotdb/db/integration/IoTDBAsIT.java |    2 +-
 .../db/integration/IoTDBAutoCreateSchemaIT.java    |    6 +-
 .../db/integration/IoTDBContinuousQueryIT.java     |  147 +-
 .../db/integration/IoTDBCreateStorageGroupIT.java  |  128 +
 .../db/integration/IoTDBCreateTimeseriesIT.java    |   34 +-
 ...ltiRowIT.java => IoTDBInsertWithoutTimeIT.java} |   52 +-
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |   22 +-
 .../db/integration/IoTDBLoadExternalTsfileIT.java  |  121 +-
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |   20 +-
 .../db/integration/IoTDBQueryMemoryControlIT.java  |   20 +-
 .../iotdb/db/integration/IoTDBRestartIT.java       |   48 +
 .../iotdb/db/integration/IoTDBSelectIntoIT.java    |  617 +++++
 .../db/integration/IoTDBSequenceDataQueryIT.java   |   12 +-
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |   11 +-
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   |   14 +-
 .../db/integration/IoTDBTriggerExecutionIT.java    |   43 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |   20 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  315 ++-
 .../iotdb/db/metadata/MManagerImproveTest.java     |    8 +-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  103 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |   14 +-
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |   41 +-
 .../iotdb/db/qp/logical/LogicalPlanSmallTest.java  |    2 +-
 .../iotdb/db/qp/physical/InsertRowPlanTest.java    |    8 +-
 .../iotdb/db/qp/physical/InsertTabletPlanTest.java |   14 +-
 .../iotdb/db/qp/physical/PhysicalPlanTest.java     |   83 +-
 .../iotdb/db/query/control/TracingManagerTest.java |    7 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |    2 +-
 .../org/apache/iotdb/db/tools/MLogParserTest.java  |   71 +-
 .../iotdb/db/tools/TsFileSketchToolTest.java       |    4 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |   11 +-
 .../iotdb/db/utils/TsFileRewriteToolTest.java      |    4 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |    3 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |    2 +-
 ...{IoTDBRpcDataSet.java => IoTDBJDBCDataSet.java} |  113 +-
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |    6 +-
 .../apache/iotdb/session/IoTDBSessionVectorIT.java |  213 ++
 .../java/org/apache/iotdb/session/SessionTest.java |    2 +-
 site/README-zh.md                                  |    9 +-
 site/README.md                                     |    7 +-
 site/pom.xml                                       |  100 +-
 .../src/main/.asf.yaml                             |    7 +-
 site/src/main/.vuepress/config.js                  |   31 +-
 site/src/main/.vuepress/theme/components/Page.vue  |   15 +-
 .../theme/global-components/Contributor.vue        |    7 +
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |  111 +-
 .../test/java/org/apache/iotdb/db/sql/Cases.java   |  235 +-
 thrift/src/main/thrift/rpc.thrift                  |   13 +
 .../file/metadata/MetadataIndexConstructor.java    |   52 +-
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |   17 +-
 .../org/apache/iotdb/tsfile/read/common/Path.java  |    4 +
 .../java/org/apache/iotdb/tsfile/utils/BitMap.java |    5 +
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |   12 +-
 .../tsfile/write/chunk/ChunkGroupWriterImpl.java   |   77 +-
 .../iotdb/tsfile/write/chunk/ChunkWriterImpl.java  |   28 +-
 .../tsfile/write/chunk/VectorChunkWriterImpl.java  |    5 +-
 .../tsfile/write/schema/IMeasurementSchema.java    |    5 +
 .../tsfile/write/schema/MeasurementSchema.java     |   12 +-
 .../apache/iotdb/tsfile/write/schema/Schema.java   |   28 +-
 .../write/schema/VectorMeasurementSchema.java      |   12 +-
 .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |   10 +
 ...ateTest.java => DefaultSchemaTemplateTest.java} |    8 +-
 .../tsfile/write/MetadataIndexConstructorTest.java |  478 ++++
 .../write/schema/converter/SchemaBuilderTest.java  |    4 +-
 .../write/writer/VectorChunkWriterImplTest.java    |   34 +-
 .../write/writer/VectorMeasurementSchemaStub.java  |   12 +-
 434 files changed, 19128 insertions(+), 11133 deletions(-)
 copy cluster/src/main/java/org/apache/iotdb/cluster/{exception/MemberReadOnlyException.java => ClusterIoTDBMBean.java} (67%)
 copy server/src/main/java/org/apache/iotdb/db/query/executor/UDTFQueryExecutor.java => cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterUDTFQueryExecutor.java (91%)
 delete mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
 delete mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/RaftServer.java
 delete mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatServer.java
 delete mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatServer.java
 delete mode 100644 cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
 copy cluster/src/{test/java/org/apache/iotdb/cluster/utils/Constants.java => main/java/org/apache/iotdb/cluster/server/member/DataGroupMemberMBean.java} (84%)
 copy cluster/src/main/java/org/apache/iotdb/cluster/server/member/{package-info.java => MetaGroupMemberMBean.java} (76%)
 copy cluster/src/main/java/org/apache/iotdb/cluster/{exception/PullFileException.java => server/member/RaftMemberMBean.java} (61%)
 rename cluster/src/main/java/org/apache/iotdb/cluster/server/{DataClusterServer.java => service/DataGroupServiceImpls.java} (91%)
 copy cluster/src/main/java/org/apache/iotdb/cluster/server/service/{package-info.java => DataGroupServiceImplsMBean.java} (82%)
 create mode 100644 cluster/src/test/java/org/apache/iotdb/cluster/query/ClusterUDTFQueryExecutorTest.java
 create mode 100644 docs/UserGuide/Advanced-Features/Select-Into.md
 create mode 100644 docs/zh/UserGuide/Advanced-Features/Select-Into.md
 copy example/{mqtt => mqtt-customize}/README.md (59%)
 copy example/{hadoop => mqtt-customize}/pom.xml (87%)
 create mode 100644 example/mqtt-customize/src/main/java/org/apache/iotdb/mqtt/server/CustomizedJsonPayloadFormatter.java
 create mode 100644 example/mqtt-customize/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter
 create mode 100644 example/session/src/main/java/org/apache/iotdb/HybridTimeseriesSessionExample.java
 create mode 100644 example/session/src/main/java/org/apache/iotdb/SessionConcurrentExample.java
 copy example/tsfile/src/main/java/org/apache/iotdb/tsfile/{TsFileWriteWithTablet.java => TsFileWriteVectorWithTablet.java} (65%)
 rename flink-tsfile-connector/src/test/java/org/apache/iotdb/flink/tsfile/{RowTSRecordOutputFormatITCase.java => RowTSRecordOutputFormatIT.java} (95%)
 rename flink-tsfile-connector/src/test/java/org/apache/iotdb/flink/tsfile/{RowTsFileInputFormatITCase.java => RowTsFileInputFormatIT.java} (97%)
 copy server/src/main/java/org/apache/iotdb/db/exception/metadata/DeleteFailedException.java => jdbc/src/main/java/org/apache/iotdb/jdbc/Field.java (51%)
 copy {server/src/main/java/org/apache/iotdb/db/tools/watermark => jdbc/src/main/java/org/apache/iotdb/jdbc}/GroupedLSBWatermarkEncoder.java (90%)
 copy {server/src/main/java/org/apache/iotdb/db/query/dataset => jdbc/src/main/java/org/apache/iotdb/jdbc}/ListDataSet.java (83%)
 create mode 100644 jdbc/src/main/java/org/apache/iotdb/jdbc/StringUtils.java
 copy {server/src/main/java/org/apache/iotdb/db/tools/watermark => jdbc/src/main/java/org/apache/iotdb/jdbc}/WatermarkEncoder.java (96%)
 create mode 100644 jdbc/src/test/java/org/apache/iotdb/jdbc/IoTDBDatabaseMetadataTest.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlanGenerator.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/engine/selectinto/InsertTabletPlansIterator.java
 rename server/src/main/java/org/apache/iotdb/db/metadata/{ => logfile}/MLogTxtWriter.java (80%)
 rename server/src/main/java/org/apache/iotdb/db/metadata/{ => logfile}/TagLogFile.java (99%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/mnode/EntityMNode.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/mnode/IEntityMNode.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMNode.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/mnode/IMeasurementMNode.java
 copy cluster/src/main/java/org/apache/iotdb/cluster/exception/LogExecutionException.java => server/src/main/java/org/apache/iotdb/db/metadata/mnode/IStorageGroupMNode.java (78%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/mnode/InternalMNode.java
 copy server/src/main/java/org/apache/iotdb/db/metadata/mnode/{StorageGroupMNode.java => StorageGroupEntityMNode.java} (72%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/tag/TagManager.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/template/TemplateManager.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/qp/logical/crud/SelectIntoOperator.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/qp/physical/crud/MeasurementInfo.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/qp/physical/crud/SelectIntoPlan.java
 rename server/src/main/java/org/apache/iotdb/db/qp/physical/crud/{SetDeviceTemplatePlan.java => SetSchemaTemplatePlan.java} (85%)
 rename server/src/main/java/org/apache/iotdb/db/qp/physical/sys/{SetUsingDeviceTemplatePlan.java => SetUsingSchemaTemplatePlan.java} (83%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/query/control/TracingInfo.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/integration/IoTDBCreateStorageGroupIT.java
 copy server/src/test/java/org/apache/iotdb/db/integration/{IoTDBInsertMultiRowIT.java => IoTDBInsertWithoutTimeIT.java} (69%)
 create mode 100644 server/src/test/java/org/apache/iotdb/db/integration/IoTDBSelectIntoIT.java
 copy service-rpc/src/main/java/org/apache/iotdb/rpc/{IoTDBRpcDataSet.java => IoTDBJDBCDataSet.java} (82%)
 create mode 100644 session/src/test/java/org/apache/iotdb/session/IoTDBSessionVectorIT.java
 copy server/src/main/resources/META-INF/services/org.apache.iotdb.db.mqtt.PayloadFormatter => site/src/main/.asf.yaml (91%)
 rename tsfile/src/test/java/org/apache/iotdb/tsfile/write/{DefaultDeviceTemplateTest.java => DefaultSchemaTemplateTest.java} (93%)
 create mode 100644 tsfile/src/test/java/org/apache/iotdb/tsfile/write/MetadataIndexConstructorTest.java

[iotdb] 07/07: pass manually test

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 062533405663dd7faec8be2422390dff8721681c
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Aug 10 22:02:45 2021 +0800

    pass manually test
---
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |  18 +
 .../apache/iotdb/cluster/ClusterIoTDBMBean.java    |   4 +
 .../cluster/client/async/AsyncClientPool.java      |   1 +
 .../cluster/client/sync/SyncClientFactory.java     |   5 +-
 .../iotdb/cluster/client/sync/SyncClientPool.java  |  31 +-
 .../iotdb/cluster/client/sync/SyncDataClient.java  |   9 +-
 .../client/sync/SyncDataHeartbeatClient.java       |  10 +-
 .../iotdb/cluster/client/sync/SyncMetaClient.java  |  11 +-
 .../client/sync/SyncMetaHeartbeatClient.java       |   8 +-
 .../iotdb/cluster/partition/PartitionGroup.java    |   5 +
 .../cluster/partition/slot/SlotPartitionTable.java |   1 -
 .../iotdb/cluster/server/MetaClusterServer2.java   | 372 ---------------------
 .../handlers/caller/AppendNodeEntryHandler.java    |   9 +-
 .../server/handlers/caller/HeartbeatHandler.java   |   7 +-
 .../cluster/server/heartbeat/HeartbeatThread.java  |  14 +-
 .../server/heartbeat/MetaHeartbeatThread.java      |   3 +
 .../cluster/server/member/DataGroupMember.java     |  33 +-
 .../member/DataGroupMemberMBean.java}              |   9 +-
 .../cluster/server/member/MetaGroupMember.java     |  95 ++++--
 .../member/MetaGroupMemberMBean.java}              |  19 +-
 .../iotdb/cluster/server/member/RaftMember.java    |  45 ++-
 .../member/RaftMemberMBean.java}                   |  42 ++-
 .../server/service/DataGroupServiceImpls.java      |  26 +-
 .../service/DataGroupServiceImplsMBean.java}       |  15 +-
 .../cluster/server/service/MetaSyncService.java    |   3 +
 25 files changed, 337 insertions(+), 458 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index e72b5f0..a8dc705 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@ -82,6 +82,10 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
       String.format(
           "%s:%s=%s", "org.apache.iotdb.cluster.service", IoTDBConstant.JMX_TYPE, "ClusterIoTDB");
 
+  // TODO fix me: better to throw exception if the client can not be get. Then we can remove this
+  // field.
+  public static boolean printClientConnectionErrorStack = false;
+
   // establish the cluster as a seed
   private static final String MODE_START = "-s";
   // join an established cluster
@@ -148,6 +152,7 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
     dataGroupEngine = new DataGroupServiceImpls(protocolFactory, metaGroupEngine);
     dataClientProvider = new DataClientProvider(protocolFactory);
     initTasks();
+    JMXService.registerMBean(metaGroupEngine, metaGroupEngine.getMBeanName());
   }
 
   private void initTasks() {
@@ -268,6 +273,9 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
       // start RPC service
       logger.info("start Meta Heartbeat RPC service... ");
       registerManager.register(MetaRaftHeartBeatService.getInstance());
+      // TODO: better to start the Meta RPC service untill the heartbeatservice has elected the
+      // leader.
+      // and quorum of followers have caught up.
       logger.info("start Meta RPC service... ");
       registerManager.register(MetaRaftService.getInstance());
 
@@ -576,6 +584,16 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
     allowReport = false;
   }
 
+  @Override
+  public void enablePrintClientConnectionErrorStack() {
+    printClientConnectionErrorStack = true;
+  }
+
+  @Override
+  public void disablePrintClientConnectionErrorStack() {
+    printClientConnectionErrorStack = false;
+  }
+
   private static class ClusterIoTDBHolder {
 
     private static final ClusterIoTDB INSTANCE = new ClusterIoTDB();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
index b67debe..88f90ac 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
@@ -24,4 +24,8 @@ public interface ClusterIoTDBMBean {
   boolean startRaftInfoReport();
 
   void stopRaftInfoReport();
+
+  void enablePrintClientConnectionErrorStack();
+
+  void disablePrintClientConnectionErrorStack();
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
index 719ab8d..2aa8d04 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
 import org.apache.iotdb.cluster.utils.ClusterNode;
 import org.apache.iotdb.db.utils.TestOnly;
+
 import org.apache.thrift.async.TAsyncMethodCall;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java
index 6bfe9003..c34f1f3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java
@@ -21,7 +21,6 @@ package org.apache.iotdb.cluster.client.sync;
 
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
-
 import org.apache.thrift.transport.TTransportException;
 
 import java.io.IOException;
@@ -37,4 +36,8 @@ public interface SyncClientFactory {
    * @throws IOException
    */
   RaftService.Client getSyncClient(Node node, SyncClientPool pool) throws TTransportException;
+
+  default String nodeInfo(Node node) {
+    return node.toString();
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
index c6466f4..38d9942 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.client.sync;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
@@ -43,10 +44,6 @@ public class SyncClientPool {
   private Map<ClusterNode, Integer> nodeClientNumMap = new ConcurrentHashMap<>();
   private SyncClientFactory syncClientFactory;
 
-  // TODO fix me: better to throw exception if the client can not be get. Then we can remove this
-  // field.
-  public static boolean printStack = false;
-
   public SyncClientPool(SyncClientFactory syncClientFactory) {
     this.syncClientFactory = syncClientFactory;
     this.waitClientTimeoutMS = ClusterDescriptor.getInstance().getConfig().getWaitClientTimeoutMS();
@@ -94,8 +91,11 @@ public class SyncClientPool {
             client = syncClientFactory.getSyncClient(clusterNode, this);
           } catch (TTransportException e) {
             // TODO throw me is better.
-            if (printStack) {
-              logger.error("Cannot open transport for client {}", node, e);
+            if (ClusterIoTDB.printClientConnectionErrorStack) {
+              logger.error(
+                  "Cannot open transport for client {}", syncClientFactory.nodeInfo(node), e);
+            } else {
+              logger.error("Cannot open transport for client {}", syncClientFactory.nodeInfo(node));
             }
             return null;
           }
@@ -130,10 +130,18 @@ public class SyncClientPool {
         }
       } catch (InterruptedException e) {
         Thread.currentThread().interrupt();
-        logger.warn("Interrupted when waiting for an available client of {}", clusterNode);
+        logger.warn(
+            "Interrupted when waiting for an available client of {}",
+            syncClientFactory.nodeInfo(clusterNode));
         return null;
       } catch (TTransportException e) {
-        logger.error("Cannot open transport for client {}", clusterNode, e);
+        if (ClusterIoTDB.printClientConnectionErrorStack) {
+          logger.error(
+              "Cannot open transport for client {}", syncClientFactory.nodeInfo(clusterNode), e);
+        } else {
+          logger.error(
+              "Cannot open transport for client {}", syncClientFactory.nodeInfo(clusterNode));
+        }
         return null;
       }
     }
@@ -159,7 +167,12 @@ public class SyncClientPool {
           clientStack.push(syncClientFactory.getSyncClient(node, this));
           NodeStatusManager.getINSTANCE().activate(node);
         } catch (TTransportException e) {
-          logger.error("Cannot open transport for client {}", node, e);
+          if (ClusterIoTDB.printClientConnectionErrorStack) {
+            logger.error(
+                "Cannot open transport for client {}", syncClientFactory.nodeInfo(node), e);
+          } else {
+            logger.error("Cannot open transport for client {}", syncClientFactory.nodeInfo(node));
+          }
           nodeClientNumMap.computeIfPresent(clusterNode, (n, oldValue) -> oldValue - 1);
           NodeStatusManager.getINSTANCE().deactivate(node);
         }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
index fb861df..f886363 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
@@ -26,7 +26,6 @@ import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
 import org.apache.iotdb.rpc.TimeoutChangeableTransport;
-
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TSocket;
@@ -52,6 +51,7 @@ public class SyncDataClient extends Client implements Closeable {
 
   public SyncDataClient(TProtocolFactory protocolFactory, Node node, SyncClientPool pool)
       throws TTransportException {
+
     // the difference of the two clients lies in the port
     super(
         protocolFactory.getProtocol(
@@ -105,6 +105,13 @@ public class SyncDataClient extends Client implements Closeable {
     public SyncDataClient getSyncClient(Node node, SyncClientPool pool) throws TTransportException {
       return new SyncDataClient(protocolFactory, node, pool);
     }
+
+    @Override
+    public String nodeInfo(Node node) {
+      return String.format(
+          "DataNode (listenIp = %s, port = %d, id = %d)",
+          node.getInternalIp(), node.getDataPort(), node.getNodeIdentifier());
+    }
   }
 
   @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
index c9d7644..c2c7f9a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
-
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransportException;
@@ -64,6 +63,15 @@ public class SyncDataHeartbeatClient extends SyncDataClient {
         throws TTransportException {
       return new SyncDataHeartbeatClient(protocolFactory, node, pool);
     }
+
+    @Override
+    public String nodeInfo(Node node) {
+      return String.format(
+          "DataNode (listenIp = %s, HB port = %d, id = %d)",
+          node.getInternalIp(),
+          node.getDataPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET,
+          node.getNodeIdentifier());
+    }
   }
 
   @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
index 11df45e..588d0cd 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
@@ -22,9 +22,9 @@ package org.apache.iotdb.cluster.client.sync;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Client;
+import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
-
 import org.apache.thrift.protocol.TProtocol;
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TSocket;
@@ -88,6 +88,15 @@ public class SyncMetaClient extends Client implements Closeable {
     public SyncMetaClient getSyncClient(Node node, SyncClientPool pool) throws TTransportException {
       return new SyncMetaClient(protocolFactory, node, pool);
     }
+
+    @Override
+    public String nodeInfo(Node node) {
+      return String.format(
+          "MetaNode (listenIp = %s, HB port = %d, id = %d)",
+          node.getInternalIp(),
+          node.getMetaPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET,
+          node.getNodeIdentifier());
+    }
   }
 
   public Node getNode() {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
index a21daa1..8c7abec 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
@@ -24,7 +24,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
-
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TSocket;
 import org.apache.thrift.transport.TTransportException;
@@ -64,6 +63,13 @@ public class SyncMetaHeartbeatClient extends SyncMetaClient {
         throws TTransportException {
       return new SyncMetaHeartbeatClient(protocolFactory, node, pool);
     }
+
+    @Override
+    public String nodeInfo(Node node) {
+      return String.format(
+          "MetaNode (listenIp = %s, port = %d, id = %d)",
+          node.getInternalIp(), node.getMetaPort(), node.getNodeIdentifier());
+    }
   }
 
   @Override
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/partition/PartitionGroup.java b/cluster/src/main/java/org/apache/iotdb/cluster/partition/PartitionGroup.java
index 1ce653e..b86726b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/partition/PartitionGroup.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/partition/PartitionGroup.java
@@ -102,4 +102,9 @@ public class PartitionGroup extends ArrayList<Node> {
   public void setId(int id) {
     this.id = id;
   }
+
+  @Override
+  public String toString() {
+    return super.toString() + ", id = " + id;
+  }
 }
diff --git 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
index 7a46baa..61803ef 100644
--- 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
@@ -32,7 +32,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 import org.apache.iotdb.cluster.utils.NodeSerializeUtils;
 import org.apache.iotdb.db.utils.SerializeUtils;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer2.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer2.java
deleted file mode 100644
index 65db372..0000000
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer2.java
+++ /dev/null
@@ -1,372 +0,0 @@
-/// *
-// * Licensed to the Apache Software Foundation (ASF) under one
-// * or more contributor license agreements.  See the NOTICE file
-// * distributed with this work for additional information
-// * regarding copyright ownership.  The ASF licenses this file
-// * to you under the Apache License, Version 2.0 (the
-// * "License"); you may not use this file except in compliance
-// * with the License.  You may obtain a copy of the License at
-// *
-// *     http://www.apache.org/licenses/LICENSE-2.0
-// *
-// * Unless required by applicable law or agreed to in writing,
-// * software distributed under the License is distributed on an
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// * KIND, either express or implied.  See the License for the
-// * specific language governing permissions and limitations
-// * under the License.
-// */
-// package org.apache.iotdb.cluster.server;
-//
-// import org.apache.iotdb.cluster.config.ClusterDescriptor;
-// import org.apache.iotdb.cluster.coordinator.Coordinator;
-// import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
-// import org.apache.iotdb.cluster.exception.StartUpCheckFailureException;
-// import org.apache.iotdb.cluster.metadata.CMManager;
-// import org.apache.iotdb.cluster.metadata.MetaPuller;
-// import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
-// import org.apache.iotdb.cluster.rpc.thrift.AppendEntriesRequest;
-// import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
-// import org.apache.iotdb.cluster.rpc.thrift.CheckStatusResponse;
-// import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
-// import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
-// import org.apache.iotdb.cluster.rpc.thrift.HeartBeatRequest;
-// import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
-// import org.apache.iotdb.cluster.rpc.thrift.Node;
-// 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.StartUpStatus;
-// import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
-// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService;
-// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncProcessor;
-// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Processor;
-// import org.apache.iotdb.cluster.server.heartbeat.MetaHeartbeatServer;
-// import org.apache.iotdb.cluster.server.member.MetaGroupMember;
-// import org.apache.iotdb.cluster.server.service.MetaAsyncService;
-// import org.apache.iotdb.cluster.server.service.MetaSyncService;
-// import org.apache.iotdb.db.exception.StartupException;
-// import org.apache.iotdb.db.exception.query.QueryProcessException;
-// import org.apache.iotdb.db.service.IoTDB;
-// import org.apache.iotdb.db.utils.TestOnly;
-// import org.apache.iotdb.service.rpc.thrift.TSStatus;
-// import org.apache.thrift.TException;
-// import org.apache.thrift.async.AsyncMethodCallback;
-// import org.apache.thrift.transport.TNonblockingServerSocket;
-// import org.slf4j.Logger;
-// import org.slf4j.LoggerFactory;
-//
-// import java.net.InetSocketAddress;
-// import java.nio.ByteBuffer;
-//
-/// **
-// * MetaCluster manages the whole cluster's metadata, such as what nodes are in the cluster and the
-// * data partition. Each node has one MetaClusterServer instance, the single-node IoTDB instance is
-// * started-up at the same time.
-// */
-// public class MetaClusterServer2 extends RaftServer
-//    implements TSMetaService.AsyncIface, TSMetaService.Iface {
-//  private static Logger logger = LoggerFactory.getLogger(MetaClusterServer2.class);
-//
-//  // each node only contains one MetaGroupMember
-//  private MetaGroupMember member;
-//  private Coordinator coordinator;
-//
-//  private MetaAsyncService asyncService;
-//  private MetaSyncService syncService;
-//  private MetaHeartbeatServer metaHeartbeatServer;
-//
-//  public MetaClusterServer2() throws QueryProcessException {
-//    super();
-//    metaHeartbeatServer = new MetaHeartbeatServer(thisNode, this);
-//    coordinator = new Coordinator();
-//    member = new MetaGroupMember(protocolFactory, thisNode, coordinator);
-//    coordinator.setMetaGroupMember(member);
-//    asyncService = new MetaAsyncService(member);
-//    syncService = new MetaSyncService(member);
-//    MetaPuller.getInstance().init(member);
-//  }
-//
-//  /**
-//   * Besides the standard RaftServer start-up, the IoTDB instance, a MetaGroupMember and the
-//   * ClusterMonitor are also started.
-//   *
-//   * @throws TTransportException
-//   * @throws StartupException
-//   */
-//  @Override
-//  public void start() throws TTransportException, StartupException {
-//    super.start();
-//    metaHeartbeatServer.start();
-//
-//    IoTDB.setMetaManager(CMManager.getInstance());
-//    ((CMManager) IoTDB.metaManager).setMetaGroupMember(member);
-//    ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
-//    // TODO FIXME move this out of MetaClusterServer
-//    IoTDB.getInstance().active();
-//
-//    member.start();
-//  }
-//
-//  /** Also stops the IoTDB instance, the MetaGroupMember and the ClusterMonitor. */
-//  @Override
-//  public void stop() {
-//
-//    metaHeartbeatServer.stop();
-//    super.stop();
-//    member.stop();
-//  }
-//
-//  /** Build a initial cluster with other nodes on the seed list. */
-//  public void buildCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
-//    member.buildCluster();
-//  }
-//
-//  /**
-//   * Pick up a node from the seed list and send a join request to it.
-//   *
-//   * @return whether the node has joined the cluster.
-//   */
-//  public void joinCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
-//    member.joinCluster();
-//  }
-//
-//  /**
-//   * MetaClusterServer uses the meta port to create the socket.
-//   *
-//   * @return the TServerTransport
-//   * @throws TTransportException if create the socket fails
-//   */
-//  @Override
-//  TServerTransport getServerSocket() throws TTransportException {
-//    logger.info(
-//        "[{}] Cluster node will listen {}:{}",
-//        getServerClientName(),
-//        config.getInternalIp(),
-//        config.getInternalMetaPort());
-//    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-//      return new TNonblockingServerSocket(
-//          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()),
-//          getConnectionTimeoutInMS());
-//    } else {
-//      return new TServerSocket(
-//          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()));
-//    }
-//  }
-//
-//  @Override
-//  String getClientThreadPrefix() {
-//    return "MetaClientThread-";
-//  }
-//
-//  @Override
-//  String getServerClientName() {
-//    return "MetaServerThread-";
-//  }
-//
-//  @Override
-//  TProcessor getProcessor() {
-//    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-//      return new AsyncProcessor<>(this);
-//    } else {
-//      return new Processor<>(this);
-//    }
-//  }
-//
-//  // Request forwarding. There is only one MetaGroupMember each node, so all requests will be
-//  // directly sent to that member. See the methods in MetaGroupMember for details
-//
-//  @Override
-//  public void addNode(Node node, StartUpStatus startUpStatus, AsyncMethodCallback resultHandler) {
-//    asyncService.addNode(node, startUpStatus, resultHandler);
-//  }
-//
-//  @Override
-//  public void sendHeartbeat(HeartBeatRequest request, AsyncMethodCallback resultHandler) {
-//    asyncService.sendHeartbeat(request, resultHandler);
-//  }
-//
-//  @Override
-//  public void startElection(ElectionRequest electionRequest, AsyncMethodCallback resultHandler) {
-//    asyncService.startElection(electionRequest, resultHandler);
-//  }
-//
-//  @Override
-//  public void appendEntries(AppendEntriesRequest request, AsyncMethodCallback resultHandler) {
-//    asyncService.appendEntries(request, resultHandler);
-//  }
-//
-//  @Override
-//  public void appendEntry(AppendEntryRequest request, AsyncMethodCallback resultHandler) {
-//    asyncService.appendEntry(request, resultHandler);
-//  }
-//
-//  @Override
-//  public void sendSnapshot(SendSnapshotRequest request, AsyncMethodCallback resultHandler) {
-//    asyncService.sendSnapshot(request, resultHandler);
-//  }
-//
-//  @Override
-//  public void executeNonQueryPlan(
-//      ExecutNonQueryReq request, AsyncMethodCallback<TSStatus> resultHandler) {
-//    asyncService.executeNonQueryPlan(request, resultHandler);
-//  }
-//
-//  @Override
-//  public void requestCommitIndex(
-//      RaftNode header, AsyncMethodCallback<RequestCommitIndexResponse> resultHandler) {
-//    asyncService.requestCommitIndex(header, resultHandler);
-//  }
-//
-//  @Override
-//  public void checkAlive(AsyncMethodCallback<Node> resultHandler) {
-//    asyncService.checkAlive(resultHandler);
-//  }
-//
-//  @Override
-//  public void collectMigrationStatus(AsyncMethodCallback<ByteBuffer> resultHandler) {
-//    asyncService.collectMigrationStatus(resultHandler);
-//  }
-//
-//  @Override
-//  public void readFile(
-//      String filePath, long offset, int length, AsyncMethodCallback<ByteBuffer> resultHandler) {
-//    asyncService.readFile(filePath, offset, length, resultHandler);
-//  }
-//
-//  @Override
-//  public void queryNodeStatus(AsyncMethodCallback<TNodeStatus> resultHandler) {
-//    asyncService.queryNodeStatus(resultHandler);
-//  }
-//
-//  public MetaGroupMember getMember() {
-//    return member;
-//  }
-//
-//  @Override
-//  public void checkStatus(
-//      StartUpStatus startUpStatus, AsyncMethodCallback<CheckStatusResponse> resultHandler) {
-//    asyncService.checkStatus(startUpStatus, resultHandler);
-//  }
-//
-//  @Override
-//  public void removeNode(Node node, AsyncMethodCallback<Long> resultHandler) {
-//    asyncService.removeNode(node, resultHandler);
-//  }
-//
-//  @Override
-//  public void exile(ByteBuffer removeNodeLog, AsyncMethodCallback<Void> resultHandler) {
-//    asyncService.exile(removeNodeLog, resultHandler);
-//  }
-//
-//  @Override
-//  public void matchTerm(
-//      long index, long term, RaftNode header, AsyncMethodCallback<Boolean> resultHandler) {
-//    asyncService.matchTerm(index, term, header, resultHandler);
-//  }
-//
-//  @Override
-//  public AddNodeResponse addNode(Node node, StartUpStatus startUpStatus) throws TException {
-//    return syncService.addNode(node, startUpStatus);
-//  }
-//
-//  @Override
-//  public CheckStatusResponse checkStatus(StartUpStatus startUpStatus) {
-//    return syncService.checkStatus(startUpStatus);
-//  }
-//
-//  @Override
-//  public long removeNode(Node node) throws TException {
-//    return syncService.removeNode(node);
-//  }
-//
-//  @Override
-//  public void exile(ByteBuffer removeNodeLog) {
-//    syncService.exile(removeNodeLog);
-//  }
-//
-//  @Override
-//  public TNodeStatus queryNodeStatus() {
-//    return syncService.queryNodeStatus();
-//  }
-//
-//  @Override
-//  public Node checkAlive() {
-//    return syncService.checkAlive();
-//  }
-//
-//  @Override
-//  public ByteBuffer collectMigrationStatus() {
-//    return syncService.collectMigrationStatus();
-//  }
-//
-//  @Override
-//  public HeartBeatResponse sendHeartbeat(HeartBeatRequest request) {
-//    return syncService.sendHeartbeat(request);
-//  }
-//
-//  @Override
-//  public long startElection(ElectionRequest request) {
-//    return syncService.startElection(request);
-//  }
-//
-//  @Override
-//  public long appendEntries(AppendEntriesRequest request) throws TException {
-//    return syncService.appendEntries(request);
-//  }
-//
-//  @Override
-//  public long appendEntry(AppendEntryRequest request) throws TException {
-//    return syncService.appendEntry(request);
-//  }
-//
-//  @Override
-//  public void sendSnapshot(SendSnapshotRequest request) throws TException {
-//    syncService.sendSnapshot(request);
-//  }
-//
-//  @Override
-//  public TSStatus executeNonQueryPlan(ExecutNonQueryReq request) throws TException {
-//    return syncService.executeNonQueryPlan(request);
-//  }
-//
-//  @Override
-//  public RequestCommitIndexResponse requestCommitIndex(RaftNode header) throws TException {
-//    return syncService.requestCommitIndex(header);
-//  }
-//
-//  @Override
-//  public ByteBuffer readFile(String filePath, long offset, int length) throws TException {
-//    return syncService.readFile(filePath, offset, length);
-//  }
-//
-//  @Override
-//  public boolean matchTerm(long index, long term, RaftNode header) {
-//    return syncService.matchTerm(index, term, header);
-//  }
-//
-//  @Override
-//  public void removeHardLink(String hardLinkPath) throws TException {
-//    syncService.removeHardLink(hardLinkPath);
-//  }
-//
-//  @Override
-//  public void removeHardLink(String hardLinkPath, AsyncMethodCallback<Void> resultHandler) {
-//    asyncService.removeHardLink(hardLinkPath, resultHandler);
-//  }
-//
-//  @Override
-//  public void handshake(Node sender) {
-//    syncService.handshake(sender);
-//  }
-//
-//  @Override
-//  public void handshake(Node sender, AsyncMethodCallback<Void> resultHandler) {
-//    asyncService.handshake(sender, resultHandler);
-//  }
-//
-//  @TestOnly
-//  public void setMetaGroupMember(MetaGroupMember metaGroupMember) {
-//    this.member = metaGroupMember;
-//  }
-// }
diff --git 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
index fa744d1..6da7370 100644
--- 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
@@ -25,7 +25,6 @@ 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.thrift.async.AsyncMethodCallback;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -77,7 +76,8 @@ public class AppendNodeEntryHandler implements AsyncMethodCallback<Long> {
       // the request already failed
       return;
     }
-    logger.debug("{}: Append response {} from {}", member.getName(), response, receiver);
+    logger.debug(
+        "{}: Append response {} from {} for log {}", member.getName(), response, receiver, log);
     if (leaderShipStale.get()) {
       // someone has rejected this log because the leadership is stale
       return;
@@ -106,11 +106,12 @@ public class AppendNodeEntryHandler implements AsyncMethodCallback<Long> {
         // 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: {}/{} for log {}",
             member.getName(),
             receiver,
             prevReceiverTerm,
-            resp);
+            resp,
+            log);
         if (resp > prevReceiverTerm) {
           receiverTerm.set(resp);
         }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandler.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandler.java
index ba26259..4b4f4b6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandler.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/HeartbeatHandler.java
@@ -23,7 +23,6 @@ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.member.RaftMember;
 import org.apache.iotdb.cluster.server.monitor.Peer;
-
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +53,11 @@ public class HeartbeatHandler implements AsyncMethodCallback<HeartBeatResponse>
   public void onComplete(HeartBeatResponse resp) {
     long followerTerm = resp.getTerm();
     if (logger.isDebugEnabled()) {
-      logger.debug("{}: Received a heartbeat response {}", memberName, followerTerm);
+      logger.debug(
+          "{}: Received a heartbeat response {} for last log index {}",
+          memberName,
+          followerTerm,
+          resp.getLastLogIndex());
     }
     if (followerTerm == RESPONSE_AGREE) {
       // current leadership is still valid
diff --git 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
index bef24c7..a7afd0b 100644
--- 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
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.server.heartbeat;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
@@ -32,7 +33,6 @@ 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.thrift.TException;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
@@ -230,8 +230,16 @@ public class HeartbeatThread implements Runnable {
                   HeartBeatResponse heartBeatResponse = client.sendHeartbeat(req);
                   heartbeatHandler.onComplete(heartBeatResponse);
                 } catch (TTransportException e) {
-                  logger.warn(
-                      "{}: Cannot send heart beat to node {} due to network", memberName, node, e);
+                  if (ClusterIoTDB.printClientConnectionErrorStack) {
+                    logger.warn(
+                        "{}: Cannot send heart beat to node {} due to network",
+                        memberName,
+                        node,
+                        e);
+                  } else {
+                    logger.warn(
+                        "{}: Cannot send heart beat to node {} due to network", memberName, node);
+                  }
                   client.getInputProtocol().getTransport().close();
                 } catch (Exception e) {
                   logger.warn("{}: Cannot send heart beat to node {}", memberName, node, e);
diff --git 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
index 137330a..de948ac 100644
--- 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
@@ -76,6 +76,9 @@ public class MetaHeartbeatThread extends HeartbeatThread {
     super.startElection();
 
     if (localMetaMember.getCharacter() == NodeCharacter.LEADER) {
+      // if the node becomes the leader,
+      localMetaMember.buildMetaEngineServiceIfNotReady();
+
       // A new raft leader needs to have at least one log in its term for committing logs with older
       // terms.
       // In the meta group, log frequency is very low. When the leader is changed whiling changing
diff --git 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
index 6f12dfa..d288b86 100644
--- 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
@@ -74,6 +74,7 @@ import org.apache.iotdb.cluster.server.monitor.Timer;
 import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
 import org.apache.iotdb.cluster.utils.IOUtils;
 import org.apache.iotdb.cluster.utils.StatusUtils;
+import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.engine.storagegroup.StorageGroupProcessor.TimePartitionFilter;
@@ -88,11 +89,11 @@ import org.apache.iotdb.db.qp.physical.crud.InsertPlan;
 import org.apache.iotdb.db.qp.physical.sys.FlushPlan;
 import org.apache.iotdb.db.qp.physical.sys.LogPlan;
 import org.apache.iotdb.db.service.IoTDB;
+import org.apache.iotdb.db.service.JMXService;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.service.rpc.thrift.EndPoint;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 import org.apache.iotdb.tsfile.utils.Pair;
-
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -121,7 +122,9 @@ import java.util.concurrent.TimeUnit;
 
 import static org.apache.iotdb.cluster.config.ClusterConstant.THREAD_POLL_WAIT_TERMINATION_TIME_S;
 
-public class DataGroupMember extends RaftMember {
+public class DataGroupMember extends RaftMember implements DataGroupMemberMBean {
+
+  private final String mbeanName;
 
   private static final Logger logger = LoggerFactory.getLogger(DataGroupMember.class);
 
@@ -167,6 +170,13 @@ public class DataGroupMember extends RaftMember {
   public DataGroupMember(PartitionGroup nodes) {
     // constructor for test
     allNodes = nodes;
+    mbeanName =
+        String.format(
+            "%s:%s=%s%d",
+            "org.apache.iotdb.cluster.service",
+            IoTDBConstant.JMX_TYPE,
+            "DataMember",
+            getRaftGroupId());
     setQueryManager(new ClusterQueryManager());
     localQueryExecutor = new LocalQueryExecutor(this);
     lastAppliedPartitionTableVersion = new LastAppliedPatitionTableVersion(getMemberDir());
@@ -177,7 +187,7 @@ public class DataGroupMember extends RaftMember {
         "Data("
             + nodes.getHeader().getNode().getInternalIp()
             + ":"
-            + nodes.getHeader().getNode().getMetaPort()
+            + nodes.getHeader().getNode().getDataPort()
             + ", raftId="
             + nodes.getId()
             + ")",
@@ -188,6 +198,13 @@ public class DataGroupMember extends RaftMember {
         new AsyncClientPool(new SingleManagerFactory(factory)));
     this.metaGroupMember = metaGroupMember;
     allNodes = 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());
     LogApplier applier = new DataLogApplier(metaGroupMember, this);
@@ -213,6 +230,8 @@ public class DataGroupMember extends RaftMember {
     if (heartBeatService != null) {
       return;
     }
+    logger.info("Starting DataGroupMember {}... RaftGroupID: {}", name, getRaftGroupId());
+    JMXService.registerMBean(this, mbeanName);
     super.start();
     heartBeatService.submit(new DataHeartbeatThread(this));
     pullSnapshotService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@@ -227,7 +246,8 @@ public class DataGroupMember extends RaftMember {
    */
   @Override
   public void stop() {
-    logger.info("{}: stopping...", name);
+    logger.info("Stopping DataGroupMember {}... RaftGroupID: {}", name, getRaftGroupId());
+    JMXService.deregisterMBean(mbeanName);
     super.stop();
     if (pullSnapshotService != null) {
       pullSnapshotService.shutdownNow();
@@ -720,6 +740,11 @@ public class DataGroupMember extends RaftMember {
     }
   }
 
+  @Override
+  public String getMBeanName() {
+    return mbeanName;
+  }
+
   private void handleChangeMembershipLogWithoutRaft(Log log) {
     if (log instanceof AddNodeLog) {
       if (!metaGroupMember
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMemberMBean.java
similarity index 73%
copy from cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMemberMBean.java
index b67debe..fffe4ab 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMemberMBean.java
@@ -16,12 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster;
+package org.apache.iotdb.cluster.server.member;
 
-// we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
-public interface ClusterIoTDBMBean {
-  /** @return true only if the log degree is DEBUG and the report is enabled */
-  boolean startRaftInfoReport();
+public interface DataGroupMemberMBean extends RaftMemberMBean {
 
-  void stopRaftInfoReport();
+  String getCharacterAsString();
 }
diff --git 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
index 53fbfc8..97822c2 100644
--- 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
@@ -78,6 +78,7 @@ import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.cluster.utils.PartitionUtils;
 import org.apache.iotdb.cluster.utils.StatusUtils;
 import org.apache.iotdb.cluster.utils.nodetool.function.Status;
+import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.engine.StorageEngine;
 import org.apache.iotdb.db.exception.ShutdownException;
@@ -136,7 +137,12 @@ import static org.apache.iotdb.cluster.utils.ClusterUtils.WAIT_START_UP_CHECK_TI
 import static org.apache.iotdb.cluster.utils.ClusterUtils.analyseStartUpCheckResult;
 
 @SuppressWarnings("java:S1135")
-public class MetaGroupMember extends RaftMember implements IService {
+public class MetaGroupMember extends RaftMember implements IService, MetaGroupMemberMBean {
+
+  private static final String mbeanName =
+      String.format(
+          "%s:%s=%s",
+          "org.apache.iotdb.cluster.service", IoTDBConstant.JMX_TYPE, "MetaGroupEngine");
 
   /** the file that contains the identifier of this node */
   static final String NODE_IDENTIFIER_FILE_NAME =
@@ -601,6 +607,25 @@ public class MetaGroupMember extends RaftMember implements IService {
         response.setRequirePartitionTable(true);
       }
     }
+
+    // if isReady, then it means the node has receives partitionTable from the leader, skip the
+    // following logic.
+    if (!ready) {
+      // if the node does not provide necessary info, wait for the next heartbeat.
+      if (response.isSetFollowerIdentifier()) {
+        return;
+      }
+      if (response.isSetRequirePartitionTable()) {
+        return;
+      }
+      // if the commitIndex is the same, ok we can start our datagroup service.
+      if (request.getTerm() == term.get()
+          && request.getCommitLogIndex() == getLogManager().getCommitLogIndex()) {
+        logger.info("Meta Group is ready");
+        rebuildDataGroups();
+        ready = true;
+      }
+    }
   }
 
   /**
@@ -678,25 +703,7 @@ public class MetaGroupMember extends RaftMember implements IService {
       // register the follower, the response.getFollower() contains the node information of the
       // receiver.
       registerNodeIdentifier(response.getFollower(), response.getFollowerIdentifier());
-      // if all nodes' ids are known, we can build the partition table
-      if (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());
-        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;
-      }
+      buildMetaEngineServiceIfNotReady();
     }
     // record the requirement of partition table of the follower
     if (response.isRequirePartitionTable()) {
@@ -704,6 +711,29 @@ public class MetaGroupMember extends RaftMember implements IService {
     }
   }
 
+  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());
+      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.
@@ -1370,6 +1400,11 @@ public class MetaGroupMember extends RaftMember implements IService {
     return result;
   }
 
+  @Override
+  public String getMBeanName() {
+    return mbeanName;
+  }
+
   /**
    * A non-partitioned plan (like storage group creation) should be executed on all metagroup nodes,
    * so the MetaLeader should take the responsible to make sure that every node receives the plan.
@@ -1958,4 +1993,24 @@ public class MetaGroupMember extends RaftMember implements IService {
   public void handleHandshake(Node sender) {
     NodeStatusManager.getINSTANCE().activate(sender);
   }
+
+  @Override
+  public String getAllNodesAsString() {
+    return getAllNodes().toString();
+  }
+
+  @Override
+  public String getPartitionTableAsString() {
+    return partitionTable.toString();
+  }
+
+  @Override
+  public String getBlindNodesAsString() {
+    return blindNodes.toString();
+  }
+
+  @Override
+  public String getIdNodeMapAsString() {
+    return idNodeMap.toString();
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberMBean.java
similarity index 72%
copy from cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberMBean.java
index b67debe..69f2f28 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberMBean.java
@@ -16,12 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster;
+package org.apache.iotdb.cluster.server.member;
 
-// we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
-public interface ClusterIoTDBMBean {
-  /** @return true only if the log degree is DEBUG and the report is enabled */
-  boolean startRaftInfoReport();
+public interface MetaGroupMemberMBean extends RaftMemberMBean {
 
-  void stopRaftInfoReport();
+  String getPartitionTableAsString();
+
+  boolean isReady();
+
+  String getAllNodesAsString();
+
+  String getCharacterAsString();
+
+  String getBlindNodesAsString();
+
+  String getIdNodeMapAsString();
 }
diff --git 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
index 17eab2c..2ee8626 100644
--- 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
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.server.member;
 
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncClientPool;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
@@ -62,6 +63,7 @@ import org.apache.iotdb.cluster.utils.ClientUtils;
 import org.apache.iotdb.cluster.utils.IOUtils;
 import org.apache.iotdb.cluster.utils.PlanSerializer;
 import org.apache.iotdb.cluster.utils.StatusUtils;
+import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.BatchProcessException;
 import org.apache.iotdb.db.exception.IoTDBException;
 import org.apache.iotdb.db.exception.metadata.DuplicatedTemplateException;
@@ -78,8 +80,6 @@ import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
-
-import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -115,7 +115,7 @@ import static org.apache.iotdb.cluster.config.ClusterConstant.THREAD_POLL_WAIT_T
  * 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;
 
@@ -653,6 +653,10 @@ public abstract class RaftMember {
     return character;
   }
 
+  public String getCharacterAsString() {
+    return character.toString();
+  }
+
   public void setCharacter(NodeCharacter character) {
     if (!Objects.equals(character, this.character)) {
       logger.info("{} has become a {}", name, character);
@@ -804,6 +808,12 @@ public abstract class RaftMember {
     }
   }
 
+  public String getMBeanName() {
+    return String.format(
+        "%s:%s=%s",
+        "org.apache.iotdb.cluster.service", IoTDBConstant.JMX_TYPE, "Engine", getRaftGroupId());
+  }
+
   /** call back after syncLeader */
   public interface CheckConsistency {
 
@@ -2074,4 +2084,33 @@ public abstract class RaftMember {
   public void setSkipElection(boolean skipElection) {
     this.skipElection = skipElection;
   }
+
+  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 --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMemberMBean.java
similarity index 59%
copy from cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMemberMBean.java
index 6bfe9003..2a1103a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientFactory.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMemberMBean.java
@@ -16,25 +16,37 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-package org.apache.iotdb.cluster.client.sync;
+package org.apache.iotdb.cluster.server.member;
 
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.rpc.thrift.RaftService;
 
-import org.apache.thrift.transport.TTransportException;
+import java.util.concurrent.atomic.AtomicLong;
+
+public interface RaftMemberMBean {
+
+  String getAllNodesAsString();
+
+  String getName();
+
+  String getPeerMapAsString();
+
+  AtomicLong getTerm();
+
+  String getCharacterAsString();
+
+  String getLeaderAsString();
+
+  Node getVoteFor();
+
+  long getLastHeartbeatReceivedTime();
+
+  String getLogManagerObject();
+
+  boolean isReadOnly();
 
-import java.io.IOException;
+  long getLastReportedLogIndex();
 
-public interface SyncClientFactory {
+  String getLastCatchUpResponseTimeAsString();
 
-  /**
-   * Get a client which will connect the given node and be cached in the given pool.
-   *
-   * @param node the cluster node the client will connect.
-   * @param pool the pool that will cache the client for reusing.
-   * @return
-   * @throws IOException
-   */
-  RaftService.Client getSyncClient(Node node, SyncClientPool pool) throws TTransportException;
+  boolean isSkipElection();
 }
diff --git 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
index ee440b3..b2fb80c 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
@@ -41,7 +41,6 @@ import org.apache.iotdb.cluster.server.monitor.NodeReport.DataMemberReport;
 import org.apache.iotdb.cluster.utils.IOUtils;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TProtocolFactory;
@@ -61,7 +60,8 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataService.Iface {
+public class DataGroupServiceImpls
+    implements TSDataService.AsyncIface, TSDataService.Iface, DataGroupServiceImplsMBean {
 
   private static final Logger logger = LoggerFactory.getLogger(DataGroupServiceImpls.class);
 
@@ -678,6 +678,8 @@ public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataSe
         dataGroupMember.setUnchanged(true);
       } else {
         prevMember.setUnchanged(true);
+        prevMember.start();
+        // TODO do we nedd call other functions in addDataGroupMember() ?
       }
     }
 
@@ -1036,4 +1038,24 @@ public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataSe
       resultHandler.onError(e);
     }
   }
+
+  @Override
+  public String getHeaderGroupMapAsString() {
+    return headerGroupMap.toString();
+  }
+
+  @Override
+  public int getAsyncServiceMapSize() {
+    return asyncServiceMap.size();
+  }
+
+  @Override
+  public int getSyncServiceMapSize() {
+    return syncServiceMap.size();
+  }
+
+  @Override
+  public String getPartitionTable() {
+    return partitionTable.toString();
+  }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImplsMBean.java
similarity index 73%
copy from cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
copy to cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImplsMBean.java
index b67debe..988fc6f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImplsMBean.java
@@ -16,12 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.iotdb.cluster;
+package org.apache.iotdb.cluster.server.service;
 
-// we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
-public interface ClusterIoTDBMBean {
-  /** @return true only if the log degree is DEBUG and the report is enabled */
-  boolean startRaftInfoReport();
+public interface DataGroupServiceImplsMBean {
 
-  void stopRaftInfoReport();
+  String getHeaderGroupMapAsString();
+
+  int getAsyncServiceMapSize();
+
+  int getSyncServiceMapSize();
+
+  String getPartitionTable();
 }
diff --git 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
index 065b663..7d20e96 100644
--- 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
@@ -57,6 +57,7 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
     this.metaGroupMember = metaGroupMember;
   }
 
+  // behavior of followers
   @Override
   public long appendEntry(AppendEntryRequest request) throws TException {
     // if the metaGroupMember is not ready (e.g., as a follower the PartitionTable is loaded
@@ -70,6 +71,8 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
         // 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;
+      } else {
+        // do nothing because we consider if the partitionTable is loaded, then it is corrected.
       }
     }
 

[iotdb] 03/07: temporary commit

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit bba25de92dd2e7fe90bf6514a553970416701862
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Sun Aug 8 00:01:40 2021 +0800

    temporary commit
---
 cluster/pom.xml                                    |   6 +
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     | 230 +++++++++++++++++----
 .../apache/iotdb/cluster/ClusterIoTDBMBean.java    |  27 +++
 .../cluster/client/async/AsyncDataClient.java      |   4 +-
 .../client/async/AsyncDataHeartbeatClient.java     |   4 +-
 .../cluster/client/async/AsyncMetaClient.java      |   4 +-
 .../client/async/AsyncMetaHeartbeatClient.java     |   4 +-
 .../cluster/client/sync/SyncClientAdaptor.java     |  56 ++---
 .../iotdb/cluster/client/sync/SyncDataClient.java  |   4 +-
 .../client/sync/SyncDataHeartbeatClient.java       |   4 +-
 .../iotdb/cluster/client/sync/SyncMetaClient.java  |   4 +-
 .../client/sync/SyncMetaHeartbeatClient.java       |   4 +-
 .../iotdb/cluster/config/ClusterConstant.java      |  17 +-
 .../iotdb/cluster/coordinator/Coordinator.java     |  14 +-
 .../iotdb/cluster/log/applier/DataLogApplier.java  |   9 +-
 .../iotdb/cluster/log/catchup/LogCatchUpTask.java  |   5 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   |  53 +++--
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |  19 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |  41 ++--
 .../cluster/query/aggregate/ClusterAggregator.java |  11 +-
 .../cluster/query/fill/ClusterPreviousFill.java    |  14 +-
 .../query/groupby/RemoteGroupByExecutor.java       |  19 +-
 .../query/last/ClusterLastQueryExecutor.java       |  11 +-
 .../cluster/query/reader/ClusterReaderFactory.java |  11 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |  17 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |   8 +-
 .../query/reader/RemoteSimpleSeriesReader.java     |   8 +-
 .../query/reader/mult/MultDataSourceInfo.java      |  19 +-
 .../query/reader/mult/RemoteMultSeriesReader.java  |   8 +-
 .../iotdb/cluster/server/ClusterTSServiceImpl.java |   1 +
 .../iotdb/cluster/server/StoppedMemberManager.java |   9 +-
 .../server/heartbeat/DataHeartbeatServer.java      |  83 --------
 .../cluster/server/heartbeat/HeartbeatServer.java  | 212 -------------------
 .../cluster/server/heartbeat/HeartbeatThread.java  |  13 +-
 .../server/heartbeat/MetaHeartbeatServer.java      |  90 --------
 .../cluster/server/member/DataGroupMember.java     |  13 +-
 .../cluster/server/member/MetaGroupMember.java     | 224 ++++++--------------
 .../iotdb/cluster/server/member/RaftMember.java    |  25 +--
 .../DataGroupServiceImpls.java}                    | 109 +++-------
 .../cluster/utils/nodetool/ClusterMonitor.java     |  29 ++-
 .../cluster/client/async/AsyncDataClientTest.java  |  11 +-
 .../cluster/client/async/AsyncMetaClientTest.java  |  11 +-
 .../cluster/integration/BaseSingleNodeTest.java    |   7 +-
 .../cluster/log/applier/DataLogApplierTest.java    | 138 +++++++------
 .../cluster/query/reader/DatasourceInfoTest.java   |  27 +--
 .../reader/RemoteSeriesReaderByTimestampTest.java  | 114 +++++-----
 .../query/reader/RemoteSimpleSeriesReaderTest.java |  92 ++++-----
 .../mult/AssignPathManagedMergeReaderTest.java     | 105 +++++-----
 .../reader/mult/RemoteMultSeriesReaderTest.java    | 172 +++++++--------
 .../clusterinfo/ClusterInfoServiceImplTest.java    |  19 +-
 .../server/heartbeat/HeartbeatThreadTest.java      |   7 +-
 .../iotdb/cluster/server/member/BaseMember.java    |  32 +--
 .../cluster/server/member/DataGroupMemberTest.java |  34 ++-
 .../cluster/server/member/MetaGroupMemberTest.java | 104 +++++-----
 .../org/apache/iotdb/db/concurrent/ThreadName.java |  12 +-
 .../org/apache/iotdb/db/service/ServiceType.java   |   5 +-
 .../iotdb/db/service/thrift/ThriftService.java     |   5 +-
 .../db/service/thrift/ThriftServiceThread.java     |   1 +
 .../iotdb/db/sync/receiver/SyncServerManager.java  |   1 +
 59 files changed, 998 insertions(+), 1342 deletions(-)

diff --git a/cluster/pom.xml b/cluster/pom.xml
index ff950d0..ab1cee5 100644
--- a/cluster/pom.xml
+++ b/cluster/pom.xml
@@ -125,6 +125,12 @@
             <artifactId>powermock-api-mockito2</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>io.atomix</groupId>
+            <artifactId>atomix-raft</artifactId>
+            <version>3.0.0-rc4</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
     <profiles>
         <profile>
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index 4fcb5a5..07aee1e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@ -18,9 +18,11 @@
  */
 package org.apache.iotdb.cluster;
 
+import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncMetaClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.config.ClusterConfig;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.coordinator.Coordinator;
 import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
@@ -31,12 +33,16 @@ import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
 import org.apache.iotdb.cluster.partition.slot.SlotStrategy;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.ClusterRPCService;
-import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
+import org.apache.iotdb.cluster.server.HardLinkCleaner;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.clusterinfo.ClusterInfoServer;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
+import org.apache.iotdb.cluster.server.monitor.NodeReport;
+import org.apache.iotdb.cluster.server.raft.DataRaftHeartBeatService;
+import org.apache.iotdb.cluster.server.raft.DataRaftService;
 import org.apache.iotdb.cluster.server.raft.MetaRaftHeartBeatService;
 import org.apache.iotdb.cluster.server.raft.MetaRaftService;
+import org.apache.iotdb.cluster.server.service.DataGroupServiceImpls;
 import org.apache.iotdb.cluster.server.service.MetaAsyncService;
 import org.apache.iotdb.cluster.server.service.MetaSyncService;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
@@ -45,7 +51,6 @@ import org.apache.iotdb.db.conf.IoTDBConfigCheck;
 import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.StartupException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.JMXService;
 import org.apache.iotdb.db.service.RegisterManager;
@@ -62,16 +67,20 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
+import static org.apache.iotdb.cluster.config.ClusterConstant.THREAD_POLL_WAIT_TERMINATION_TIME_S;
 import static org.apache.iotdb.cluster.utils.ClusterUtils.UNKNOWN_CLIENT_IP;
 
 // we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
-public class ClusterIoTDB {
+public class ClusterIoTDB implements ClusterIoTDBMBean {
 
   private static final Logger logger = LoggerFactory.getLogger(ClusterIoTDB.class);
   private final String mbeanName =
       String.format(
-          "%s:%s=%s", IoTDBConstant.IOTDB_PACKAGE, IoTDBConstant.JMX_TYPE, "ClusterIoTDB");
+          "%s:%s=%s", "org.apache.iotdb.cluster.service", IoTDBConstant.JMX_TYPE, "ClusterIoTDB");
 
   // establish the cluster as a seed
   private static final String MODE_START = "-s";
@@ -82,6 +91,10 @@ public class ClusterIoTDB {
   private static final String MODE_REMOVE = "-r";
 
   private MetaGroupMember metaGroupEngine;
+
+  // TODO we can split dataGroupServiceImpls into two parts: the rpc impl and the engine.
+  private DataGroupServiceImpls dataGroupEngine;
+
   private Node thisNode;
   private Coordinator coordinator;
 
@@ -90,6 +103,24 @@ public class ClusterIoTDB {
   // Cluster IoTDB uses a individual registerManager with its parent.
   private RegisterManager registerManager = new RegisterManager();
 
+  /**
+   * a single thread pool, every "REPORT_INTERVAL_SEC" seconds, "reportThread" will print the status
+   * of all raft members in this node
+   */
+  private ScheduledExecutorService reportThread =
+      Executors.newSingleThreadScheduledExecutor(n -> new Thread(n, "NodeReportThread"));
+
+  private boolean allowReport = true;
+
+  /** hardLinkCleaner will periodically clean expired hardlinks created during snapshots */
+  private ScheduledExecutorService hardLinkCleanerThread =
+      Executors.newSingleThreadScheduledExecutor(n -> new Thread(n, "HardLinkCleaner"));
+
+  // currently, dataClientProvider is only used for those instances who do not belong to any
+  // DataGroup..
+  // TODO: however, why not let all dataGroupMembers getting clients from dataClientProvider
+  private DataClientProvider dataClientProvider;
+
   private ClusterIoTDB() {
     ClusterConfig config = ClusterDescriptor.getInstance().getConfig();
     thisNode = new Node();
@@ -100,6 +131,53 @@ public class ClusterIoTDB {
     // set client rpc ip and ports
     thisNode.setClientPort(config.getClusterRpcPort());
     thisNode.setClientIp(IoTDBDescriptor.getInstance().getConfig().getRpcAddress());
+    coordinator = new Coordinator();
+  }
+
+  public void initLocalEngines() {
+    // local engine
+    TProtocolFactory protocolFactory =
+        ThriftServiceThread.getProtocolFactory(
+            IoTDBDescriptor.getInstance().getConfig().isRpcThriftCompressionEnable());
+    metaGroupEngine = new MetaGroupMember(protocolFactory, thisNode, coordinator);
+    IoTDB.setMetaManager(CMManager.getInstance());
+    ((CMManager) IoTDB.metaManager).setMetaGroupMember(metaGroupEngine);
+    ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
+    MetaPuller.getInstance().init(metaGroupEngine);
+
+    dataGroupEngine = new DataGroupServiceImpls(protocolFactory, metaGroupEngine);
+    dataClientProvider = new DataClientProvider(protocolFactory);
+    initTasks();
+  }
+
+  private void initTasks() {
+    reportThread.scheduleAtFixedRate(
+        this::generateNodeReport,
+        ClusterConstant.REPORT_INTERVAL_SEC,
+        ClusterConstant.REPORT_INTERVAL_SEC,
+        TimeUnit.SECONDS);
+    hardLinkCleanerThread.scheduleAtFixedRate(
+        new HardLinkCleaner(),
+        ClusterConstant.CLEAN_HARDLINK_INTERVAL_SEC,
+        ClusterConstant.CLEAN_HARDLINK_INTERVAL_SEC,
+        TimeUnit.SECONDS);
+  }
+
+  /**
+   * Generate a report containing the status of both MetaGroupMember and DataGroupMembers of this
+   * node. This will help to see if the node is in a consistent and right state during debugging.
+   */
+  private void generateNodeReport() {
+    if (logger.isDebugEnabled() && allowReport) {
+      try {
+        NodeReport report = new NodeReport(thisNode);
+        report.setMetaMemberReport(metaGroupEngine.genMemberReport());
+        report.setDataMemberReportList(dataGroupEngine.genMemberReports());
+        logger.debug(report.toString());
+      } catch (Exception e) {
+        logger.error("exception occurred when generating node report", e);
+      }
+    }
   }
 
   public static void main(String[] args) {
@@ -138,6 +216,7 @@ public class ClusterIoTDB {
     logger.info("Running mode {}", mode);
 
     ClusterIoTDB cluster = ClusterIoTDBHolder.INSTANCE;
+    cluster.initLocalEngines();
     // we start IoTDB kernel first.
     // cluster.iotdb.active();
 
@@ -162,55 +241,44 @@ public class ClusterIoTDB {
       startServerCheck();
       preStartCustomize();
 
-      coordinator = new Coordinator();
+      iotdb.active();
+      JMXService.registerMBean(this, mbeanName);
       // register MetaGroupMember. MetaGroupMember has the same position with "StorageEngine" in the
       // cluster moduel.
       // TODO fixme it is better to remove coordinator out of metaGroupEngine
 
-      // local engine
-      metaGroupEngine =
-          new MetaGroupMember(
-              ThriftServiceThread.getProtocolFactory(
-                  IoTDBDescriptor.getInstance().getConfig().isRpcThriftCompressionEnable()),
-              thisNode,
-              coordinator);
-      IoTDB.setMetaManager(CMManager.getInstance());
-      ((CMManager) IoTDB.metaManager).setMetaGroupMember(metaGroupEngine);
-      ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
-      MetaPuller.getInstance().init(metaGroupEngine);
-      iotdb.active();
-
       registerManager.register(metaGroupEngine);
 
       metaGroupEngine.buildCluster();
 
-      // rpc service
+      // rpc service initialize
       if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
         MetaAsyncService metaAsyncService = new MetaAsyncService(metaGroupEngine);
         MetaRaftHeartBeatService.getInstance().initAsyncedServiceImpl(metaAsyncService);
         MetaRaftService.getInstance().initAsyncedServiceImpl(metaAsyncService);
+        DataRaftService.getInstance().initAsyncedServiceImpl(dataGroupEngine);
+        DataRaftHeartBeatService.getInstance().initAsyncedServiceImpl(dataGroupEngine);
       } else {
         MetaSyncService syncService = new MetaSyncService(metaGroupEngine);
         MetaRaftHeartBeatService.getInstance().initSyncedServiceImpl(syncService);
         MetaRaftService.getInstance().initSyncedServiceImpl(syncService);
+        DataRaftService.getInstance().initSyncedServiceImpl(dataGroupEngine);
+        DataRaftHeartBeatService.getInstance().initSyncedServiceImpl(dataGroupEngine);
       }
 
-      // meta group heart beat rpc
+      // start RPC service
       registerManager.register(MetaRaftHeartBeatService.getInstance());
       registerManager.register(MetaRaftService.getInstance());
-
-      // Currently, we do not register ClusterInfoService as a JMX Bean,
-      // so we use startService() rather than start()
-      ClusterInfoServer.getInstance().startService();
+      registerManager.register(DataRaftHeartBeatService.getInstance());
+      registerManager.register(DataRaftService.getInstance());
+      // RPC based DBA API
+      registerManager.register(ClusterInfoServer.getInstance());
       // JMX based DBA API
       registerManager.register(ClusterMonitor.INSTANCE);
       // we must wait until the metaGroup established.
       // So that the ClusterRPCService can work.
       registerManager.register(ClusterRPCService.getInstance());
-    } catch (StartupException
-        | QueryProcessException
-        | StartUpCheckFailureException
-        | ConfigInconsistentException e) {
+    } catch (StartupException | StartUpCheckFailureException | ConfigInconsistentException e) {
       stop();
       logger.error("Fail to start meta server", e);
     }
@@ -251,7 +319,7 @@ public class ClusterIoTDB {
       String message =
           String.format(
               "ReplicateNum should be greater than 0 instead of %d.", config.getReplicationNum());
-      throw new StartupException(metaServer.getMember().getName(), message);
+      throw new StartupException(metaGroupEngine.getName(), message);
     }
     // check the initial cluster size and refuse to start when the size < quorum
     int quorum = config.getReplicationNum() / 2 + 1;
@@ -260,7 +328,7 @@ public class ClusterIoTDB {
           String.format(
               "Seed number less than quorum, seed number: %s, quorum: " + "%s.",
               config.getSeedNodeUrls().size(), quorum);
-      throw new StartupException(metaServer.getMember().getName(), message);
+      throw new StartupException(metaGroupEngine.getName(), message);
     }
 
     // assert not duplicated nodes
@@ -271,20 +339,20 @@ public class ClusterIoTDB {
         String message =
             String.format(
                 "SeedNodes must not repeat each other. SeedNodes: %s", config.getSeedNodeUrls());
-        throw new StartupException(metaServer.getMember().getName(), message);
+        throw new StartupException(metaGroupEngine.getName(), message);
       }
       seedNodes.add(node);
     }
 
     // assert this node is in all nodes when restart
-    if (!metaServer.getMember().getAllNodes().isEmpty()) {
-      if (!metaServer.getMember().getAllNodes().contains(metaServer.getMember().getThisNode())) {
+    if (!metaGroupEngine.getAllNodes().isEmpty()) {
+      if (!metaGroupEngine.getAllNodes().contains(metaGroupEngine.getThisNode())) {
         String message =
             String.format(
                 "All nodes in partitionTables must contains local node in start-server mode. "
                     + "LocalNode: %s, AllNodes: %s",
-                metaServer.getMember().getThisNode(), metaServer.getMember().getAllNodes());
-        throw new StartupException(metaServer.getMember().getName(), message);
+                metaGroupEngine.getThisNode(), metaGroupEngine.getAllNodes());
+        throw new StartupException(metaGroupEngine.getName(), message);
       } else {
         return;
       }
@@ -297,7 +365,7 @@ public class ClusterIoTDB {
           String.format(
               "SeedNodes must contains local node in start-server mode. LocalNode: %s ,SeedNodes: %s",
               thisNode.toString(), config.getSeedNodeUrls());
-      throw new StartupException(metaServer.getMember().getName(), message);
+      throw new StartupException(metaGroupEngine.getName(), message);
     }
   }
 
@@ -356,10 +424,6 @@ public class ClusterIoTDB {
     }
   }
 
-  public RaftTSMetaServiceImpl getMetaServer() {
-    return metaServer;
-  }
-
   /** Developers may perform pre-start customizations here for debugging or experiments. */
   @SuppressWarnings("java:S125") // leaving examples
   private void preStartCustomize() {
@@ -407,10 +471,10 @@ public class ClusterIoTDB {
         });
   }
 
-  @TestOnly
-  public void setMetaClusterServer(RaftTSMetaServiceImpl RaftTSMetaServiceImpl) {
-    metaServer = RaftTSMetaServiceImpl;
-  }
+  //  @TestOnly
+  //  public void setMetaClusterServer(MetaGroupMember RaftTSMetaServiceImpl) {
+  //    metaServer = RaftTSMetaServiceImpl;
+  //  }
 
   public void stop() {
     deactivate();
@@ -418,7 +482,8 @@ public class ClusterIoTDB {
 
   private void deactivate() {
     logger.info("Deactivating Cluster IoTDB...");
-    metaServer.stop();
+    // metaServer.stop();
+    stopThreadPools();
     registerManager.deregisterAll();
     JMXService.deregisterMBean(mbeanName);
     logger.info("ClusterIoTDB is deactivated.");
@@ -426,10 +491,85 @@ public class ClusterIoTDB {
     iotdb.stop();
   }
 
+  private void stopThreadPools() {
+    if (reportThread != null) {
+      reportThread.shutdownNow();
+      try {
+        reportThread.awaitTermination(THREAD_POLL_WAIT_TERMINATION_TIME_S, TimeUnit.SECONDS);
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+        logger.error("Unexpected interruption when waiting for reportThread to end", e);
+      }
+    }
+    if (hardLinkCleanerThread != null) {
+      hardLinkCleanerThread.shutdownNow();
+      try {
+        hardLinkCleanerThread.awaitTermination(
+            THREAD_POLL_WAIT_TERMINATION_TIME_S, TimeUnit.SECONDS);
+      } catch (InterruptedException e) {
+        Thread.currentThread().interrupt();
+        logger.error("Unexpected interruption when waiting for hardlinkCleaner to end", e);
+      }
+    }
+  }
+
+  public DataClientProvider getClientProvider() {
+    return dataClientProvider;
+  }
+
+  @TestOnly
+  public void setClientProvider(DataClientProvider dataClientProvider) {
+    this.dataClientProvider = dataClientProvider;
+  }
+
+  public MetaGroupMember getMetaGroupEngine() {
+    return metaGroupEngine;
+  }
+
+  public Node getThisNode() {
+    return thisNode;
+  }
+
+  public Coordinator getCoordinator() {
+    return coordinator;
+  }
+
+  public IoTDB getIotdb() {
+    return iotdb;
+  }
+
+  public RegisterManager getRegisterManager() {
+    return registerManager;
+  }
+
+  public DataGroupServiceImpls getDataGroupEngine() {
+    return dataGroupEngine;
+  }
+
+  public void setMetaGroupEngine(MetaGroupMember metaGroupEngine) {
+    this.metaGroupEngine = metaGroupEngine;
+  }
+
   public static ClusterIoTDB getInstance() {
     return ClusterIoTDBHolder.INSTANCE;
   }
 
+  @Override
+  public boolean startRaftInfoReport() {
+    logger.info("Raft status report is enabled.");
+    allowReport = true;
+    if (logger.isDebugEnabled()) {
+      return true;
+    }
+    return false;
+  }
+
+  @Override
+  public void stopRaftInfoReport() {
+    logger.info("Raft status report is disabled.");
+    allowReport = false;
+  }
+
   private static class ClusterIoTDBHolder {
 
     private static final ClusterIoTDB INSTANCE = new ClusterIoTDB();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
new file mode 100644
index 0000000..b67debe
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDBMBean.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+// we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
+public interface ClusterIoTDBMBean {
+  /** @return true only if the log degree is DEBUG and the report is enabled */
+  boolean startRaftInfoReport();
+
+  void stopRaftInfoReport();
+}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
index cf0cd1c..c6c8a3a 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataClient.java
@@ -19,11 +19,11 @@
 
 package org.apache.iotdb.cluster.client.async;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
 import org.apache.iotdb.cluster.rpc.thrift.TSDataService.AsyncClient;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.rpc.TNonblockingSocketWrapper;
 
 import org.apache.thrift.async.TAsyncClientManager;
@@ -67,7 +67,7 @@ public class AsyncDataClient extends AsyncClient {
         protocolFactory,
         clientManager,
         TNonblockingSocketWrapper.wrap(
-            node.getInternalIp(), node.getDataPort(), RaftServer.getConnectionTimeoutInMS()));
+            node.getInternalIp(), node.getDataPort(), ClusterConstant.getConnectionTimeoutInMS()));
     this.node = node;
     this.pool = pool;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataHeartbeatClient.java
index 146c8b7..6276b64 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncDataHeartbeatClient.java
@@ -19,9 +19,9 @@
 
 package org.apache.iotdb.cluster.client.async;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.TNonblockingSocketWrapper;
 
@@ -48,7 +48,7 @@ public class AsyncDataHeartbeatClient extends AsyncDataClient {
         TNonblockingSocketWrapper.wrap(
             node.getInternalIp(),
             node.getDataPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET,
-            RaftServer.getConnectionTimeoutInMS()));
+            ClusterConstant.getConnectionTimeoutInMS()));
     this.node = node;
     this.pool = pool;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaClient.java
index c615df0..d3f8a97 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaClient.java
@@ -19,10 +19,10 @@
 
 package org.apache.iotdb.cluster.client.async;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
 import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncClient;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.rpc.TNonblockingSocketWrapper;
 
 import org.apache.thrift.async.TAsyncClientManager;
@@ -65,7 +65,7 @@ public class AsyncMetaClient extends AsyncClient {
         protocolFactory,
         clientManager,
         TNonblockingSocketWrapper.wrap(
-            node.getInternalIp(), node.getMetaPort(), RaftServer.getConnectionTimeoutInMS()));
+            node.getInternalIp(), node.getMetaPort(), ClusterConstant.getConnectionTimeoutInMS()));
     this.node = node;
     this.pool = pool;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaHeartbeatClient.java
index babeae4..40e1075 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncMetaHeartbeatClient.java
@@ -19,9 +19,9 @@
 
 package org.apache.iotdb.cluster.client.async;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.TNonblockingSocketWrapper;
 
@@ -48,7 +48,7 @@ public class AsyncMetaHeartbeatClient extends AsyncMetaClient {
         TNonblockingSocketWrapper.wrap(
             node.getInternalIp(),
             node.getMetaPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET,
-            RaftServer.getConnectionTimeoutInMS()));
+            ClusterConstant.getConnectionTimeoutInMS()));
     this.node = node;
     this.pool = pool;
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientAdaptor.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientAdaptor.java
index ee15d0d..c69651c 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientAdaptor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientAdaptor.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.cluster.client.sync;
 
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.async.AsyncMetaClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.log.Snapshot;
 import org.apache.iotdb.cluster.log.snapshot.SnapshotFactory;
 import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
@@ -39,7 +40,6 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.SingleSeriesQueryRequest;
 import org.apache.iotdb.cluster.rpc.thrift.StartUpStatus;
 import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.server.handlers.caller.GetChildNodeNextLevelHandler;
 import org.apache.iotdb.cluster.server.handlers.caller.GetChildNodeNextLevelPathHandler;
@@ -100,7 +100,7 @@ public class SyncClientAdaptor {
     asyncMetaClient.removeNode(nodeToRemove, handler);
     synchronized (responseRef) {
       if (responseRef.get() == null) {
-        responseRef.wait(RaftServer.getConnectionTimeoutInMS());
+        responseRef.wait(ClusterConstant.getConnectionTimeoutInMS());
       }
     }
     return responseRef.get();
@@ -116,7 +116,7 @@ public class SyncClientAdaptor {
       client.matchTerm(prevLogIndex, prevLogTerm, header, matchTermHandler);
       synchronized (resultRef) {
         if (resultRef.get() == null) {
-          resultRef.wait(RaftServer.getConnectionTimeoutInMS());
+          resultRef.wait(ClusterConstant.getConnectionTimeoutInMS());
         }
       }
       return resultRef.get();
@@ -135,7 +135,7 @@ public class SyncClientAdaptor {
     client.querySingleSeriesByTimestamp(request, handler);
     synchronized (result) {
       if (result.get() == null && handler.getException() == null) {
-        result.wait(RaftServer.getReadOperationTimeoutMS());
+        result.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return result.get();
@@ -159,7 +159,7 @@ public class SyncClientAdaptor {
     client.querySingleSeries(request, handler);
     synchronized (result) {
       if (result.get() == null && handler.getException() == null) {
-        result.wait(RaftServer.getReadOperationTimeoutMS());
+        result.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return result.get();
@@ -176,7 +176,7 @@ public class SyncClientAdaptor {
     client.getNodeList(header, schemaPattern, level, handler);
     synchronized (response) {
       if (response.get() == null) {
-        response.wait(RaftServer.getReadOperationTimeoutMS());
+        response.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return response.get();
@@ -193,7 +193,7 @@ public class SyncClientAdaptor {
     client.getChildNodeInNextLevel(header, path, handler);
     synchronized (response) {
       if (response.get() == null) {
-        response.wait(RaftServer.getReadOperationTimeoutMS());
+        response.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return response.get();
@@ -209,7 +209,7 @@ public class SyncClientAdaptor {
     client.getChildNodePathInNextLevel(header, path, handler);
     synchronized (response) {
       if (response.get() == null) {
-        response.wait(RaftServer.getReadOperationTimeoutMS());
+        response.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return response.get();
@@ -230,7 +230,7 @@ public class SyncClientAdaptor {
         header, ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), handler);
     synchronized (response) {
       if (response.get() == null) {
-        response.wait(RaftServer.getReadOperationTimeoutMS());
+        response.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return response.get();
@@ -244,7 +244,7 @@ public class SyncClientAdaptor {
     client.queryNodeStatus(handler);
     synchronized (resultRef) {
       if (resultRef.get() == null) {
-        resultRef.wait(RaftServer.getReadOperationTimeoutMS());
+        resultRef.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     if (handler.getException() != null) {
@@ -261,7 +261,7 @@ public class SyncClientAdaptor {
     client.checkStatus(startUpStatus, handler);
     synchronized (resultRef) {
       if (resultRef.get() == null) {
-        resultRef.wait(RaftServer.getReadOperationTimeoutMS());
+        resultRef.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     if (handler.getException() != null) {
@@ -298,7 +298,7 @@ public class SyncClientAdaptor {
             client.getNode(), pullSchemaRequest.getPrefixPaths(), measurementSchemas));
     synchronized (measurementSchemas) {
       if (measurementSchemas.get() == null) {
-        measurementSchemas.wait(RaftServer.getReadOperationTimeoutMS());
+        measurementSchemas.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return measurementSchemas.get();
@@ -315,7 +315,7 @@ public class SyncClientAdaptor {
 
     synchronized (timeseriesSchemas) {
       if (timeseriesSchemas.get() == null) {
-        timeseriesSchemas.wait(RaftServer.getReadOperationTimeoutMS());
+        timeseriesSchemas.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return timeseriesSchemas.get();
@@ -330,7 +330,7 @@ public class SyncClientAdaptor {
     client.getAggrResult(request, handler);
     synchronized (resultReference) {
       if (resultReference.get() == null) {
-        resultReference.wait(RaftServer.getReadOperationTimeoutMS());
+        resultReference.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     if (handler.getException() != null) {
@@ -346,7 +346,7 @@ public class SyncClientAdaptor {
     GenericHandler<List<String>> handler = new GenericHandler<>(client.getNode(), remoteResult);
 
     client.getUnregisteredTimeseries(header, seriesPaths, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static GetAllPathsResult getAllPaths(
@@ -357,7 +357,7 @@ public class SyncClientAdaptor {
         new GenericHandler<>(client.getNode(), remoteResult);
 
     client.getAllPaths(header, pathsToQuery, withAlias, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static Integer getPathCount(
@@ -367,7 +367,7 @@ public class SyncClientAdaptor {
     GenericHandler<Integer> handler = new GenericHandler<>(client.getNode(), remoteResult);
 
     client.getPathCount(header, pathsToQuery, level, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static Set<String> getAllDevices(
@@ -377,7 +377,7 @@ public class SyncClientAdaptor {
     GenericHandler<Set<String>> handler = new GenericHandler<>(client.getNode(), remoteResult);
 
     client.getAllDevices(header, pathsToQuery, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static ByteBuffer getDevices(AsyncDataClient client, RaftNode header, ShowDevicesPlan plan)
@@ -393,7 +393,7 @@ public class SyncClientAdaptor {
     client.getDevices(header, ByteBuffer.wrap(byteArrayOutputStream.toByteArray()), handler);
     synchronized (handler) {
       if (response.get() == null) {
-        response.wait(RaftServer.getReadOperationTimeoutMS());
+        response.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return response.get();
@@ -405,7 +405,7 @@ public class SyncClientAdaptor {
     GenericHandler<Long> handler = new GenericHandler<>(client.getNode(), result);
 
     client.getGroupByExecutor(request, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static ByteBuffer previousFill(AsyncDataClient client, PreviousFillRequest request)
@@ -414,7 +414,7 @@ public class SyncClientAdaptor {
     GenericHandler<ByteBuffer> nodeHandler = new GenericHandler<>(client.getNode(), resultRef);
 
     client.previousFill(request, nodeHandler);
-    return nodeHandler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return nodeHandler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static TSStatus executeNonQuery(
@@ -430,7 +430,7 @@ public class SyncClientAdaptor {
     client.executeNonQueryPlan(req, new ForwardPlanHandler(status, plan, receiver));
     synchronized (status) {
       if (status.get() == null) {
-        status.wait(RaftServer.getWriteOperationTimeoutMS());
+        status.wait(ClusterConstant.getWriteOperationTimeoutMS());
       }
     }
     return status.get();
@@ -443,7 +443,7 @@ public class SyncClientAdaptor {
     GenericHandler<ByteBuffer> handler = new GenericHandler<>(client.getNode(), result);
 
     client.readFile(remotePath, offset, fetchSize, handler);
-    return handler.getResult(RaftServer.getWriteOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getWriteOperationTimeoutMS());
   }
 
   public static List<ByteBuffer> getGroupByResult(
@@ -453,7 +453,7 @@ public class SyncClientAdaptor {
     GenericHandler<List<ByteBuffer>> handler = new GenericHandler<>(client.getNode(), fetchResult);
 
     client.getGroupByResult(header, executorId, curStartTime, curEndTime, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static ByteBuffer peekNextNotNullValue(
@@ -463,7 +463,7 @@ public class SyncClientAdaptor {
     GenericHandler<ByteBuffer> handler = new GenericHandler<>(client.getNode(), fetchResult);
 
     client.peekNextNotNullValue(header, executorId, curStartTime, curEndTime, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static <T extends Snapshot> Map<Integer, T> pullSnapshot(
@@ -478,7 +478,7 @@ public class SyncClientAdaptor {
         request, new PullSnapshotHandler<>(snapshotRef, client.getNode(), slots, factory));
     synchronized (snapshotRef) {
       if (snapshotRef.get() == null) {
-        snapshotRef.wait(RaftServer.getReadOperationTimeoutMS());
+        snapshotRef.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return snapshotRef.get();
@@ -504,7 +504,7 @@ public class SyncClientAdaptor {
             client.getNode());
 
     client.last(request, handler);
-    return handler.getResult(RaftServer.getReadOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getReadOperationTimeoutMS());
   }
 
   public static boolean onSnapshotApplied(
@@ -514,6 +514,6 @@ public class SyncClientAdaptor {
     GenericHandler<Boolean> handler = new GenericHandler<>(client.getNode(), result);
 
     client.onSnapshotApplied(header, slots, handler);
-    return handler.getResult(RaftServer.getWriteOperationTimeoutMS());
+    return handler.getResult(ClusterConstant.getWriteOperationTimeoutMS());
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
index cf92d14..fb861df 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataClient.java
@@ -19,9 +19,9 @@
 
 package org.apache.iotdb.cluster.client.sync;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.TSDataService.Client;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
@@ -60,7 +60,7 @@ public class SyncDataClient extends Client implements Closeable {
                     TConfigurationConst.defaultTConfiguration,
                     node.getInternalIp(),
                     node.getDataPort(),
-                    RaftServer.getConnectionTimeoutInMS()))));
+                    ClusterConstant.getConnectionTimeoutInMS()))));
     this.node = node;
     this.pool = pool;
     getInputProtocol().getTransport().open();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
index 83603d4..c9d7644 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncDataHeartbeatClient.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.cluster.client.sync;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
@@ -45,7 +45,7 @@ public class SyncDataHeartbeatClient extends SyncDataClient {
                     TConfigurationConst.defaultTConfiguration,
                     node.getInternalIp(),
                     node.getDataPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET,
-                    RaftServer.getConnectionTimeoutInMS()))));
+                    ClusterConstant.getConnectionTimeoutInMS()))));
     this.node = node;
     this.pool = pool;
     getInputProtocol().getTransport().open();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
index d29e438..11df45e 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaClient.java
@@ -19,9 +19,9 @@
 
 package org.apache.iotdb.cluster.client.sync;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Client;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
 
@@ -56,7 +56,7 @@ public class SyncMetaClient extends Client implements Closeable {
                     TConfigurationConst.defaultTConfiguration,
                     node.getInternalIp(),
                     node.getMetaPort(),
-                    RaftServer.getConnectionTimeoutInMS()))));
+                    ClusterConstant.getConnectionTimeoutInMS()))));
     this.node = node;
     this.pool = pool;
     getInputProtocol().getTransport().open();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
index 7a06668..a21daa1 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncMetaHeartbeatClient.java
@@ -19,8 +19,8 @@
 
 package org.apache.iotdb.cluster.client.sync;
 
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
 import org.apache.iotdb.rpc.TConfigurationConst;
@@ -45,7 +45,7 @@ public class SyncMetaHeartbeatClient extends SyncMetaClient {
                     TConfigurationConst.defaultTConfiguration,
                     node.getInternalIp(),
                     node.getMetaPort() + ClusterUtils.META_HEARTBEAT_PORT_OFFSET,
-                    RaftServer.getConnectionTimeoutInMS()))));
+                    ClusterConstant.getConnectionTimeoutInMS()))));
     this.node = node;
     this.pool = pool;
     getInputProtocol().getTransport().open();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
index f5b0a49..5efb1c7 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
@@ -19,7 +19,6 @@
 package org.apache.iotdb.cluster.config;
 
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.db.utils.TestOnly;
 
 public class ClusterConstant {
@@ -41,6 +40,18 @@ public class ClusterConstant {
 
   public static final int THREAD_POLL_WAIT_TERMINATION_TIME_S = 10;
 
+  /**
+   * every "REPORT_INTERVAL_SEC" seconds, a reporter thread will print the status of all raft
+   * members in this node
+   */
+  public static final int REPORT_INTERVAL_SEC = 10;
+
+  /**
+   * during snapshot, hardlinks of data files are created to for downloading. hardlinks will be
+   * checked every hour by default to see if they have expired, and will be cleaned if so.
+   */
+  public static final long CLEAN_HARDLINK_INTERVAL_SEC = 3600L;
+
   public static final Node EMPTY_NODE = new Node();
 
   private ClusterConstant() {
@@ -112,11 +123,11 @@ public class ClusterConstant {
 
   @TestOnly
   public static void setReadOperationTimeoutMS(int readOperationTimeoutMS) {
-    RaftServer.readOperationTimeoutMS = readOperationTimeoutMS;
+    ClusterConstant.readOperationTimeoutMS = readOperationTimeoutMS;
   }
 
   @TestOnly
   public static void setWriteOperationTimeoutMS(int writeOperationTimeoutMS) {
-    RaftServer.writeOperationTimeoutMS = writeOperationTimeoutMS;
+    ClusterConstant.writeOperationTimeoutMS = writeOperationTimeoutMS;
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
index aedb080..5066908 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/coordinator/Coordinator.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.coordinator;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
 import org.apache.iotdb.cluster.config.ClusterConstant;
@@ -34,7 +35,6 @@ import org.apache.iotdb.cluster.query.ClusterPlanRouter;
 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.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.server.monitor.Timer;
 import org.apache.iotdb.cluster.utils.PartitionUtils;
@@ -785,9 +785,9 @@ public class Coordinator {
   private TSStatus forwardDataPlanAsync(PhysicalPlan plan, Node receiver, RaftNode header)
       throws IOException {
     RaftService.AsyncClient client =
-        metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getAsyncDataClient(receiver, RaftServer.getWriteOperationTimeoutMS());
+            .getAsyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
     return this.metaGroupMember.forwardPlanAsync(plan, receiver, header, client);
   }
 
@@ -796,9 +796,9 @@ public class Coordinator {
     RaftService.Client client;
     try {
       client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(receiver, RaftServer.getWriteOperationTimeoutMS());
+              .getSyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
     } catch (TException e) {
       throw new IOException(e);
     }
@@ -812,7 +812,7 @@ public class Coordinator {
    * @param timeout timeout threshold of connection
    */
   public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-    return metaGroupMember.getClientProvider().getAsyncDataClient(node, timeout);
+    return ClusterIoTDB.getInstance().getClientProvider().getAsyncDataClient(node, timeout);
   }
 
   public Node getThisNode() {
@@ -826,6 +826,6 @@ public class Coordinator {
    * @param timeout timeout threshold of connection
    */
   public SyncDataClient getSyncDataClient(Node node, int timeout) throws TException {
-    return metaGroupMember.getClientProvider().getSyncDataClient(node, timeout);
+    return ClusterIoTDB.getInstance().getClientProvider().getSyncDataClient(node, timeout);
   }
 }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/log/applier/DataLogApplier.java b/cluster/src/main/java/org/apache/iotdb/cluster/log/applier/DataLogApplier.java
index d68d7c5..2e8e308 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/applier/DataLogApplier.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/applier/DataLogApplier.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.log.applier;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.log.Log;
 import org.apache.iotdb.cluster.log.logtypes.AddNodeLog;
@@ -65,14 +66,14 @@ public class DataLogApplier extends BaseApplier {
 
     try {
       if (log instanceof AddNodeLog) {
-        metaGroupMember
-            .getDataClusterServer()
+        ClusterIoTDB.getInstance()
+            .getDataGroupEngine()
             .preAddNodeForDataGroup((AddNodeLog) log, dataGroupMember);
         dataGroupMember.setAndSaveLastAppliedPartitionTableVersion(
             ((AddNodeLog) log).getMetaLogIndex());
       } else if (log instanceof RemoveNodeLog) {
-        metaGroupMember
-            .getDataClusterServer()
+        ClusterIoTDB.getInstance()
+            .getDataGroupEngine()
             .preRemoveNodeForDataGroup((RemoveNodeLog) log, dataGroupMember);
         dataGroupMember.setAndSaveLastAppliedPartitionTableVersion(
             ((RemoveNodeLog) log).getMetaLogIndex());
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTask.java b/cluster/src/main/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTask.java
index 99b3e4d..544cc71 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTask.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/catchup/LogCatchUpTask.java
@@ -29,7 +29,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.LogCatchUpHandler;
 import org.apache.iotdb.cluster.server.handlers.caller.LogCatchUpInBatchHandler;
 import org.apache.iotdb.cluster.server.member.RaftMember;
@@ -53,7 +52,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 public class LogCatchUpTask implements Callable<Boolean> {
 
   // sending logs may take longer than normal communications
-  private static final long SEND_LOGS_WAIT_MS = RaftServer.getWriteOperationTimeoutMS();
+  private static final long SEND_LOGS_WAIT_MS = ClusterConstant.getWriteOperationTimeoutMS();
   private static final Logger logger = LoggerFactory.getLogger(LogCatchUpTask.class);
   Node node;
   RaftMember raftMember;
@@ -129,7 +128,7 @@ public class LogCatchUpTask implements Callable<Boolean> {
       }
       client.appendEntry(request, handler);
       raftMember.getLastCatchUpResponseTime().put(node, System.currentTimeMillis());
-      handler.getAppendSucceed().wait(RaftServer.getWriteOperationTimeoutMS());
+      handler.getAppendSucceed().wait(ClusterConstant.getWriteOperationTimeoutMS());
     }
     return handler.getAppendSucceed().get();
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
index 95f085c..f6b401f 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/CMManager.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.cluster.metadata;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.coordinator.Coordinator;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
@@ -31,7 +33,6 @@ import org.apache.iotdb.cluster.query.manage.QueryCoordinator;
 import org.apache.iotdb.cluster.rpc.thrift.GetAllPathsResult;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.conf.IoTDBConstant;
@@ -113,9 +114,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
-import static org.apache.iotdb.cluster.query.ClusterPlanExecutor.LOG_FAIL_CONNECT;
-import static org.apache.iotdb.cluster.query.ClusterPlanExecutor.THREAD_POOL_SIZE;
-import static org.apache.iotdb.cluster.query.ClusterPlanExecutor.waitForThreadPool;
+import static org.apache.iotdb.cluster.query.ClusterPlanExecutor.*;
 import static org.apache.iotdb.db.utils.EncodingInferenceUtils.getDefaultEncoding;
 
 @SuppressWarnings("java:S1135") // ignore todos
@@ -889,8 +888,8 @@ public class CMManager extends MManager {
   private List<String> getUnregisteredSeriesListLocally(
       List<String> seriesList, PartitionGroup partitionGroup) throws CheckConsistencyException {
     DataGroupMember dataMember =
-        metaGroupMember
-            .getDataClusterServer()
+        ClusterIoTDB.getInstance()
+            .getDataGroupEngine()
             .getDataMember(partitionGroup.getHeader(), null, null);
     return dataMember.getLocalQueryExecutor().getUnregisteredTimeseries(seriesList);
   }
@@ -902,17 +901,17 @@ public class CMManager extends MManager {
         List<String> result;
         if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
           AsyncDataClient client =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+                  .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
           result =
               SyncClientAdaptor.getUnregisteredMeasurements(
                   client, partitionGroup.getHeader(), seriesList);
         } else {
           try (SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
             try {
               result =
                   syncDataClient.getUnregisteredTimeseries(partitionGroup.getHeader(), seriesList);
@@ -1069,15 +1068,15 @@ public class CMManager extends MManager {
     GetAllPathsResult result;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       result = SyncClientAdaptor.getAllPaths(client, header, pathsToQuery, withAlias);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           result = syncDataClient.getAllPaths(header, pathsToQuery, withAlias);
         } catch (TException e) {
@@ -1202,15 +1201,15 @@ public class CMManager extends MManager {
     Set<String> paths;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       paths = SyncClientAdaptor.getAllDevices(client, header, pathsToQuery);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           paths = syncDataClient.getAllDevices(header, pathsToQuery);
         } catch (TException e) {
@@ -1303,7 +1302,7 @@ public class CMManager extends MManager {
     getAllPathsService.shutdown();
     try {
       getAllPathsService.awaitTermination(
-          RaftServer.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
+          ClusterConstant.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       logger.error("Unexpected interruption when waiting for get all paths services to stop", e);
@@ -1666,17 +1665,17 @@ public class CMManager extends MManager {
 
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       resultBinary = SyncClientAdaptor.getAllMeasurementSchema(client, group.getHeader(), plan);
     } else {
       try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
           DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
           SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           plan.serialize(dataOutputStream);
           resultBinary =
@@ -1697,17 +1696,17 @@ public class CMManager extends MManager {
     ByteBuffer resultBinary;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       resultBinary = SyncClientAdaptor.getDevices(client, group.getHeader(), plan);
     } else {
       try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
           DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);
           SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           plan.serialize(dataOutputStream);
           resultBinary =
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/MetaPuller.java b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/MetaPuller.java
index b212487..3e9d4e5 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/metadata/MetaPuller.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/metadata/MetaPuller.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.cluster.metadata;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
@@ -30,7 +32,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.PullSchemaRequest;
 import org.apache.iotdb.cluster.rpc.thrift.PullSchemaResp;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -227,15 +228,15 @@ public class MetaPuller {
     List<IMeasurementSchema> schemas;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       schemas = SyncClientAdaptor.pullMeasurementSchema(client, request);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           // only need measurement name
           PullSchemaResp pullSchemaResp = syncDataClient.pullMeasurementSchema(request);
@@ -414,15 +415,15 @@ public class MetaPuller {
     List<TimeseriesSchema> schemas;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       schemas = SyncClientAdaptor.pullTimeseriesSchema(client, request);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
 
         PullSchemaResp pullSchemaResp = syncDataClient.pullTimeSeriesSchema(request);
         ByteBuffer buffer = pullSchemaResp.schemaBytes;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanExecutor.java
index 373841d..9884385 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/ClusterPlanExecutor.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.cluster.query;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.metadata.CMManager;
@@ -31,7 +33,6 @@ import org.apache.iotdb.cluster.query.dataset.ClusterAlignByDeviceDataSet;
 import org.apache.iotdb.cluster.query.filter.SlotSgFilter;
 import org.apache.iotdb.cluster.query.manage.QueryCoordinator;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -246,20 +247,20 @@ public class ClusterPlanExecutor extends PlanExecutor {
         Integer count;
         if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
           AsyncDataClient client =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
-          client.setTimeout(RaftServer.getReadOperationTimeoutMS());
+                  .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
+          client.setTimeout(ClusterConstant.getReadOperationTimeoutMS());
           count =
               SyncClientAdaptor.getPathCount(
                   client, partitionGroup.getHeader(), pathsToQuery, level);
         } else {
           try (SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
             try {
-              syncDataClient.setTimeout(RaftServer.getReadOperationTimeoutMS());
+              syncDataClient.setTimeout(ClusterConstant.getReadOperationTimeoutMS());
               count = syncDataClient.getPathCount(partitionGroup.getHeader(), pathsToQuery, level);
             } catch (TException e) {
               // the connection may be broken, close it to avoid it being reused
@@ -357,17 +358,17 @@ public class ClusterPlanExecutor extends PlanExecutor {
       try {
         if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
           AsyncDataClient client =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+                  .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
           paths =
               SyncClientAdaptor.getNodeList(
                   client, group.getHeader(), schemaPattern.getFullPath(), level);
         } else {
           try (SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
             try {
               paths =
                   syncDataClient.getNodeList(group.getHeader(), schemaPattern.getFullPath(), level);
@@ -449,17 +450,17 @@ public class ClusterPlanExecutor extends PlanExecutor {
       try {
         if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
           AsyncDataClient client =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+                  .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
           nextChildrenNodes =
               SyncClientAdaptor.getChildNodeInNextLevel(
                   client, group.getHeader(), path.getFullPath());
         } else {
           try (SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
             try {
               nextChildrenNodes =
                   syncDataClient.getChildNodeInNextLevel(group.getHeader(), path.getFullPath());
@@ -530,7 +531,7 @@ public class ClusterPlanExecutor extends PlanExecutor {
 
     pool.shutdown();
     try {
-      pool.awaitTermination(RaftServer.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
+      pool.awaitTermination(ClusterConstant.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       logger.error("Unexpected interruption when waiting for {}", methodName, e);
@@ -564,16 +565,16 @@ public class ClusterPlanExecutor extends PlanExecutor {
       try {
         if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
           AsyncDataClient client =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+                  .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
           nextChildren =
               SyncClientAdaptor.getNextChildren(client, group.getHeader(), path.getFullPath());
         } else {
           try (SyncDataClient syncDataClient =
-              metaGroupMember
+              ClusterIoTDB.getInstance()
                   .getClientProvider()
-                  .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+                  .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
             try {
               nextChildren =
                   syncDataClient.getChildNodePathInNextLevel(group.getHeader(), path.getFullPath());
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/aggregate/ClusterAggregator.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/aggregate/ClusterAggregator.java
index a27b8f3..a24852d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/aggregate/ClusterAggregator.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/aggregate/ClusterAggregator.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.cluster.query.aggregate;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.EmptyIntervalException;
@@ -32,7 +34,6 @@ import org.apache.iotdb.cluster.query.RemoteQueryContext;
 import org.apache.iotdb.cluster.query.manage.QueryCoordinator;
 import org.apache.iotdb.cluster.rpc.thrift.GetAggrResultRequest;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.exception.StorageEngineException;
@@ -259,16 +260,16 @@ public class ClusterAggregator {
     List<ByteBuffer> resultBuffers;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       // each buffer is an AggregationResult
       resultBuffers = SyncClientAdaptor.getAggrResult(client, request);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           resultBuffers = syncDataClient.getAggrResult(request);
         } catch (TException e) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/fill/ClusterPreviousFill.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/fill/ClusterPreviousFill.java
index 548af4b..585b841 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/fill/ClusterPreviousFill.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/fill/ClusterPreviousFill.java
@@ -19,16 +19,17 @@
 
 package org.apache.iotdb.cluster.query.fill;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.QueryTimeOutException;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.PreviousFillRequest;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.PreviousFillHandler;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
@@ -130,7 +131,8 @@ public class ClusterPreviousFill extends PreviousFill {
     }
     fillService.shutdown();
     try {
-      fillService.awaitTermination(RaftServer.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
+      fillService.awaitTermination(
+          ClusterConstant.getReadOperationTimeoutMS(), TimeUnit.MILLISECONDS);
     } catch (InterruptedException e) {
       Thread.currentThread().interrupt();
       logger.error("Unexpected interruption when waiting for fill pool to stop", e);
@@ -218,9 +220,9 @@ public class ClusterPreviousFill extends PreviousFill {
     AsyncDataClient asyncDataClient;
     try {
       asyncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
     } catch (IOException e) {
       logger.warn("{}: Cannot connect to {} during previous fill", metaGroupMember, node);
       return null;
@@ -243,9 +245,9 @@ public class ClusterPreviousFill extends PreviousFill {
       Node node, PreviousFillRequest request, PreviousFillArguments arguments) {
     ByteBuffer byteBuffer = null;
     try (SyncDataClient syncDataClient =
-        metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+            .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
       try {
         byteBuffer = syncDataClient.previousFill(request);
       } catch (TException e) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
index 99dfec6..4a69231 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/groupby/RemoteGroupByExecutor.java
@@ -19,13 +19,14 @@
 
 package org.apache.iotdb.cluster.query.groupby;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.query.aggregation.AggregateResult;
 import org.apache.iotdb.db.query.dataset.groupby.GroupByExecutor;
@@ -78,17 +79,17 @@ public class RemoteGroupByExecutor implements GroupByExecutor {
     try {
       if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
         AsyncDataClient client =
-            metaGroupMember
+            ClusterIoTDB.getInstance()
                 .getClientProvider()
-                .getAsyncDataClient(source, RaftServer.getReadOperationTimeoutMS());
+                .getAsyncDataClient(source, ClusterConstant.getReadOperationTimeoutMS());
         aggrBuffers =
             SyncClientAdaptor.getGroupByResult(
                 client, header, executorId, curStartTime, curEndTime);
       } else {
         try (SyncDataClient syncDataClient =
-            metaGroupMember
+            ClusterIoTDB.getInstance()
                 .getClientProvider()
-                .getSyncDataClient(source, RaftServer.getReadOperationTimeoutMS())) {
+                .getSyncDataClient(source, ClusterConstant.getReadOperationTimeoutMS())) {
           try {
             aggrBuffers =
                 syncDataClient.getGroupByResult(header, executorId, curStartTime, curEndTime);
@@ -128,17 +129,17 @@ public class RemoteGroupByExecutor implements GroupByExecutor {
     try {
       if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
         AsyncDataClient client =
-            metaGroupMember
+            ClusterIoTDB.getInstance()
                 .getClientProvider()
-                .getAsyncDataClient(source, RaftServer.getReadOperationTimeoutMS());
+                .getAsyncDataClient(source, ClusterConstant.getReadOperationTimeoutMS());
         aggrBuffer =
             SyncClientAdaptor.peekNextNotNullValue(
                 client, header, executorId, nextStartTime, nextEndTime);
       } else {
         try (SyncDataClient syncDataClient =
-            metaGroupMember
+            ClusterIoTDB.getInstance()
                 .getClientProvider()
-                .getSyncDataClient(source, RaftServer.getReadOperationTimeoutMS())) {
+                .getSyncDataClient(source, ClusterConstant.getReadOperationTimeoutMS())) {
           try {
             aggrBuffer =
                 syncDataClient.peekNextNotNullValue(header, executorId, nextStartTime, nextEndTime);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
index b42df93..3ed7837 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/last/ClusterLastQueryExecutor.java
@@ -19,15 +19,16 @@
 
 package org.apache.iotdb.cluster.query.last;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.rpc.thrift.LastQueryRequest;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.utils.ClusterQueryUtils;
@@ -241,9 +242,9 @@ public class ClusterLastQueryExecutor extends LastQueryExecutor {
       AsyncDataClient asyncDataClient;
       try {
         asyncDataClient =
-            metaGroupMember
+            ClusterIoTDB.getInstance()
                 .getClientProvider()
-                .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+                .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       } catch (IOException e) {
         return null;
       }
@@ -261,9 +262,9 @@ public class ClusterLastQueryExecutor extends LastQueryExecutor {
     private ByteBuffer lastSync(Node node, QueryContext context) throws TException {
       ByteBuffer res;
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           res =
               syncDataClient.last(
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
index f4ed148..7dbd423 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/ClusterReaderFactory.java
@@ -19,9 +19,11 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.EmptyIntervalException;
@@ -44,7 +46,6 @@ import org.apache.iotdb.cluster.rpc.thrift.MultSeriesQueryRequest;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 import org.apache.iotdb.cluster.rpc.thrift.SingleSeriesQueryRequest;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.utils.ClusterQueryUtils;
@@ -943,15 +944,15 @@ public class ClusterReaderFactory {
     Long executorId;
     if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
       AsyncDataClient client =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+              .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
       executorId = SyncClientAdaptor.getGroupByExecutor(client, request);
     } else {
       try (SyncDataClient syncDataClient =
-          metaGroupMember
+          ClusterIoTDB.getInstance()
               .getClientProvider()
-              .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+              .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
         try {
           executorId = syncDataClient.getGroupByExecutor(request);
         } catch (TException e) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
index 685f0fe..1fc37f3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/DataSourceInfo.java
@@ -19,16 +19,17 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.query.RemoteQueryContext;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 import org.apache.iotdb.cluster.rpc.thrift.SingleSeriesQueryRequest;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -141,9 +142,9 @@ public class DataSourceInfo {
   private Long applyForReaderIdAsync(Node node, boolean byTimestamp, long timestamp)
       throws TException, InterruptedException, IOException {
     AsyncDataClient client =
-        this.metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+            .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
     Long newReaderId;
     if (byTimestamp) {
       newReaderId = SyncClientAdaptor.querySingleSeriesByTimestamp(client, request);
@@ -158,9 +159,9 @@ public class DataSourceInfo {
 
     Long newReaderId;
     try (SyncDataClient client =
-        this.metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+            .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
 
       try {
         if (byTimestamp) {
@@ -205,13 +206,15 @@ public class DataSourceInfo {
   AsyncDataClient getCurAsyncClient(int timeout) throws IOException {
     return isNoClient
         ? null
-        : metaGroupMember.getClientProvider().getAsyncDataClient(this.curSource, timeout);
+        : ClusterIoTDB.getInstance()
+            .getClientProvider()
+            .getAsyncDataClient(this.curSource, timeout);
   }
 
   SyncDataClient getCurSyncClient(int timeout) throws TException {
     return isNoClient
         ? null
-        : metaGroupMember.getClientProvider().getSyncDataClient(this.curSource, timeout);
+        : ClusterIoTDB.getInstance().getClientProvider().getSyncDataClient(this.curSource, timeout);
   }
 
   public boolean isNoData() {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
index e8b8d0e..4969982 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestamp.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.cluster.query.reader;
 
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.utils.ClientUtils;
 import org.apache.iotdb.db.query.reader.series.IReaderByTimestamp;
@@ -77,10 +77,10 @@ public class RemoteSeriesReaderByTimestamp implements IReaderByTimestamp {
       fetchResult.set(null);
       try {
         sourceInfo
-            .getCurAsyncClient(RaftServer.getReadOperationTimeoutMS())
+            .getCurAsyncClient(ClusterConstant.getReadOperationTimeoutMS())
             .fetchSingleSeriesByTimestamps(
                 sourceInfo.getHeader(), sourceInfo.getReaderId(), timestampList, handler);
-        fetchResult.wait(RaftServer.getReadOperationTimeoutMS());
+        fetchResult.wait(ClusterConstant.getReadOperationTimeoutMS());
       } catch (TException e) {
         // try other node
         if (!sourceInfo.switchNode(true, timestamps[0])) {
@@ -104,7 +104,7 @@ public class RemoteSeriesReaderByTimestamp implements IReaderByTimestamp {
       timestampList.add(timestamps[i]);
     }
     try {
-      curSyncClient = sourceInfo.getCurSyncClient(RaftServer.getReadOperationTimeoutMS());
+      curSyncClient = sourceInfo.getCurSyncClient(ClusterConstant.getReadOperationTimeoutMS());
       return curSyncClient.fetchSingleSeriesByTimestamps(
           sourceInfo.getHeader(), sourceInfo.getReaderId(), timestampList);
     } catch (TException e) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReader.java
index b85b53b..f72e73b 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReader.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.cluster.query.reader;
 
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.utils.ClientUtils;
 import org.apache.iotdb.db.utils.SerializeUtils;
@@ -125,9 +125,9 @@ public class RemoteSimpleSeriesReader implements IPointReader {
       fetchResult.set(null);
       try {
         sourceInfo
-            .getCurAsyncClient(RaftServer.getReadOperationTimeoutMS())
+            .getCurAsyncClient(ClusterConstant.getReadOperationTimeoutMS())
             .fetchSingleSeries(sourceInfo.getHeader(), sourceInfo.getReaderId(), handler);
-        fetchResult.wait(RaftServer.getReadOperationTimeoutMS());
+        fetchResult.wait(ClusterConstant.getReadOperationTimeoutMS());
       } catch (TException e) {
         // try other node
         if (!sourceInfo.switchNode(false, lastTimestamp)) {
@@ -146,7 +146,7 @@ public class RemoteSimpleSeriesReader implements IPointReader {
   private ByteBuffer fetchResultSync() throws IOException {
     SyncDataClient curSyncClient = null;
     try {
-      curSyncClient = sourceInfo.getCurSyncClient(RaftServer.getReadOperationTimeoutMS());
+      curSyncClient = sourceInfo.getCurSyncClient(ClusterConstant.getReadOperationTimeoutMS());
       return curSyncClient.fetchSingleSeries(sourceInfo.getHeader(), sourceInfo.getReaderId());
     } catch (TException e) {
       if (curSyncClient != null) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/MultDataSourceInfo.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/MultDataSourceInfo.java
index 73dee46..29450b7 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/MultDataSourceInfo.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/MultDataSourceInfo.java
@@ -19,15 +19,16 @@
 
 package org.apache.iotdb.cluster.query.reader.mult;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.query.RemoteQueryContext;
 import org.apache.iotdb.cluster.rpc.thrift.MultSeriesQueryRequest;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.metadata.PartialPath;
@@ -150,9 +151,9 @@ public class MultDataSourceInfo {
   private Long applyForReaderIdAsync(Node node, long timestamp)
       throws TException, InterruptedException, IOException {
     AsyncDataClient client =
-        this.metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getAsyncDataClient(node, RaftServer.getReadOperationTimeoutMS());
+            .getAsyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS());
     AtomicReference<Long> result = new AtomicReference<>();
     GenericHandler<Long> handler = new GenericHandler<>(client.getNode(), result);
     Filter newFilter;
@@ -167,7 +168,7 @@ public class MultDataSourceInfo {
     client.queryMultSeries(request, handler);
     synchronized (result) {
       if (result.get() == null && handler.getException() == null) {
-        result.wait(RaftServer.getReadOperationTimeoutMS());
+        result.wait(ClusterConstant.getReadOperationTimeoutMS());
       }
     }
     return result.get();
@@ -177,9 +178,9 @@ public class MultDataSourceInfo {
 
     Long newReaderId;
     try (SyncDataClient client =
-        this.metaGroupMember
+        ClusterIoTDB.getInstance()
             .getClientProvider()
-            .getSyncDataClient(node, RaftServer.getReadOperationTimeoutMS())) {
+            .getSyncDataClient(node, ClusterConstant.getReadOperationTimeoutMS())) {
 
       Filter newFilter;
       // add timestamp to as a timeFilter to skip the data which has been read
@@ -216,13 +217,15 @@ public class MultDataSourceInfo {
   AsyncDataClient getCurAsyncClient(int timeout) throws IOException {
     return isNoClient
         ? null
-        : metaGroupMember.getClientProvider().getAsyncDataClient(this.curSource, timeout);
+        : ClusterIoTDB.getInstance()
+            .getClientProvider()
+            .getAsyncDataClient(this.curSource, timeout);
   }
 
   SyncDataClient getCurSyncClient(int timeout) throws TException {
     return isNoClient
         ? null
-        : metaGroupMember.getClientProvider().getSyncDataClient(this.curSource, timeout);
+        : ClusterIoTDB.getInstance().getClientProvider().getSyncDataClient(this.curSource, timeout);
   }
 
   public boolean isNoData() {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReader.java b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReader.java
index a9bbe22..f22a731 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReader.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReader.java
@@ -20,8 +20,8 @@
 package org.apache.iotdb.cluster.query.reader.mult;
 
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.utils.SerializeUtils;
@@ -170,9 +170,9 @@ public class RemoteMultSeriesReader extends AbstractMultPointReader {
       fetchResult.set(null);
       try {
         sourceInfo
-            .getCurAsyncClient(RaftServer.getReadOperationTimeoutMS())
+            .getCurAsyncClient(ClusterConstant.getReadOperationTimeoutMS())
             .fetchMultSeries(sourceInfo.getHeader(), sourceInfo.getReaderId(), paths, handler);
-        fetchResult.wait(RaftServer.getReadOperationTimeoutMS());
+        fetchResult.wait(ClusterConstant.getReadOperationTimeoutMS());
       } catch (TException | InterruptedException e) {
         logger.error("Failed to fetch result async, connect to {}", sourceInfo, e);
         return null;
@@ -184,7 +184,7 @@ public class RemoteMultSeriesReader extends AbstractMultPointReader {
   private Map<String, ByteBuffer> fetchResultSync(List<String> paths) throws IOException {
 
     try (SyncDataClient curSyncClient =
-        sourceInfo.getCurSyncClient(RaftServer.getReadOperationTimeoutMS()); ) {
+        sourceInfo.getCurSyncClient(ClusterConstant.getReadOperationTimeoutMS()); ) {
       try {
         return curSyncClient.fetchMultSeries(
             sourceInfo.getHeader(), sourceInfo.getReaderId(), paths);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
index f1fd75a..bd26602 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
@@ -38,6 +38,7 @@ import org.apache.iotdb.db.service.TSServiceImpl;
 import org.apache.iotdb.rpc.RpcUtils;
 import org.apache.iotdb.rpc.TSStatusCode;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
+
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
index 788e83b..a4abde2 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/StoppedMemberManager.java
@@ -58,11 +58,9 @@ public class StoppedMemberManager {
 
   private Map<RaftNode, DataGroupMember> removedMemberMap = new HashMap<>();
   private DataGroupMember.Factory memberFactory;
-  private Node thisNode;
 
-  StoppedMemberManager(Factory memberFactory, Node thisNode) {
+  public StoppedMemberManager(Factory memberFactory) {
     this.memberFactory = memberFactory;
-    this.thisNode = thisNode;
     recover();
   }
 
@@ -70,9 +68,8 @@ public class StoppedMemberManager {
    * When a DataGroupMember is removed, add it here and record this removal, so in next start-up we
    * can recover it as a data source for data transfers.
    *
-   * @param header When a DataGroupMember is removed, add it here and record this removal, so in
+   * @param raftNode When a DataGroupMember is removed, add it here and record this removal, so in
    *     next start-up we can recover it as a data source for data transfers.
-   * @param raftNode
    * @param dataGroupMember
    */
   public synchronized void put(RaftNode raftNode, DataGroupMember dataGroupMember) {
@@ -150,7 +147,7 @@ public class StoppedMemberManager {
       Node node = ClusterUtils.stringToNode(split[i]);
       partitionGroup.add(node);
     }
-    DataGroupMember member = memberFactory.create(partitionGroup, thisNode);
+    DataGroupMember member = memberFactory.create(partitionGroup);
     member.setReadOnly();
     removedMemberMap.put(partitionGroup.getHeader(), member);
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatServer.java
deleted file mode 100644
index d38670f..0000000
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/DataHeartbeatServer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.cluster.server.heartbeat;
-
-import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.rpc.thrift.TSDataService.AsyncProcessor;
-import org.apache.iotdb.cluster.rpc.thrift.TSDataService.Processor;
-import org.apache.iotdb.cluster.server.DataClusterServer;
-import org.apache.iotdb.cluster.utils.ClusterUtils;
-
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.transport.TNonblockingServerSocket;
-import org.apache.thrift.transport.TServerSocket;
-import org.apache.thrift.transport.TServerTransport;
-import org.apache.thrift.transport.TTransportException;
-
-import java.net.InetSocketAddress;
-
-public class DataHeartbeatServer extends HeartbeatServer {
-
-  private DataClusterServer dataClusterServer;
-
-  /** Do not use this method for initialization */
-  private DataHeartbeatServer() {}
-
-  public DataHeartbeatServer(Node thisNode, DataClusterServer dataClusterServer) {
-    super(thisNode);
-    this.dataClusterServer = dataClusterServer;
-  }
-
-  @Override
-  TProcessor getProcessor() {
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new AsyncProcessor<>(dataClusterServer);
-    } else {
-      return new Processor<>(dataClusterServer);
-    }
-  }
-
-  @Override
-  TServerTransport getHeartbeatServerSocket() throws TTransportException {
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new TNonblockingServerSocket(
-          new InetSocketAddress(
-              config.getInternalIp(),
-              thisNode.getDataPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET),
-          getConnectionTimeoutInMS());
-    } else {
-      return new TServerSocket(
-          new InetSocketAddress(
-              config.getInternalIp(),
-              thisNode.getDataPort() + ClusterUtils.DATA_HEARTBEAT_PORT_OFFSET));
-    }
-  }
-
-  @Override
-  String getClientThreadPrefix() {
-    return "DataHeartbeatClientThread-";
-  }
-
-  @Override
-  String getServerClientName() {
-    return "DataHeartbeatServerThread-";
-  }
-}
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatServer.java
deleted file mode 100644
index 63fc2c5..0000000
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatServer.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.cluster.server.heartbeat;
-
-import org.apache.iotdb.cluster.config.ClusterConfig;
-import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.utils.ClusterUtils;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.exception.StartupException;
-import org.apache.iotdb.db.utils.CommonUtils;
-import org.apache.iotdb.rpc.RpcTransportFactory;
-
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TCompactProtocol;
-import org.apache.thrift.protocol.TProtocolFactory;
-import org.apache.thrift.server.THsHaServer;
-import org.apache.thrift.server.THsHaServer.Args;
-import org.apache.thrift.server.TServer;
-import org.apache.thrift.transport.TNonblockingServerTransport;
-import org.apache.thrift.transport.TServerTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * HeartbeatServer works as a broker (network and protocol layer) that sends and receive the
- * heartbeat requests to the proper RaftMembers to process.
- */
-public abstract class HeartbeatServer {
-
-  private static final Logger logger = LoggerFactory.getLogger(HeartbeatServer.class);
-  private static int connectionTimeoutInMS =
-      ClusterDescriptor.getInstance().getConfig().getConnectionTimeoutInMS();
-
-  ClusterConfig config = ClusterDescriptor.getInstance().getConfig();
-  /** the heartbeat socket poolServer will listen to */
-  private TServerTransport heartbeatSocket;
-
-  /** the heartbeat RPC processing server */
-  private TServer heartbeatPoolServer;
-
-  Node thisNode;
-
-  private TProtocolFactory heartbeatProtocolFactory =
-      config.isRpcThriftCompressionEnabled()
-          ? new TCompactProtocol.Factory()
-          : new TBinaryProtocol.Factory();
-
-  /** This thread pool is to run the thrift server (heartbeatPoolServer above) */
-  private ExecutorService heartbeatClientService;
-
-  HeartbeatServer() {
-    thisNode = new Node();
-    thisNode.setInternalIp(config.getInternalIp());
-    thisNode.setMetaPort(config.getInternalMetaPort());
-    thisNode.setDataPort(config.getInternalDataPort());
-    thisNode.setClientIp(IoTDBDescriptor.getInstance().getConfig().getRpcAddress());
-  }
-
-  HeartbeatServer(Node thisNode) {
-    this.thisNode = thisNode;
-  }
-
-  public static int getConnectionTimeoutInMS() {
-    return connectionTimeoutInMS;
-  }
-
-  /**
-   * Establish a thrift server with the configurations in ClusterConfig to listen to and respond to
-   * thrift RPCs. Calling the method twice does not induce side effects.
-   *
-   * @throws TTransportException
-   */
-  @SuppressWarnings("java:S1130") // thrown in override method
-  public void start() throws TTransportException, StartupException {
-    if (heartbeatPoolServer != null) {
-      return;
-    }
-
-    establishHeartbeatServer();
-  }
-
-  /**
-   * Stop the thrift server, close the socket and interrupt all in progress RPCs. Calling the method
-   * twice does not induce side effects.
-   */
-  public void stop() {
-    if (heartbeatPoolServer == null) {
-      return;
-    }
-
-    heartbeatPoolServer.stop();
-    heartbeatSocket.close();
-    heartbeatClientService.shutdownNow();
-    heartbeatSocket = null;
-    heartbeatPoolServer = null;
-  }
-
-  /**
-   * An AsyncProcessor that contains the extended interfaces of a non-abstract subclass of
-   * RaftService (DataHeartbeatService or MetaHeartbeatService).
-   *
-   * @return the TProcessor
-   */
-  abstract TProcessor getProcessor();
-
-  /**
-   * A socket that will be used to establish a thrift server to listen to RPC heartbeat requests.
-   * DataHeartServer and MetaHeartServer use different port, so this is to be determined.
-   *
-   * @return TServerTransport
-   * @throws TTransportException
-   */
-  abstract TServerTransport getHeartbeatServerSocket() throws TTransportException;
-
-  /**
-   * Each thrift RPC request will be processed in a separate thread and this will return the name
-   * prefix of such threads. This is used to fast distinguish DataHeartbeatServer and
-   * MetaHeartbeatServer in the logs for the sake of debug.
-   *
-   * @return name prefix of RPC processing threads.
-   */
-  abstract String getClientThreadPrefix();
-
-  /**
-   * The thrift server will be run in a separate thread, and this will be its name. It help you
-   * locate the desired logs quickly when debugging.
-   *
-   * @return The name of the thread running the thrift server.
-   */
-  abstract String getServerClientName();
-
-  private TServer getSyncHeartbeatServer() throws TTransportException {
-    heartbeatSocket = getHeartbeatServerSocket();
-    return ClusterUtils.createTThreadPoolServer(
-        heartbeatSocket, getClientThreadPrefix(), getProcessor(), heartbeatProtocolFactory);
-  }
-
-  private TServer getAsyncHeartbeatServer() throws TTransportException {
-    heartbeatSocket = getHeartbeatServerSocket();
-    int maxConcurrentClientNum =
-        Math.max(CommonUtils.getCpuCores(), config.getMaxConcurrentClientNum());
-    Args poolArgs =
-        new Args((TNonblockingServerTransport) heartbeatSocket)
-            .maxWorkerThreads(maxConcurrentClientNum)
-            .minWorkerThreads(CommonUtils.getCpuCores());
-
-    poolArgs.executorService(
-        new ThreadPoolExecutor(
-            poolArgs.minWorkerThreads,
-            poolArgs.maxWorkerThreads,
-            poolArgs.getStopTimeoutVal(),
-            poolArgs.getStopTimeoutUnit(),
-            new SynchronousQueue<>(),
-            new ThreadFactory() {
-              private AtomicLong threadIndex = new AtomicLong(0);
-
-              @Override
-              public Thread newThread(Runnable r) {
-                return new Thread(r, getClientThreadPrefix() + threadIndex.incrementAndGet());
-              }
-            }));
-    poolArgs.processor(getProcessor());
-    poolArgs.protocolFactory(heartbeatProtocolFactory);
-    // async service requires FramedTransport
-    poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
-
-    return new THsHaServer(poolArgs);
-  }
-
-  private void establishHeartbeatServer() throws TTransportException {
-    logger.info("Cluster node's heartbeat {} begins to set up", thisNode);
-
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      heartbeatPoolServer = getAsyncHeartbeatServer();
-    } else {
-      heartbeatPoolServer = getSyncHeartbeatServer();
-    }
-
-    heartbeatClientService =
-        Executors.newSingleThreadExecutor(r -> new Thread(r, getServerClientName()));
-    heartbeatClientService.submit(() -> heartbeatPoolServer.serve());
-
-    logger.info("[{}] Cluster node's heartbeat {} is up", getServerClientName(), thisNode);
-  }
-}
diff --git 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
index 98b0fa7..bef24c7 100644
--- 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
@@ -28,7 +28,6 @@ import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 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;
@@ -86,7 +85,7 @@ public class HeartbeatThread implements Runnable {
             // send heartbeats to the followers
             sendHeartbeats();
             synchronized (localMember.getHeartBeatWaitObject()) {
-              localMember.getHeartBeatWaitObject().wait(RaftServer.getHeartBeatIntervalMs());
+              localMember.getHeartBeatWaitObject().wait(ClusterConstant.getHeartBeatIntervalMs());
             }
             hasHadLeader = true;
             break;
@@ -94,7 +93,7 @@ public class HeartbeatThread implements Runnable {
             // check if heartbeat times out
             long heartBeatInterval =
                 System.currentTimeMillis() - localMember.getLastHeartbeatReceivedTime();
-            if (heartBeatInterval >= RaftServer.getConnectionTimeoutInMS()) {
+            if (heartBeatInterval >= ClusterConstant.getConnectionTimeoutInMS()) {
               // the leader is considered dead, an election will be started in the next loop
               logger.info("{}: The leader {} timed out", memberName, localMember.getLeader());
               localMember.setCharacter(NodeCharacter.ELECTOR);
@@ -105,7 +104,9 @@ public class HeartbeatThread implements Runnable {
                   memberName,
                   localMember.getLeader());
               synchronized (localMember.getHeartBeatWaitObject()) {
-                localMember.getHeartBeatWaitObject().wait(RaftServer.getConnectionTimeoutInMS());
+                localMember
+                    .getHeartBeatWaitObject()
+                    .wait(ClusterConstant.getConnectionTimeoutInMS());
               }
             }
             hasHadLeader = true;
@@ -321,8 +322,8 @@ public class HeartbeatThread implements Runnable {
         logger.info(
             "{}: Wait for {}ms until election time out",
             memberName,
-            RaftServer.getConnectionTimeoutInMS());
-        localMember.getTerm().wait(RaftServer.getConnectionTimeoutInMS());
+            ClusterConstant.getConnectionTimeoutInMS());
+        localMember.getTerm().wait(ClusterConstant.getConnectionTimeoutInMS());
       } catch (InterruptedException e) {
         logger.info(
             "{}: Unexpected interruption when waiting the result of election {}",
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
deleted file mode 100644
index 348cda0..0000000
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.iotdb.cluster.server.heartbeat;
-
-import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncProcessor;
-import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Processor;
-import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
-import org.apache.iotdb.cluster.utils.ClusterUtils;
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.transport.TNonblockingServerSocket;
-import org.apache.thrift.transport.TServerSocket;
-import org.apache.thrift.transport.TServerTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetSocketAddress;
-
-public class MetaHeartbeatServer extends HeartbeatServer {
-  private static Logger logger = LoggerFactory.getLogger(MetaHeartbeatServer.class);
-
-  private RaftTSMetaServiceImpl RaftTSMetaServiceImpl;
-
-  /** Do not use this method for initialization */
-  private MetaHeartbeatServer() {}
-
-  public MetaHeartbeatServer(Node thisNode, RaftTSMetaServiceImpl RaftTSMetaServiceImpl) {
-    super(thisNode);
-    this.RaftTSMetaServiceImpl = RaftTSMetaServiceImpl;
-  }
-
-  @Override
-  TProcessor getProcessor() {
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new AsyncProcessor<>(RaftTSMetaServiceImpl);
-    } else {
-      return new Processor<>(RaftTSMetaServiceImpl);
-    }
-  }
-
-  @Override
-  TServerTransport getHeartbeatServerSocket() throws TTransportException {
-    logger.info(
-        "[{}] Cluster node will listen {}:{}",
-        getServerClientName(),
-        config.getInternalIp(),
-        config.getInternalMetaPort() + ClusterUtils.META_HEARTBEAT_PORT_OFFSET);
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new TNonblockingServerSocket(
-          new InetSocketAddress(
-              config.getInternalIp(),
-              config.getInternalMetaPort() + ClusterUtils.META_HEARTBEAT_PORT_OFFSET),
-          getConnectionTimeoutInMS());
-    } else {
-      return new TServerSocket(
-          new InetSocketAddress(
-              config.getInternalIp(),
-              config.getInternalMetaPort() + ClusterUtils.META_HEARTBEAT_PORT_OFFSET));
-    }
-  }
-
-  @Override
-  String getClientThreadPrefix() {
-    return "MetaHeartbeatClientThread-";
-  }
-
-  @Override
-  String getServerClientName() {
-    return "MetaHeartbeatServerThread-";
-  }
-}
diff --git 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
index 4b46e97..6f12dfa 100644
--- 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
@@ -172,11 +172,7 @@ public class DataGroupMember extends RaftMember {
     lastAppliedPartitionTableVersion = new LastAppliedPatitionTableVersion(getMemberDir());
   }
 
-  DataGroupMember(
-      TProtocolFactory factory,
-      PartitionGroup nodes,
-      Node thisNode,
-      MetaGroupMember metaGroupMember) {
+  DataGroupMember(TProtocolFactory factory, PartitionGroup nodes, MetaGroupMember metaGroupMember) {
     super(
         "Data("
             + nodes.getHeader().getNode().getInternalIp()
@@ -190,7 +186,6 @@ public class DataGroupMember extends RaftMember {
         new AsyncClientPool(new AsyncDataHeartbeatClient.FactoryAsync(factory)),
         new SyncClientPool(new SyncDataHeartbeatClient.FactorySync(factory)),
         new AsyncClientPool(new SingleManagerFactory(factory)));
-    this.thisNode = thisNode;
     this.metaGroupMember = metaGroupMember;
     allNodes = nodes;
     setQueryManager(new ClusterQueryManager());
@@ -293,13 +288,13 @@ public class DataGroupMember extends RaftMember {
     private TProtocolFactory protocolFactory;
     private MetaGroupMember metaGroupMember;
 
-    Factory(TProtocolFactory protocolFactory, MetaGroupMember metaGroupMember) {
+    public Factory(TProtocolFactory protocolFactory, MetaGroupMember metaGroupMember) {
       this.protocolFactory = protocolFactory;
       this.metaGroupMember = metaGroupMember;
     }
 
-    public DataGroupMember create(PartitionGroup partitionGroup, Node thisNode) {
-      return new DataGroupMember(protocolFactory, partitionGroup, thisNode, metaGroupMember);
+    public DataGroupMember create(PartitionGroup partitionGroup) {
+      return new DataGroupMember(protocolFactory, partitionGroup, metaGroupMember);
     }
   }
 
diff --git 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
index 62ce37e..7b66e4d 100644
--- 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
@@ -19,7 +19,7 @@
 
 package org.apache.iotdb.cluster.server.member;
 
-import org.apache.iotdb.cluster.client.DataClientProvider;
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncClientPool;
 import org.apache.iotdb.cluster.client.async.AsyncMetaClient;
 import org.apache.iotdb.cluster.client.async.AsyncMetaHeartbeatClient;
@@ -59,25 +59,20 @@ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatRequest;
 import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
 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.Client;
 import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
 import org.apache.iotdb.cluster.rpc.thrift.StartUpStatus;
 import org.apache.iotdb.cluster.rpc.thrift.TSMetaService;
 import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncClient;
-import org.apache.iotdb.cluster.server.DataClusterServer;
-import org.apache.iotdb.cluster.server.HardLinkCleaner;
 import org.apache.iotdb.cluster.server.NodeCharacter;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.server.handlers.caller.NodeStatusHandler;
-import org.apache.iotdb.cluster.server.heartbeat.DataHeartbeatServer;
 import org.apache.iotdb.cluster.server.heartbeat.MetaHeartbeatThread;
 import org.apache.iotdb.cluster.server.member.DataGroupMember.Factory;
-import org.apache.iotdb.cluster.server.monitor.NodeReport;
 import org.apache.iotdb.cluster.server.monitor.NodeReport.MetaMemberReport;
 import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
 import org.apache.iotdb.cluster.server.monitor.Timer;
+import org.apache.iotdb.cluster.server.service.DataGroupServiceImpls;
 import org.apache.iotdb.cluster.utils.ClientUtils;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.cluster.utils.PartitionUtils;
@@ -89,7 +84,6 @@ import org.apache.iotdb.db.exception.ShutdownException;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
-import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.PartialPath;
 import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 import org.apache.iotdb.db.service.IService;
@@ -101,6 +95,7 @@ import org.apache.iotdb.db.utils.TimeValuePairUtils.Intervals;
 import org.apache.iotdb.service.rpc.thrift.EndPoint;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TTransportException;
@@ -133,14 +128,11 @@ import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.apache.iotdb.cluster.config.ClusterConstant.THREAD_POLL_WAIT_TERMINATION_TIME_S;
 import static org.apache.iotdb.cluster.utils.ClusterUtils.WAIT_START_UP_CHECK_TIME_SEC;
 import static org.apache.iotdb.cluster.utils.ClusterUtils.analyseStartUpCheckResult;
 
@@ -168,18 +160,6 @@ public class MetaGroupMember extends RaftMember implements IService {
   private static final int DEFAULT_JOIN_RETRY = 10;
 
   /**
-   * every "REPORT_INTERVAL_SEC" seconds, a reporter thread will print the status of all raft
-   * members in this node
-   */
-  private static final int REPORT_INTERVAL_SEC = 10;
-
-  /**
-   * during snapshot, hardlinks of data files are created to for downloading. hardlinks will be
-   * checked every hour by default to see if they have expired, and will be cleaned if so.
-   */
-  private static final long CLEAN_HARDLINK_INTERVAL_SEC = 3600;
-
-  /**
    * blind nodes are nodes that do not have the partition table, and if this node is the leader, the
    * partition table should be sent to them at the next heartbeat
    */
@@ -200,22 +180,13 @@ public class MetaGroupMember extends RaftMember implements IService {
   private PartitionTable partitionTable;
   /** router calculates the partition groups that a partitioned plan should be sent to */
   private ClusterPlanRouter router;
-  /**
-   * each node contains multiple DataGroupMembers and they are managed by a DataClusterServer acting
-   * as a broker
-   */
-  private DataClusterServer dataClusterServer;
-
-  /** each node starts a data heartbeat server to transfer heartbeat requests */
-  private DataHeartbeatServer dataHeartbeatServer;
 
-  private DataClientProvider dataClientProvider;
-
-  /**
-   * a single thread pool, every "REPORT_INTERVAL_SEC" seconds, "reportThread" will print the status
-   * of all raft members in this node
-   */
-  private ScheduledExecutorService reportThread;
+  //  /**
+  //   * a single thread pool, every "REPORT_INTERVAL_SEC" seconds, "reportThread" will print the
+  // status
+  //   * of all raft members in this node
+  //   */
+  //  private ScheduledExecutorService reportThread;
 
   /**
    * containing configurations that should be kept the same cluster-wide, and must be checked before
@@ -223,8 +194,8 @@ public class MetaGroupMember extends RaftMember implements IService {
    */
   private StartUpStatus startUpStatus;
 
-  /** hardLinkCleaner will periodically clean expired hardlinks created during snapshots */
-  private ScheduledExecutorService hardLinkCleanerThread;
+  //  /** hardLinkCleaner will periodically clean expired hardlinks created during snapshots */
+  //  private ScheduledExecutorService hardLinkCleanerThread;
 
   private Coordinator coordinator;
 
@@ -243,8 +214,7 @@ public class MetaGroupMember extends RaftMember implements IService {
   @TestOnly
   public MetaGroupMember() {}
 
-  public MetaGroupMember(TProtocolFactory factory, Node thisNode, Coordinator coordinator)
-      throws QueryProcessException {
+  public MetaGroupMember(TProtocolFactory factory, Node thisNode, Coordinator coordinator) {
     super(
         "Meta",
         new AsyncClientPool(new AsyncMetaClient.FactoryAsync(factory)),
@@ -254,8 +224,6 @@ public class MetaGroupMember extends RaftMember implements IService {
     allNodes = new PartitionGroup();
     initPeerMap();
 
-    dataClientProvider = new DataClientProvider(factory);
-
     // committed logs are applied to the state machine (the IoTDB instance) through the applier
     LogApplier metaLogApplier = new MetaLogApplier(this);
     logManager = new MetaSingleSnapshotLogManager(metaLogApplier, this);
@@ -268,8 +236,7 @@ public class MetaGroupMember extends RaftMember implements IService {
     allNodes.add(thisNode);
 
     Factory dataMemberFactory = new Factory(factory, this);
-    dataClusterServer = new DataClusterServer(thisNode, dataMemberFactory, this);
-    dataHeartbeatServer = new DataHeartbeatServer(thisNode, dataClusterServer);
+
     startUpStatus = getNewStartUpStatus();
 
     // try loading the partition table if there was a previous cluster
@@ -293,12 +260,8 @@ public class MetaGroupMember extends RaftMember implements IService {
     return localDataMember.closePartition(storageGroupName, partitionId, isSeq);
   }
 
-  public DataClusterServer getDataClusterServer() {
-    return dataClusterServer;
-  }
-
-  public DataHeartbeatServer getDataHeartbeatServer() {
-    return dataHeartbeatServer;
+  DataGroupServiceImpls getDataGroupEngine() {
+    return ClusterIoTDB.getInstance().getDataGroupEngine();
   }
 
   /**
@@ -319,10 +282,6 @@ public class MetaGroupMember extends RaftMember implements IService {
   @Override
   void startBackGroundThreads() {
     super.startBackGroundThreads();
-    reportThread =
-        Executors.newSingleThreadScheduledExecutor(n -> new Thread(n, "NodeReportThread"));
-    hardLinkCleanerThread =
-        Executors.newSingleThreadScheduledExecutor(n -> new Thread(n, "HardLinkCleaner"));
   }
 
   /**
@@ -332,31 +291,6 @@ public class MetaGroupMember extends RaftMember implements IService {
   @Override
   public void stop() {
     super.stop();
-    if (getDataClusterServer() != null) {
-      getDataClusterServer().stop();
-    }
-    if (getDataHeartbeatServer() != null) {
-      getDataHeartbeatServer().stop();
-    }
-    if (reportThread != null) {
-      reportThread.shutdownNow();
-      try {
-        reportThread.awaitTermination(THREAD_POLL_WAIT_TERMINATION_TIME_S, TimeUnit.SECONDS);
-      } catch (InterruptedException e) {
-        Thread.currentThread().interrupt();
-        logger.error("Unexpected interruption when waiting for reportThread to end", e);
-      }
-    }
-    if (hardLinkCleanerThread != null) {
-      hardLinkCleanerThread.shutdownNow();
-      try {
-        hardLinkCleanerThread.awaitTermination(
-            THREAD_POLL_WAIT_TERMINATION_TIME_S, TimeUnit.SECONDS);
-      } catch (InterruptedException e) {
-        Thread.currentThread().interrupt();
-        logger.error("Unexpected interruption when waiting for hardlinkCleaner to end", e);
-      }
-    }
     logger.info("{}: stopped", name);
   }
 
@@ -380,8 +314,8 @@ public class MetaGroupMember extends RaftMember implements IService {
    * nodes and clients.
    */
   protected void initSubServers() throws TTransportException, StartupException {
-    getDataClusterServer().start();
-    getDataHeartbeatServer().start();
+    //    getDataClusterServer().start();
+    //    getDataHeartbeatServer().start();
     // TODO FIXME
   }
 
@@ -432,7 +366,7 @@ public class MetaGroupMember extends RaftMember implements IService {
 
       // update local data members
       NodeAdditionResult result = partitionTable.getNodeAdditionResult(newNode);
-      getDataClusterServer().addNode(newNode, result);
+      getDataGroupEngine().addNode(newNode, result);
       if (logger.isDebugEnabled()) {
         logger.debug("{}: success to add a new node {} into {}", name, newNode, allNodes);
       }
@@ -469,24 +403,6 @@ public class MetaGroupMember extends RaftMember implements IService {
 
   private void threadTaskInit() {
     heartBeatService.submit(new MetaHeartbeatThread(this));
-    reportThread.scheduleAtFixedRate(
-        this::generateNodeReport, REPORT_INTERVAL_SEC, REPORT_INTERVAL_SEC, TimeUnit.SECONDS);
-    hardLinkCleanerThread.scheduleAtFixedRate(
-        new HardLinkCleaner(),
-        CLEAN_HARDLINK_INTERVAL_SEC,
-        CLEAN_HARDLINK_INTERVAL_SEC,
-        TimeUnit.SECONDS);
-  }
-
-  private void generateNodeReport() {
-    try {
-      if (logger.isDebugEnabled()) {
-        NodeReport report = genNodeReport();
-        logger.debug(report.toString());
-      }
-    } catch (Exception e) {
-      logger.error("{} exception occurred when generating node report", name, e);
-    }
   }
 
   /**
@@ -587,7 +503,7 @@ public class MetaGroupMember extends RaftMember implements IService {
       logger.info("Node {} admitted this node into the cluster", node);
       ByteBuffer partitionTableBuffer = resp.partitionTableBytes;
       acceptPartitionTable(partitionTableBuffer, true);
-      getDataClusterServer().pullSnapshots();
+      getDataGroupEngine().pullSnapshots();
       return true;
     } else if (resp.getRespNum() == Response.RESPONSE_IDENTIFIER_CONFLICT) {
       logger.info(
@@ -810,7 +726,7 @@ public class MetaGroupMember extends RaftMember implements IService {
     logger.info("Starting sub-servers...");
     synchronized (partitionTable) {
       try {
-        getDataClusterServer().buildDataGroupMembers(partitionTable);
+        getDataGroupEngine().buildDataGroupMembers(partitionTable);
         initSubServers();
         sendHandshake();
       } catch (TTransportException | StartupException e) {
@@ -1164,6 +1080,14 @@ public class MetaGroupMember extends RaftMember implements IService {
     }
   }
 
+  // TODO rewrite this method.
+
+  /**
+   * check whether the nodes having consistent setting.
+   *
+   * @param consistentNum
+   * @param inconsistentNum
+   */
   private void checkSeedNodesStatusOnce(
       AtomicInteger consistentNum, AtomicInteger inconsistentNum) {
     // use a thread pool to avoid being blocked by an unavailable node
@@ -1445,33 +1369,33 @@ public class MetaGroupMember extends RaftMember implements IService {
     return result;
   }
 
-  /**
-   * Forward a non-query plan to the data port of "receiver"
-   *
-   * @param plan a non-query plan
-   * @param header to determine which DataGroupMember of "receiver" will process the request.
-   * @return a TSStatus indicating if the forwarding is successful.
-   */
-  private TSStatus forwardDataPlanAsync(PhysicalPlan plan, Node receiver, RaftNode header)
-      throws IOException {
-    RaftService.AsyncClient client =
-        getClientProvider()
-            .getAsyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
-    return forwardPlanAsync(plan, receiver, header, client);
-  }
-
-  private TSStatus forwardDataPlanSync(PhysicalPlan plan, Node receiver, RaftNode header)
-      throws IOException {
-    Client client;
-    try {
-      client =
-          getClientProvider()
-              .getSyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
-    } catch (TException e) {
-      throw new IOException(e);
-    }
-    return forwardPlanSync(plan, receiver, header, client);
-  }
+  //  /**
+  //   * Forward a non-query plan to the data port of "receiver"
+  //   *
+  //   * @param plan a non-query plan
+  //   * @param header to determine which DataGroupMember of "receiver" will process the request.
+  //   * @return a TSStatus indicating if the forwarding is successful.
+  //   */
+  //  private TSStatus forwardDataPlanAsync(PhysicalPlan plan, Node receiver, RaftNode header)
+  //      throws IOException {
+  //    RaftService.AsyncClient client =
+  //        getClientProvider()
+  //            .getAsyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
+  //    return forwardPlanAsync(plan, receiver, header, client);
+  //  }
+  //
+  //  private TSStatus forwardDataPlanSync(PhysicalPlan plan, Node receiver, RaftNode header)
+  //      throws IOException {
+  //    Client client;
+  //    try {
+  //      client =
+  //          getClientProvider()
+  //              .getSyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
+  //    } catch (TException e) {
+  //      throw new IOException(e);
+  //    }
+  //    return forwardPlanSync(plan, receiver, header, client);
+  //  }
 
   /**
    * Get the data groups that should be queried when querying "path" with "filter". First, the time
@@ -1654,7 +1578,7 @@ public class MetaGroupMember extends RaftMember implements IService {
     this.partitionTable = partitionTable;
     router = new ClusterPlanRouter(partitionTable);
     this.coordinator.setRouter(router);
-    DataClusterServer dClusterServer = getDataClusterServer();
+    DataGroupServiceImpls dClusterServer = getDataGroupEngine();
     if (dClusterServer != null) {
       dClusterServer.setPartitionTable(partitionTable);
     }
@@ -1794,7 +1718,7 @@ public class MetaGroupMember extends RaftMember implements IService {
       // update DataGroupMembers, as the node is removed, the members of some groups are
       // changed and there will also be one less group
       NodeRemovalResult result = partitionTable.getNodeRemovalResult();
-      getDataClusterServer().removeNode(oldNode, result);
+      getDataGroupEngine().removeNode(oldNode, result);
 
       // the leader is removed, start the next election ASAP
       if (oldNode.equals(leader.get()) && !oldNode.equals(thisNode)) {
@@ -1813,7 +1737,7 @@ public class MetaGroupMember extends RaftMember implements IService {
         new Thread(
                 () -> {
                   try {
-                    Thread.sleep(RaftServer.getHeartBeatIntervalMs());
+                    Thread.sleep(ClusterConstant.getHeartBeatIntervalMs());
                   } catch (InterruptedException e) {
                     Thread.currentThread().interrupt();
                     // ignore
@@ -1876,7 +1800,7 @@ public class MetaGroupMember extends RaftMember implements IService {
    * Generate a report containing the character, leader, term, last log and read-only-status. This
    * will help to see if the node is in a consistent and right state during debugging.
    */
-  private MetaMemberReport genMemberReport() {
+  public MetaMemberReport genMemberReport() {
     long prevLastLogIndex = lastReportedLogIndex;
     lastReportedLogIndex = logManager.getLastLogIndex();
     return new MetaMemberReport(
@@ -1894,17 +1818,6 @@ public class MetaGroupMember extends RaftMember implements IService {
   }
 
   /**
-   * Generate a report containing the status of both MetaGroupMember and DataGroupMembers of this
-   * node. This will help to see if the node is in a consistent and right state during debugging.
-   */
-  private NodeReport genNodeReport() {
-    NodeReport report = new NodeReport(thisNode);
-    report.setMetaMemberReport(genMemberReport());
-    report.setDataMemberReportList(dataClusterServer.genMemberReports());
-    return report;
-  }
-
-  /**
    * Collect data migration status of data group in all cluster nodes.
    *
    * @return key: data group; value: slot num in data migration
@@ -1944,7 +1857,7 @@ public class MetaGroupMember extends RaftMember implements IService {
     if (getPartitionTable() == null) {
       return groupSlotMap;
     }
-    Map<RaftNode, DataGroupMember> headerMap = getDataClusterServer().getHeaderGroupMap();
+    Map<RaftNode, DataGroupMember> headerMap = getDataGroupEngine().getHeaderGroupMap();
     syncLocalApply(getPartitionTable().getLastMetaLogIndex(), false);
     synchronized (headerMap) {
       for (DataGroupMember dataMember : headerMap.values()) {
@@ -1975,7 +1888,7 @@ public class MetaGroupMember extends RaftMember implements IService {
    *     only used in logs for tracing
    */
   public DataGroupMember getLocalDataMember(RaftNode header, Object request) {
-    return dataClusterServer.getDataMember(header, null, request);
+    return getDataGroupEngine().getDataMember(header, null, request);
   }
 
   /**
@@ -1984,18 +1897,14 @@ public class MetaGroupMember extends RaftMember implements IService {
    * @param raftNode the header of the group which the local node is in
    */
   public DataGroupMember getLocalDataMember(RaftNode raftNode) {
-    return dataClusterServer.getDataMember(raftNode, null, "Internal call");
-  }
-
-  public DataClientProvider getClientProvider() {
-    return dataClientProvider;
+    return getDataGroupEngine().getDataMember(raftNode, null, "Internal call");
   }
 
   @Override
   public void closeLogManager() {
     super.closeLogManager();
-    if (dataClusterServer != null) {
-      dataClusterServer.closeLogManagers();
+    if (getDataGroupEngine() != null) {
+      getDataGroupEngine().closeLogManagers();
     }
   }
 
@@ -2003,11 +1912,6 @@ public class MetaGroupMember extends RaftMember implements IService {
     return startUpStatus;
   }
 
-  @TestOnly
-  public void setClientProvider(DataClientProvider dataClientProvider) {
-    this.dataClientProvider = dataClientProvider;
-  }
-
   public void setRouter(ClusterPlanRouter router) {
     this.router = router;
   }
diff --git 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
index a5a58b0..17eab2c 100644
--- 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
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.server.member;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.async.AsyncClientPool;
 import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
 import org.apache.iotdb.cluster.client.sync.SyncClientPool;
@@ -51,7 +52,6 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
 import org.apache.iotdb.cluster.rpc.thrift.RequestCommitIndexResponse;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 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;
@@ -142,7 +142,7 @@ public abstract class RaftMember {
 
   private final Object heartBeatWaitObject = new Object();
 
-  protected Node thisNode = ClusterConstant.EMPTY_NODE;
+  protected Node thisNode = ClusterIoTDB.getInstance().getThisNode();
 
   /** the nodes that belong to the same raft group as thisNode. */
   protected PartitionGroup allNodes;
@@ -963,7 +963,7 @@ public abstract class RaftMember {
       }
     }
 
-    while (waitedTime < RaftServer.getSyncLeaderMaxWaitMs()) {
+    while (waitedTime < ClusterConstant.getSyncLeaderMaxWaitMs()) {
       try {
         localAppliedId = logManager.getMaxHaveAppliedCommitIndex();
         logger.debug("{}: synchronizing commitIndex {}/{}", name, localAppliedId, leaderCommitId);
@@ -981,7 +981,7 @@ public abstract class RaftMember {
         // the node may have some inconsistent logs with the leader
         waitedTime = System.currentTimeMillis() - startTime;
         synchronized (syncLock) {
-          syncLock.wait(RaftServer.getHeartBeatIntervalMs());
+          syncLock.wait(ClusterConstant.getHeartBeatIntervalMs());
         }
       } catch (InterruptedException e) {
         Thread.currentThread().interrupt();
@@ -1159,7 +1159,7 @@ public abstract class RaftMember {
     }
     synchronized (commitIdResult) {
       client.requestCommitIndex(getHeader(), new GenericHandler<>(leader.get(), commitIdResult));
-      commitIdResult.wait(RaftServer.getReadOperationTimeoutMS());
+      commitIdResult.wait(ClusterConstant.getReadOperationTimeoutMS());
     }
     return commitIdResult.get();
   }
@@ -1489,10 +1489,10 @@ public abstract class RaftMember {
       long waitStart = System.currentTimeMillis();
       long alreadyWait = 0;
       while (voteCounter.get() > 0
-          && alreadyWait < RaftServer.getWriteOperationTimeoutMS()
+          && alreadyWait < ClusterConstant.getWriteOperationTimeoutMS()
           && voteCounter.get() != Integer.MAX_VALUE) {
         try {
-          voteCounter.wait(RaftServer.getWriteOperationTimeoutMS());
+          voteCounter.wait(ClusterConstant.getWriteOperationTimeoutMS());
         } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
           logger.warn("Unexpected interruption when sending a log", e);
@@ -1839,10 +1839,10 @@ public abstract class RaftMember {
     // many client threads in the peer
     while (peer.getMatchIndex() < log.getCurrLogIndex() - maxLogDiff
         && character == NodeCharacter.LEADER
-        && alreadyWait <= RaftServer.getWriteOperationTimeoutMS()) {
+        && alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS()) {
       synchronized (peer) {
         try {
-          peer.wait(RaftServer.getWriteOperationTimeoutMS());
+          peer.wait(ClusterConstant.getWriteOperationTimeoutMS());
         } catch (InterruptedException e) {
           Thread.currentThread().interrupt();
           logger.warn("Waiting for peer to catch up interrupted");
@@ -1851,7 +1851,7 @@ public abstract class RaftMember {
       }
       alreadyWait = System.currentTimeMillis() - waitStart;
     }
-    return alreadyWait <= RaftServer.getWriteOperationTimeoutMS();
+    return alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS();
   }
 
   private void sendLogSync(
@@ -1943,7 +1943,8 @@ public abstract class RaftMember {
     long alreadyWait = 0;
     Object logUpdateCondition = logManager.getLogUpdateCondition(prevLogIndex);
     long lastLogIndex = logManager.getLastLogIndex();
-    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) {
@@ -1960,7 +1961,7 @@ public abstract class RaftMember {
       alreadyWait = System.currentTimeMillis() - waitStart;
     }
 
-    return alreadyWait <= RaftServer.getWriteOperationTimeoutMS();
+    return alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS();
   }
 
   private long checkPrevLogIndex(long prevLogIndex) {
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/DataClusterServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
similarity index 91%
rename from cluster/src/main/java/org/apache/iotdb/cluster/server/DataClusterServer.java
rename to cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
index e6be01a..ee440b3 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/DataClusterServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
@@ -17,8 +17,9 @@
  * under the License.
  */
 
-package org.apache.iotdb.cluster.server;
+package org.apache.iotdb.cluster.server.service;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
 import org.apache.iotdb.cluster.exception.NoHeaderNodeException;
@@ -31,51 +32,25 @@ import org.apache.iotdb.cluster.partition.NodeRemovalResult;
 import org.apache.iotdb.cluster.partition.PartitionGroup;
 import org.apache.iotdb.cluster.partition.PartitionTable;
 import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
-import org.apache.iotdb.cluster.rpc.thrift.AppendEntriesRequest;
-import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
-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.rpc.thrift.TSDataService.AsyncProcessor;
-import org.apache.iotdb.cluster.rpc.thrift.TSDataService.Processor;
+import org.apache.iotdb.cluster.rpc.thrift.*;
+import org.apache.iotdb.cluster.server.NodeCharacter;
+import org.apache.iotdb.cluster.server.StoppedMemberManager;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.server.monitor.NodeReport.DataMemberReport;
-import org.apache.iotdb.cluster.server.service.DataAsyncService;
-import org.apache.iotdb.cluster.server.service.DataSyncService;
 import org.apache.iotdb.cluster.utils.IOUtils;
+import org.apache.iotdb.db.utils.TestOnly;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 
 import org.apache.thrift.TException;
-import org.apache.thrift.TProcessor;
 import org.apache.thrift.async.AsyncMethodCallback;
-import org.apache.thrift.transport.TNonblockingServerSocket;
-import org.apache.thrift.transport.TServerSocket;
-import org.apache.thrift.transport.TServerTransport;
+import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.File;
 import java.io.IOException;
-import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.util.ArrayList;
@@ -86,10 +61,9 @@ import java.util.Map.Entry;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-public class DataClusterServer extends RaftServer
-    implements TSDataService.AsyncIface, TSDataService.Iface {
+public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataService.Iface {
 
-  private static final Logger logger = LoggerFactory.getLogger(DataClusterServer.class);
+  private static final Logger logger = LoggerFactory.getLogger(DataGroupServiceImpls.class);
 
   // key: the header of a data group, value: the member representing this node in this group and
   // it is currently at service
@@ -104,21 +78,28 @@ public class DataClusterServer extends RaftServer
   private DataGroupMember.Factory dataMemberFactory;
   private MetaGroupMember metaGroupMember;
 
-  public DataClusterServer(
-      Node thisNode, DataGroupMember.Factory dataMemberFactory, MetaGroupMember metaGroupMember) {
-    super(thisNode);
-    this.dataMemberFactory = dataMemberFactory;
+  private Node thisNode = ClusterIoTDB.getInstance().getThisNode();
+
+  public DataGroupServiceImpls(TProtocolFactory protocolFactory, MetaGroupMember metaGroupMember) {
+    dataMemberFactory = new DataGroupMember.Factory(protocolFactory, metaGroupMember);
     this.metaGroupMember = metaGroupMember;
-    this.stoppedMemberManager = new StoppedMemberManager(dataMemberFactory, thisNode);
+    stoppedMemberManager = new StoppedMemberManager(dataMemberFactory);
   }
 
-  @Override
+  @TestOnly
+  public DataGroupServiceImpls(
+      DataGroupMember.Factory dataMemberFactory, MetaGroupMember metaGroupMember) {
+    this.metaGroupMember = metaGroupMember;
+    this.stoppedMemberManager = new StoppedMemberManager(dataMemberFactory);
+  }
+
+  //  @Override
+  // TODO
   public void stop() {
     closeLogManagers();
     for (DataGroupMember member : headerGroupMap.values()) {
       member.stop();
     }
-    super.stop();
   }
 
   /**
@@ -235,7 +216,7 @@ public class DataClusterServer extends RaftServer
       }
       if (partitionGroup != null && partitionGroup.contains(thisNode)) {
         // the two nodes are in the same group, create a new data member
-        member = dataMemberFactory.create(partitionGroup, thisNode);
+        member = dataMemberFactory.create(partitionGroup);
         headerGroupMap.put(header, member);
         stoppedMemberManager.remove(header);
         logger.info("Created a member for header {}, group is {}", header, partitionGroup);
@@ -559,42 +540,6 @@ public class DataClusterServer extends RaftServer
     }
   }
 
-  @Override
-  TProcessor getProcessor() {
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new AsyncProcessor<>(this);
-    } else {
-      return new Processor<>(this);
-    }
-  }
-
-  @Override
-  TServerTransport getServerSocket() throws TTransportException {
-    logger.info(
-        "[{}] Cluster node will listen {}:{}",
-        getServerClientName(),
-        config.getInternalIp(),
-        config.getInternalDataPort());
-    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
-      return new TNonblockingServerSocket(
-          new InetSocketAddress(config.getInternalIp(), thisNode.getDataPort()),
-          getConnectionTimeoutInMS());
-    } else {
-      return new TServerSocket(
-          new InetSocketAddress(config.getInternalIp(), thisNode.getDataPort()));
-    }
-  }
-
-  @Override
-  String getClientThreadPrefix() {
-    return "DataClientThread-";
-  }
-
-  @Override
-  String getServerClientName() {
-    return "DataServerThread-";
-  }
-
   public void preAddNodeForDataGroup(AddNodeLog log, DataGroupMember targetDataGroupMember) {
 
     // Make sure the previous add/remove node log has applied
@@ -644,7 +589,7 @@ public class DataClusterServer extends RaftServer
         if (newGroup.contains(thisNode)) {
           RaftNode header = newGroup.getHeader();
           logger.info("Adding this node into a new group {}", newGroup);
-          DataGroupMember dataGroupMember = dataMemberFactory.create(newGroup, thisNode);
+          DataGroupMember dataGroupMember = dataMemberFactory.create(newGroup);
           dataGroupMember = addDataGroupMember(dataGroupMember, header);
           dataGroupMember.pullNodeAdditionSnapshots(
               ((SlotPartitionTable) partitionTable).getNodeSlots(header), node);
@@ -727,7 +672,7 @@ public class DataClusterServer extends RaftServer
       if (prevMember == null || !prevMember.getAllNodes().equals(partitionGroup)) {
         logger.info("Building member of data group: {}", partitionGroup);
         // no previous member or member changed
-        DataGroupMember dataGroupMember = dataMemberFactory.create(partitionGroup, thisNode);
+        DataGroupMember dataGroupMember = dataMemberFactory.create(partitionGroup);
         // the previous member will be replaced here
         addDataGroupMember(dataGroupMember, header);
         dataGroupMember.setUnchanged(true);
@@ -795,7 +740,7 @@ public class DataClusterServer extends RaftServer
         RaftNode header = group.getHeader();
         if (!headerGroupMap.containsKey(header)) {
           logger.info("{} should join a new group {}", thisNode, group);
-          DataGroupMember dataGroupMember = dataMemberFactory.create(group, thisNode);
+          DataGroupMember dataGroupMember = dataMemberFactory.create(group);
           addDataGroupMember(dataGroupMember, header);
         }
         // pull new slots from the removed node
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java b/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
index 560c0fe..c16d7f0 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
@@ -18,7 +18,6 @@
  */
 package org.apache.iotdb.cluster.utils.nodetool;
 
-import org.apache.commons.collections4.map.MultiKeyMap;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
@@ -28,7 +27,6 @@ import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
 import org.apache.iotdb.cluster.server.member.DataGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.server.monitor.Timer;
@@ -41,6 +39,8 @@ import org.apache.iotdb.db.service.IService;
 import org.apache.iotdb.db.service.JMXService;
 import org.apache.iotdb.db.service.ServiceType;
 import org.apache.iotdb.tsfile.utils.Pair;
+
+import org.apache.commons.collections4.map.MultiKeyMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,7 +77,7 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
 
   @Override
   public List<Pair<Node, NodeCharacter>> getMetaGroup() {
-    MetaGroupMember metaMember = getMetaGroupMember();
+    MetaGroupMember metaMember = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (metaMember == null || metaMember.getPartitionTable() == null) {
       return null;
     }
@@ -95,7 +95,7 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
   }
 
   public List<Node> getRing() {
-    MetaGroupMember metaMember = getMetaGroupMember();
+    MetaGroupMember metaMember = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (metaMember == null || metaMember.getPartitionTable() == null) {
       return null;
     }
@@ -104,13 +104,16 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
 
   @Override
   public List<Pair<Node, NodeCharacter>> getDataGroup(int raftId) throws Exception {
-    MetaGroupMember metaMember = getMetaGroupMember();
+    MetaGroupMember metaMember = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (metaMember == null || metaMember.getPartitionTable() == null) {
       return null;
     }
     RaftNode raftNode = new RaftNode(metaMember.getThisNode(), raftId);
     DataGroupMember dataMember =
-        metaMember.getDataClusterServer().getHeaderGroupMap().getOrDefault(raftNode, null);
+        ClusterIoTDB.getInstance()
+            .getDataGroupEngine()
+            .getHeaderGroupMap()
+            .getOrDefault(raftNode, null);
     if (dataMember == null) {
       throw new Exception(String.format("Partition whose header is %s doesn't exist.", raftNode));
     }
@@ -127,7 +130,7 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
 
   @Override
   public Map<PartitionGroup, Integer> getSlotNumInDataMigration() throws Exception {
-    MetaGroupMember member = getMetaGroupMember();
+    MetaGroupMember member = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (member == null || member.getPartitionTable() == null) {
       throw new Exception(BUILDING_CLUSTER_INFO);
     }
@@ -192,23 +195,15 @@ public class ClusterMonitor implements ClusterMonitorMBean, IService {
 
   @Override
   public Map<Node, Integer> getAllNodeStatus() {
-    MetaGroupMember metaGroupMember = getMetaGroupMember();
+    MetaGroupMember metaGroupMember = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (metaGroupMember == null) {
       return null;
     }
     return metaGroupMember.getAllNodeStatus();
   }
 
-  private MetaGroupMember getMetaGroupMember() {
-    RaftTSMetaServiceImpl RaftTSMetaServiceImpl = ClusterIoTDB.getInstance().getMetaServer();
-    if (RaftTSMetaServiceImpl == null) {
-      return null;
-    }
-    return RaftTSMetaServiceImpl.getMember();
-  }
-
   private PartitionTable getPartitionTable() {
-    MetaGroupMember metaGroupMember = getMetaGroupMember();
+    MetaGroupMember metaGroupMember = ClusterIoTDB.getInstance().getMetaGroupEngine();
     if (metaGroupMember == null) {
       return null;
     }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
index 1a00fbf..0c2a666 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncDataClientTest.java
@@ -7,9 +7,9 @@ package org.apache.iotdb.cluster.client.async;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient.SingleManagerFactory;
 import org.apache.iotdb.cluster.common.TestUtils;
 import org.apache.iotdb.cluster.config.ClusterConfig;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
@@ -22,10 +22,7 @@ import org.junit.Test;
 
 import java.io.IOException;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class AsyncDataClientTest {
 
@@ -53,7 +50,9 @@ public class AsyncDataClientTest {
             new Factory(),
             new TAsyncClientManager(),
             new TNonblockingSocket(
-                node.getInternalIp(), node.getDataPort(), RaftServer.getConnectionTimeoutInMS()));
+                node.getInternalIp(),
+                node.getDataPort(),
+                ClusterConstant.getConnectionTimeoutInMS()));
     assertTrue(client.isReady());
 
     client = (AsyncDataClient) asyncClientPool.getClient(TestUtils.getNode(0));
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncMetaClientTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncMetaClientTest.java
index 324459b..f424ec9 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncMetaClientTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/client/async/AsyncMetaClientTest.java
@@ -7,9 +7,9 @@ package org.apache.iotdb.cluster.client.async;
 import org.apache.iotdb.cluster.client.async.AsyncMetaClient.FactoryAsync;
 import org.apache.iotdb.cluster.common.TestUtils;
 import org.apache.iotdb.cluster.config.ClusterConfig;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftServer;
 
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
@@ -22,10 +22,7 @@ import org.junit.Test;
 
 import java.io.IOException;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class AsyncMetaClientTest {
 
@@ -53,7 +50,9 @@ public class AsyncMetaClientTest {
             new Factory(),
             new TAsyncClientManager(),
             new TNonblockingSocket(
-                node.getInternalIp(), node.getMetaPort(), RaftServer.getConnectionTimeoutInMS()));
+                node.getInternalIp(),
+                node.getMetaPort(),
+                ClusterConstant.getConnectionTimeoutInMS()));
     assertTrue(client.isReady());
 
     client = (AsyncMetaClient) asyncClientPool.getClient(TestUtils.getNode(0));
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
index c4f1dd7..541af9e 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
@@ -20,11 +20,12 @@
 package org.apache.iotdb.cluster.integration;
 
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
-import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
+import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.utils.Constants;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.rpc.IoTDBConnectionException;
 import org.apache.iotdb.session.Session;
+
 import org.junit.After;
 import org.junit.Before;
 
@@ -33,7 +34,7 @@ import java.util.List;
 
 public abstract class BaseSingleNodeTest {
 
-  private RaftTSMetaServiceImpl metaServer;
+  private MetaGroupMember metaServer;
 
   private boolean useAsyncServer;
   private List<String> seedNodeUrls;
@@ -43,7 +44,7 @@ public abstract class BaseSingleNodeTest {
   @Before
   public void setUp() throws Exception {
     initConfigs();
-    metaServer = new RaftTSMetaServiceImpl();
+    metaServer = new MetaGroupMember();
     metaServer.start();
     metaServer.buildCluster();
   }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
index a6e86a8..55b24da 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
@@ -19,6 +19,8 @@
 
 package org.apache.iotdb.cluster.log.applier;
 
+import junit.framework.TestCase;
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.IoTDBTest;
@@ -72,8 +74,6 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.write.schema.TimeseriesSchema;
-
-import junit.framework.TestCase;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
 import org.junit.After;
@@ -90,10 +90,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 public class DataLogApplierTest extends IoTDBTest {
 
@@ -172,71 +169,76 @@ public class DataLogApplierTest extends IoTDBTest {
     NodeStatusManager.getINSTANCE().setMetaGroupMember(testMetaGroupMember);
     partialWriteEnabled = IoTDBDescriptor.getInstance().getConfig().isEnablePartialInsert();
     IoTDBDescriptor.getInstance().getConfig().setEnablePartialInsert(false);
-    testMetaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, node, null) {
-              @Override
-              public void getAllPaths(
-                  RaftNode header,
-                  List<String> path,
-                  boolean withAlias,
-                  AsyncMethodCallback<GetAllPathsResult> resultHandler) {
-                new Thread(
-                        () ->
-                            new DataAsyncService(testDataGroupMember)
-                                .getAllPaths(header, path, withAlias, resultHandler))
-                    .start();
-              }
-
+    //    //TODO fixme : 恢复正常的provider
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void pullTimeSeriesSchema(
-                  PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
-                new Thread(
-                        () -> {
-                          List<TimeseriesSchema> timeseriesSchemas = new ArrayList<>();
-                          for (String path : request.prefixPaths) {
-                            if (path.startsWith(TestUtils.getTestSg(4))) {
-                              for (int i = 0; i < 10; i++) {
-                                timeseriesSchemas.add(TestUtils.getTestTimeSeriesSchema(4, i));
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, node, null) {
+                  @Override
+                  public void getAllPaths(
+                      RaftNode header,
+                      List<String> path,
+                      boolean withAlias,
+                      AsyncMethodCallback<GetAllPathsResult> resultHandler) {
+                    new Thread(
+                            () ->
+                                new DataAsyncService(testDataGroupMember)
+                                    .getAllPaths(header, path, withAlias, resultHandler))
+                        .start();
+                  }
+
+                  @Override
+                  public void pullTimeSeriesSchema(
+                      PullSchemaRequest request,
+                      AsyncMethodCallback<PullSchemaResp> resultHandler) {
+                    new Thread(
+                            () -> {
+                              List<TimeseriesSchema> timeseriesSchemas = new ArrayList<>();
+                              for (String path : request.prefixPaths) {
+                                if (path.startsWith(TestUtils.getTestSg(4))) {
+                                  for (int i = 0; i < 10; i++) {
+                                    timeseriesSchemas.add(TestUtils.getTestTimeSeriesSchema(4, i));
+                                  }
+                                } else if (!path.startsWith(TestUtils.getTestSg(5))) {
+                                  resultHandler.onError(new StorageGroupNotSetException(path));
+                                  return;
+                                }
                               }
-                            } else if (!path.startsWith(TestUtils.getTestSg(5))) {
-                              resultHandler.onError(new StorageGroupNotSetException(path));
-                              return;
-                            }
-                          }
-                          PullSchemaResp resp = new PullSchemaResp();
-                          // serialize the schemas
-                          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-                          DataOutputStream dataOutputStream =
-                              new DataOutputStream(byteArrayOutputStream);
-                          try {
-                            dataOutputStream.writeInt(timeseriesSchemas.size());
-                            for (TimeseriesSchema timeseriesSchema : timeseriesSchemas) {
-                              timeseriesSchema.serializeTo(dataOutputStream);
-                            }
-                          } catch (IOException ignored) {
-                            // unreachable for we are using a ByteArrayOutputStream
-                          }
-                          resp.setSchemaBytes(byteArrayOutputStream.toByteArray());
-                          resultHandler.onComplete(resp);
-                        })
-                    .start();
-              }
-
-              @Override
-              public void pullMeasurementSchema(
-                  PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
-                new Thread(
-                        () ->
-                            new DataAsyncService(testDataGroupMember)
-                                .pullMeasurementSchema(request, resultHandler))
-                    .start();
+                              PullSchemaResp resp = new PullSchemaResp();
+                              // serialize the schemas
+                              ByteArrayOutputStream byteArrayOutputStream =
+                                  new ByteArrayOutputStream();
+                              DataOutputStream dataOutputStream =
+                                  new DataOutputStream(byteArrayOutputStream);
+                              try {
+                                dataOutputStream.writeInt(timeseriesSchemas.size());
+                                for (TimeseriesSchema timeseriesSchema : timeseriesSchemas) {
+                                  timeseriesSchema.serializeTo(dataOutputStream);
+                                }
+                              } catch (IOException ignored) {
+                                // unreachable for we are using a ByteArrayOutputStream
+                              }
+                              resp.setSchemaBytes(byteArrayOutputStream.toByteArray());
+                              resultHandler.onComplete(resp);
+                            })
+                        .start();
+                  }
+
+                  @Override
+                  public void pullMeasurementSchema(
+                      PullSchemaRequest request,
+                      AsyncMethodCallback<PullSchemaResp> resultHandler) {
+                    new Thread(
+                            () ->
+                                new DataAsyncService(testDataGroupMember)
+                                    .pullMeasurementSchema(request, resultHandler))
+                        .start();
+                  }
+                };
               }
-            };
-          }
-        });
+            });
     ((CMManager) IoTDB.metaManager).setMetaGroupMember(testMetaGroupMember);
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
index fd711e5..09a3354 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestMetaGroupMember;
@@ -31,7 +32,6 @@ import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -48,20 +48,21 @@ public class DatasourceInfoTest {
   @Before
   public void setUp() {
     metaGroupMember = new TestMetaGroupMember();
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, TestUtils.getNode(0), null) {
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void querySingleSeries(
-                  SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
-                  throws TException {
-                throw new TException("Don't worry, this is the exception I constructed.");
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, TestUtils.getNode(0), null) {
+                  @Override
+                  public void querySingleSeries(
+                      SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
+                      throws TException {
+                    throw new TException("Don't worry, this is the exception I constructed.");
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   @Test
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
index 525486a..1af7d57 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestUtils;
@@ -34,7 +35,6 @@ import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -63,64 +63,66 @@ public class RemoteSeriesReaderByTimestampTest {
   public void setUp() {
     prevUseAsyncServer = ClusterDescriptor.getInstance().getConfig().isUseAsyncServer();
     ClusterDescriptor.getInstance().getConfig().setUseAsyncServer(true);
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, node, null) {
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void fetchSingleSeriesByTimestamps(
-                  RaftNode header,
-                  long readerId,
-                  List<Long> timestamps,
-                  AsyncMethodCallback<ByteBuffer> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(
-                        () -> {
-                          ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-                          DataOutputStream dataOutputStream =
-                              new DataOutputStream(byteArrayOutputStream);
-                          Object[] results = new Object[timestamps.size()];
-                          for (int i = 0; i < timestamps.size(); i++) {
-                            while (batchData.hasCurrent()) {
-                              long currentTime = batchData.currentTime();
-                              if (currentTime == timestamps.get(i)) {
-                                results[i] = batchData.currentValue();
-                                batchData.next();
-                                break;
-                              } else if (currentTime > timestamps.get(i)) {
-                                results[i] = null;
-                                break;
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, node, null) {
+                  @Override
+                  public void fetchSingleSeriesByTimestamps(
+                      RaftNode header,
+                      long readerId,
+                      List<Long> timestamps,
+                      AsyncMethodCallback<ByteBuffer> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(
+                            () -> {
+                              ByteArrayOutputStream byteArrayOutputStream =
+                                  new ByteArrayOutputStream();
+                              DataOutputStream dataOutputStream =
+                                  new DataOutputStream(byteArrayOutputStream);
+                              Object[] results = new Object[timestamps.size()];
+                              for (int i = 0; i < timestamps.size(); i++) {
+                                while (batchData.hasCurrent()) {
+                                  long currentTime = batchData.currentTime();
+                                  if (currentTime == timestamps.get(i)) {
+                                    results[i] = batchData.currentValue();
+                                    batchData.next();
+                                    break;
+                                  } else if (currentTime > timestamps.get(i)) {
+                                    results[i] = null;
+                                    break;
+                                  }
+                                  // time < timestamp, continue
+                                  batchData.next();
+                                }
                               }
-                              // time < timestamp, continue
-                              batchData.next();
-                            }
-                          }
-                          SerializeUtils.serializeObjects(results, dataOutputStream);
-
-                          resultHandler.onComplete(
-                              ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
-                        })
-                    .start();
-              }
-
-              @Override
-              public void querySingleSeriesByTimestamp(
-                  SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(() -> resultHandler.onComplete(1L)).start();
+                              SerializeUtils.serializeObjects(results, dataOutputStream);
+
+                              resultHandler.onComplete(
+                                  ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
+                            })
+                        .start();
+                  }
+
+                  @Override
+                  public void querySingleSeriesByTimestamp(
+                      SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(() -> resultHandler.onComplete(1L)).start();
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   @After
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
index 3acb1b4..bf07b21 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.query.reader;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestMetaGroupMember;
@@ -36,7 +37,6 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -52,9 +52,7 @@ import java.nio.ByteBuffer;
 import java.util.Set;
 import java.util.concurrent.ConcurrentSkipListSet;
 
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
+import static junit.framework.TestCase.*;
 import static org.junit.Assert.fail;
 
 public class RemoteSimpleSeriesReaderTest {
@@ -73,50 +71,52 @@ public class RemoteSimpleSeriesReaderTest {
     batchData = TestUtils.genBatchData(TSDataType.DOUBLE, 0, 100);
     batchUsed = false;
     metaGroupMember = new TestMetaGroupMember();
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, node, null) {
-              @Override
-              public void fetchSingleSeries(
-                  RaftNode header, long readerId, AsyncMethodCallback<ByteBuffer> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(
-                        () -> {
-                          if (batchUsed) {
-                            resultHandler.onComplete(ByteBuffer.allocate(0));
-                          } else {
-                            ByteArrayOutputStream byteArrayOutputStream =
-                                new ByteArrayOutputStream();
-                            DataOutputStream dataOutputStream =
-                                new DataOutputStream(byteArrayOutputStream);
-                            SerializeUtils.serializeBatchData(batchData, dataOutputStream);
-                            batchUsed = true;
-                            resultHandler.onComplete(
-                                ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
-                          }
-                        })
-                    .start();
-              }
-
+    // TODO fixme : 恢复正常的provider
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void querySingleSeries(
-                  SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(() -> resultHandler.onComplete(1L)).start();
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, node, null) {
+                  @Override
+                  public void fetchSingleSeries(
+                      RaftNode header, long readerId, AsyncMethodCallback<ByteBuffer> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(
+                            () -> {
+                              if (batchUsed) {
+                                resultHandler.onComplete(ByteBuffer.allocate(0));
+                              } else {
+                                ByteArrayOutputStream byteArrayOutputStream =
+                                    new ByteArrayOutputStream();
+                                DataOutputStream dataOutputStream =
+                                    new DataOutputStream(byteArrayOutputStream);
+                                SerializeUtils.serializeBatchData(batchData, dataOutputStream);
+                                batchUsed = true;
+                                resultHandler.onComplete(
+                                    ByteBuffer.wrap(byteArrayOutputStream.toByteArray()));
+                              }
+                            })
+                        .start();
+                  }
+
+                  @Override
+                  public void querySingleSeries(
+                      SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(() -> resultHandler.onComplete(1L)).start();
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   @After
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
index 28bbfec..6c08e3d 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
@@ -18,6 +18,9 @@
  */
 package org.apache.iotdb.cluster.query.reader.mult;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestMetaGroupMember;
@@ -37,9 +40,6 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -128,57 +128,58 @@ public class AssignPathManagedMergeReaderTest {
   }
 
   private void setAsyncDataClient() {
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, node, null) {
-              @Override
-              public void fetchMultSeries(
-                  RaftNode header,
-                  long readerId,
-                  List<String> paths,
-                  AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(
-                        () -> {
-                          Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
-                          if (batchUsed) {
-                            paths.forEach(
-                                path -> {
-                                  stringByteBufferMap.put(path, ByteBuffer.allocate(0));
-                                });
-                          } else {
-                            batchUsed = true;
-
-                            for (int i = 0; i < batchData.size(); i++) {
-                              stringByteBufferMap.put(
-                                  paths.get(i), generateByteBuffer(batchData.get(i)));
-                            }
-
-                            resultHandler.onComplete(stringByteBufferMap);
-                          }
-                        })
-                    .start();
-              }
-
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void queryMultSeries(
-                  MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(() -> resultHandler.onComplete(1L)).start();
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, node, null) {
+                  @Override
+                  public void fetchMultSeries(
+                      RaftNode header,
+                      long readerId,
+                      List<String> paths,
+                      AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(
+                            () -> {
+                              Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
+                              if (batchUsed) {
+                                paths.forEach(
+                                    path -> {
+                                      stringByteBufferMap.put(path, ByteBuffer.allocate(0));
+                                    });
+                              } else {
+                                batchUsed = true;
+
+                                for (int i = 0; i < batchData.size(); i++) {
+                                  stringByteBufferMap.put(
+                                      paths.get(i), generateByteBuffer(batchData.get(i)));
+                                }
+
+                                resultHandler.onComplete(stringByteBufferMap);
+                              }
+                            })
+                        .start();
+                  }
+
+                  @Override
+                  public void queryMultSeries(
+                      MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(() -> resultHandler.onComplete(1L)).start();
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   private ByteBuffer generateByteBuffer(BatchData batchData) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
index 85e4712..a28a810 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
@@ -18,6 +18,9 @@
  */
 package org.apache.iotdb.cluster.query.reader.mult;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.client.sync.SyncDataClient;
@@ -38,9 +41,6 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
@@ -59,9 +59,7 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.ConcurrentSkipListSet;
 
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
+import static junit.framework.TestCase.*;
 
 public class RemoteMultSeriesReaderTest {
 
@@ -183,98 +181,100 @@ public class RemoteMultSeriesReaderTest {
   }
 
   private void setAsyncDataClient() {
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new AsyncDataClient(null, null, node, null) {
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public void fetchMultSeries(
-                  RaftNode header,
-                  long readerId,
-                  List<String> paths,
-                  AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                new Thread(
-                        () -> {
-                          Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
-                          if (batchUsed) {
-                            paths.forEach(
-                                path -> {
-                                  stringByteBufferMap.put(path, ByteBuffer.allocate(0));
-                                });
-                          } else {
-                            batchUsed = true;
-
-                            for (int i = 0; i < batchData.size(); i++) {
-                              stringByteBufferMap.put(
-                                  paths.get(i), generateByteBuffer(batchData.get(i)));
-                            }
-
-                            resultHandler.onComplete(stringByteBufferMap);
-                          }
-                        })
-                    .start();
-              }
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new AsyncDataClient(null, null, node, null) {
+                  @Override
+                  public void fetchMultSeries(
+                      RaftNode header,
+                      long readerId,
+                      List<String> paths,
+                      AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    new Thread(
+                            () -> {
+                              Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
+                              if (batchUsed) {
+                                paths.forEach(
+                                    path -> {
+                                      stringByteBufferMap.put(path, ByteBuffer.allocate(0));
+                                    });
+                              } else {
+                                batchUsed = true;
+
+                                for (int i = 0; i < batchData.size(); i++) {
+                                  stringByteBufferMap.put(
+                                      paths.get(i), generateByteBuffer(batchData.get(i)));
+                                }
+
+                                resultHandler.onComplete(stringByteBufferMap);
+                              }
+                            })
+                        .start();
+                  }
 
-              @Override
-              public void queryMultSeries(
-                  MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
-                  throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
+                  @Override
+                  public void queryMultSeries(
+                      MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler)
+                      throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
 
-                new Thread(() -> resultHandler.onComplete(1L)).start();
+                    new Thread(() -> resultHandler.onComplete(1L)).start();
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   private void setSyncDataClient() {
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public SyncDataClient getSyncDataClient(Node node, int timeout) {
-            return new SyncDataClient(null) {
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
               @Override
-              public Map<String, ByteBuffer> fetchMultSeries(
-                  RaftNode header, long readerId, List<String> paths) throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
-
-                Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
-                if (batchUsed) {
-                  paths.forEach(
-                      path -> {
-                        stringByteBufferMap.put(path, ByteBuffer.allocate(0));
-                      });
-                } else {
-                  batchUsed = true;
-                  for (int i = 0; i < batchData.size(); i++) {
-                    stringByteBufferMap.put(paths.get(i), generateByteBuffer(batchData.get(i)));
+              public SyncDataClient getSyncDataClient(Node node, int timeout) {
+                return new SyncDataClient(null) {
+                  @Override
+                  public Map<String, ByteBuffer> fetchMultSeries(
+                      RaftNode header, long readerId, List<String> paths) throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
+
+                    Map<String, ByteBuffer> stringByteBufferMap = Maps.newHashMap();
+                    if (batchUsed) {
+                      paths.forEach(
+                          path -> {
+                            stringByteBufferMap.put(path, ByteBuffer.allocate(0));
+                          });
+                    } else {
+                      batchUsed = true;
+                      for (int i = 0; i < batchData.size(); i++) {
+                        stringByteBufferMap.put(paths.get(i), generateByteBuffer(batchData.get(i)));
+                      }
+                    }
+                    return stringByteBufferMap;
                   }
-                }
-                return stringByteBufferMap;
-              }
 
-              @Override
-              public long queryMultSeries(MultSeriesQueryRequest request) throws TException {
-                if (failedNodes.contains(node)) {
-                  throw new TException("Node down.");
-                }
+                  @Override
+                  public long queryMultSeries(MultSeriesQueryRequest request) throws TException {
+                    if (failedNodes.contains(node)) {
+                      throw new TException("Node down.");
+                    }
 
-                return 1L;
+                    return 1L;
+                  }
+                };
               }
-            };
-          }
-        });
+            });
   }
 
   private ByteBuffer generateByteBuffer(BatchData batchData) {
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
index 60da68d8..de44937 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
@@ -22,11 +22,11 @@ package org.apache.iotdb.cluster.server.clusterinfo;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.rpc.thrift.DataPartitionEntry;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
-import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.server.member.MetaGroupMemberTest;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
 import org.apache.iotdb.db.metadata.PartialPath;
+
 import org.apache.thrift.TException;
 import org.junit.After;
 import org.junit.Assert;
@@ -47,24 +47,23 @@ public class ClusterInfoServiceImplTest {
     metaGroupMemberTest.setUp();
     MetaGroupMember metaGroupMember = metaGroupMemberTest.getTestMetaGroupMember();
 
-    RaftTSMetaServiceImpl RaftTSMetaServiceImpl = new RaftTSMetaServiceImpl();
-    RaftTSMetaServiceImpl.getMember().stop();
-    RaftTSMetaServiceImpl.setMetaGroupMember(metaGroupMember);
-
-    ClusterIoTDB.setMetaClusterServer(RaftTSMetaServiceImpl);
+    ClusterIoTDB.getInstance().setMetaGroupEngine(metaGroupMember);
 
-    RaftTSMetaServiceImpl.getIoTDB().metaManager.setStorageGroup(new PartialPath("root", "sg"));
+    ClusterIoTDB.getInstance()
+        .getIotdb()
+        .metaManager
+        .setStorageGroup(new PartialPath("root", "sg"));
     // metaClusterServer.getMember()
     impl = new ClusterInfoServiceImpl();
   }
 
   @After
   public void tearDown() throws MetadataException {
-    ClusterIoTDB.getMetaServer()
-        .getIoTDB()
+    ClusterIoTDB.getInstance()
+        .getIotdb()
         .metaManager
         .deleteStorageGroups(Collections.singletonList(new PartialPath("root", "sg")));
-    ClusterIoTDB.getMetaServer().stop();
+    ClusterIoTDB.getInstance().getMetaGroupEngine().stop();
   }
 
   @Test
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
index dc3b14d..13076a5 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThreadTest.java
@@ -35,7 +35,6 @@ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.member.RaftMember;
 import org.apache.iotdb.db.exception.StorageEngineException;
@@ -214,8 +213,8 @@ public class HeartbeatThreadTest {
 
   @Test
   public void testAsFollower() throws InterruptedException {
-    int prevTimeOut = RaftServer.getConnectionTimeoutInMS();
-    RaftServer.setConnectionTimeoutInMS(500);
+    int prevTimeOut = ClusterConstant.getConnectionTimeoutInMS();
+    ClusterConstant.setConnectionTimeoutInMS(500);
     member.setCharacter(NodeCharacter.FOLLOWER);
     member.setLastHeartbeatReceivedTime(System.currentTimeMillis());
     respondToElection = false;
@@ -226,7 +225,7 @@ public class HeartbeatThreadTest {
       testThread.interrupt();
       testThread.join();
     } finally {
-      RaftServer.setConnectionTimeoutInMS(prevTimeOut);
+      ClusterConstant.setConnectionTimeoutInMS(prevTimeOut);
     }
   }
 
diff --git 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
index 7d26bea..60fbe31 100644
--- 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
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.server.member;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestAsyncDataClient;
@@ -28,6 +29,7 @@ import org.apache.iotdb.cluster.common.TestLogManager;
 import org.apache.iotdb.cluster.common.TestMetaGroupMember;
 import org.apache.iotdb.cluster.common.TestPartitionedLogManager;
 import org.apache.iotdb.cluster.common.TestUtils;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.coordinator.Coordinator;
 import org.apache.iotdb.cluster.log.applier.DataLogApplier;
@@ -45,7 +47,6 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.metadata.MetadataException;
@@ -56,7 +57,6 @@ import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.RegisterManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.SchemaUtils;
-
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
 import org.junit.After;
@@ -110,11 +110,11 @@ public class BaseMember {
     IoTDBDescriptor.getInstance().getConfig().setEnableWal(false);
     RaftMember.setWaitLeaderTimeMs(10);
 
-    syncLeaderMaxWait = RaftServer.getSyncLeaderMaxWaitMs();
-    heartBeatInterval = RaftServer.getHeartBeatIntervalMs();
+    syncLeaderMaxWait = ClusterConstant.getSyncLeaderMaxWaitMs();
+    heartBeatInterval = ClusterConstant.getHeartBeatIntervalMs();
 
-    RaftServer.setSyncLeaderMaxWaitMs(100);
-    RaftServer.setHeartBeatIntervalMs(100);
+    ClusterConstant.setSyncLeaderMaxWaitMs(100);
+    ClusterConstant.setHeartBeatIntervalMs(100);
 
     allNodes = new PartitionGroup();
     for (int i = 0; i < 100; i += 10) {
@@ -191,8 +191,8 @@ public class BaseMember {
     ClusterDescriptor.getInstance().getConfig().setUseAsyncApplier(prevUseAsyncApplier);
     IoTDBDescriptor.getInstance().getConfig().setEnableWal(prevEnableWAL);
 
-    RaftServer.setSyncLeaderMaxWaitMs(syncLeaderMaxWait);
-    RaftServer.setHeartBeatIntervalMs(heartBeatInterval);
+    ClusterConstant.setSyncLeaderMaxWaitMs(syncLeaderMaxWait);
+    ClusterConstant.setHeartBeatIntervalMs(heartBeatInterval);
   }
 
   DataGroupMember getDataGroupMember(Node node) {
@@ -309,13 +309,15 @@ public class BaseMember {
     ret.setLeader(node);
     ret.setCharacter(NodeCharacter.LEADER);
     ret.setAppendLogThreadPool(testThreadPool);
-    ret.setClientProvider(
-        new DataClientProvider(new Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new TestAsyncDataClient(node, dataGroupMemberMap);
-          }
-        });
+    // TODO fixme : 恢复正常的provider
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new Factory()) {
+              @Override
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new TestAsyncDataClient(node, dataGroupMemberMap);
+              }
+            });
     return ret;
   }
 }
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
index 293549c..a1abb8e 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/DataGroupMemberTest.java
@@ -54,7 +54,6 @@ 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.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 import org.apache.iotdb.cluster.server.handlers.caller.PullMeasurementSchemaHandler;
@@ -119,12 +118,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
 import static org.apache.iotdb.cluster.common.TestUtils.getTestMeasurement;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 public class DataGroupMemberTest extends BaseMember {
 
@@ -191,7 +185,7 @@ public class DataGroupMemberTest extends BaseMember {
 
   private DataGroupMember getDataGroupMember(Node node, PartitionGroup nodes) {
     DataGroupMember dataGroupMember =
-        new DataGroupMember(new Factory(), nodes, node, testMetaMember) {
+        new DataGroupMember(new Factory(), nodes, testMetaMember) {
           @Override
           public boolean syncLeader(CheckConsistency checkConsistency) {
             return true;
@@ -640,10 +634,10 @@ public class DataGroupMemberTest extends BaseMember {
   @Test
   public void testPullTimeseriesSchema() {
     System.out.println("Start testPullTimeseriesSchema()");
-    int prevTimeOut = RaftServer.getConnectionTimeoutInMS();
-    int prevMaxWait = RaftServer.getSyncLeaderMaxWaitMs();
-    RaftServer.setConnectionTimeoutInMS(20);
-    RaftServer.setSyncLeaderMaxWaitMs(200);
+    int prevTimeOut = ClusterConstant.getConnectionTimeoutInMS();
+    int prevMaxWait = ClusterConstant.getSyncLeaderMaxWaitMs();
+    ClusterConstant.setConnectionTimeoutInMS(20);
+    ClusterConstant.setSyncLeaderMaxWaitMs(200);
     try {
       // sync with leader is temporarily disabled, the request should be forward to the leader
       dataGroupMember.setLeader(TestUtils.getNode(0));
@@ -671,18 +665,18 @@ public class DataGroupMemberTest extends BaseMember {
         assertTrue(result.get().contains(TestUtils.getTestTimeSeriesSchema(0, i)));
       }
     } finally {
-      RaftServer.setConnectionTimeoutInMS(prevTimeOut);
-      RaftServer.setSyncLeaderMaxWaitMs(prevMaxWait);
+      ClusterConstant.setConnectionTimeoutInMS(prevTimeOut);
+      ClusterConstant.setSyncLeaderMaxWaitMs(prevMaxWait);
     }
   }
 
   @Test
   public void testPullMeasurementSchema() {
     System.out.println("Start testPullMeasurementSchema()");
-    int prevTimeOut = RaftServer.getConnectionTimeoutInMS();
-    int prevMaxWait = RaftServer.getSyncLeaderMaxWaitMs();
-    RaftServer.setConnectionTimeoutInMS(20);
-    RaftServer.setSyncLeaderMaxWaitMs(200);
+    int prevTimeOut = ClusterConstant.getConnectionTimeoutInMS();
+    int prevMaxWait = ClusterConstant.getSyncLeaderMaxWaitMs();
+    ClusterConstant.setConnectionTimeoutInMS(20);
+    ClusterConstant.setSyncLeaderMaxWaitMs(200);
     try {
       // sync with leader is temporarily disabled, the request should be forward to the leader
       dataGroupMember.setLeader(TestUtils.getNode(0));
@@ -710,8 +704,8 @@ public class DataGroupMemberTest extends BaseMember {
         assertTrue(result.get().contains(TestUtils.getTestMeasurementSchema(i)));
       }
     } finally {
-      RaftServer.setConnectionTimeoutInMS(prevTimeOut);
-      RaftServer.setSyncLeaderMaxWaitMs(prevMaxWait);
+      ClusterConstant.setConnectionTimeoutInMS(prevTimeOut);
+      ClusterConstant.setSyncLeaderMaxWaitMs(prevMaxWait);
     }
   }
 
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
index a857599..c31d891 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.cluster.server.member;
 
+import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 import org.apache.iotdb.cluster.common.TestAsyncClient;
@@ -27,6 +28,7 @@ import org.apache.iotdb.cluster.common.TestAsyncMetaClient;
 import org.apache.iotdb.cluster.common.TestPartitionedLogManager;
 import org.apache.iotdb.cluster.common.TestSnapshot;
 import org.apache.iotdb.cluster.common.TestUtils;
+import org.apache.iotdb.cluster.config.ClusterConstant;
 import org.apache.iotdb.cluster.config.ClusterDescriptor;
 import org.apache.iotdb.cluster.coordinator.Coordinator;
 import org.apache.iotdb.cluster.exception.CheckConsistencyException;
@@ -64,13 +66,11 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
 import org.apache.iotdb.cluster.rpc.thrift.StartUpStatus;
 import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
-import org.apache.iotdb.cluster.server.DataClusterServer;
 import org.apache.iotdb.cluster.server.NodeCharacter;
-import org.apache.iotdb.cluster.server.RaftServer;
 import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
-import org.apache.iotdb.cluster.server.heartbeat.DataHeartbeatServer;
 import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
+import org.apache.iotdb.cluster.server.service.DataGroupServiceImpls;
 import org.apache.iotdb.cluster.server.service.MetaAsyncService;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
 import org.apache.iotdb.cluster.utils.Constants;
@@ -108,7 +108,6 @@ import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.TimeseriesSchema;
-
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TCompactProtocol.Factory;
@@ -135,20 +134,13 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
-import static org.apache.iotdb.cluster.server.NodeCharacter.ELECTOR;
-import static org.apache.iotdb.cluster.server.NodeCharacter.FOLLOWER;
-import static org.apache.iotdb.cluster.server.NodeCharacter.LEADER;
+import static org.apache.iotdb.cluster.server.NodeCharacter.*;
 import static org.awaitility.Awaitility.await;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.*;
 
 public class MetaGroupMemberTest extends BaseMember {
 
-  private DataClusterServer dataClusterServer;
+  private DataGroupServiceImpls dataGroupServiceImpls;
   protected boolean mockDataClusterServer;
   private Node exiledNode;
 
@@ -158,7 +150,7 @@ public class MetaGroupMemberTest extends BaseMember {
   @Override
   @After
   public void tearDown() throws Exception {
-    dataClusterServer.stop();
+    dataGroupServiceImpls.stop();
     super.tearDown();
     ClusterDescriptor.getInstance().getConfig().setReplicationNum(prevReplicaNum);
     ClusterDescriptor.getInstance().getConfig().setSeedNodeUrls(prevSeedNodes);
@@ -171,9 +163,9 @@ public class MetaGroupMemberTest extends BaseMember {
     ClusterDescriptor.getInstance().getConfig().setSeedNodeUrls(Collections.emptyList());
     prevReplicaNum = ClusterDescriptor.getInstance().getConfig().getReplicationNum();
     ClusterDescriptor.getInstance().getConfig().setReplicationNum(2);
-    RaftServer.setConnectionTimeoutInMS(1000);
-    RaftServer.setWriteOperationTimeoutMS(1000);
-    RaftServer.setReadOperationTimeoutMS(1000);
+    ClusterConstant.setConnectionTimeoutInMS(1000);
+    ClusterConstant.setWriteOperationTimeoutMS(1000);
+    ClusterConstant.setReadOperationTimeoutMS(1000);
 
     super.setUp();
     partitionTable = new SlotPartitionTable(allNodes, TestUtils.getNode(0));
@@ -181,18 +173,17 @@ public class MetaGroupMemberTest extends BaseMember {
     dummyResponse.set(Response.RESPONSE_AGREE);
     testMetaMember.setAllNodes(allNodes);
 
-    dataClusterServer =
-        new DataClusterServer(
-            TestUtils.getNode(0),
+    dataGroupServiceImpls =
+        new DataGroupServiceImpls(
             new DataGroupMember.Factory(null, testMetaMember) {
               @Override
-              public DataGroupMember create(PartitionGroup partitionGroup, Node thisNode) {
-                return getDataGroupMember(partitionGroup, thisNode);
+              public DataGroupMember create(PartitionGroup partitionGroup) {
+                return getDataGroupMember(partitionGroup, TestUtils.getNode(0));
               }
             },
             testMetaMember);
 
-    buildDataGroups(dataClusterServer);
+    buildDataGroups(dataGroupServiceImpls);
     testMetaMember.getThisNode().setNodeIdentifier(0);
     testMetaMember.setRouter(new ClusterPlanRouter(testMetaMember.getPartitionTable()));
     mockDataClusterServer = false;
@@ -202,7 +193,7 @@ public class MetaGroupMemberTest extends BaseMember {
 
   private DataGroupMember getDataGroupMember(PartitionGroup group, Node node) {
     DataGroupMember dataGroupMember =
-        new DataGroupMember(null, group, node, testMetaMember) {
+        new DataGroupMember(null, group, testMetaMember) {
           @Override
           public boolean syncLeader(CheckConsistency checkConsistency) {
             return true;
@@ -338,19 +329,20 @@ public class MetaGroupMemberTest extends BaseMember {
           }
 
           @Override
-          public DataClusterServer getDataClusterServer() {
+          public DataGroupServiceImpls getDataGroupEngine() {
             return mockDataClusterServer
-                ? MetaGroupMemberTest.this.dataClusterServer
-                : super.getDataClusterServer();
+                ? MetaGroupMemberTest.this.dataGroupServiceImpls
+                : ClusterIoTDB.getInstance().getDataGroupEngine();
           }
 
-          @Override
-          public DataHeartbeatServer getDataHeartbeatServer() {
-            return new DataHeartbeatServer(thisNode, dataClusterServer) {
-              @Override
-              public void start() {}
-            };
-          }
+          // TODO we remove a do-nothing DataHeartbeat here.
+          //          @Override
+          //          public DataHeartbeatServer getDataHeartbeatServer() {
+          //            return new DataHeartbeatServer(thisNode, dataGroupServiceImpls) {
+          //              @Override
+          //              public void start() {}
+          //            };
+          //          }
 
           @Override
           public DataGroupMember getLocalDataMember(RaftNode header, Object request) {
@@ -550,25 +542,27 @@ public class MetaGroupMemberTest extends BaseMember {
     metaGroupMember.setAllNodes(allNodes);
     metaGroupMember.setCharacter(NodeCharacter.LEADER);
     metaGroupMember.setAppendLogThreadPool(testThreadPool);
-    metaGroupMember.setClientProvider(
-        new DataClientProvider(new TBinaryProtocol.Factory()) {
-          @Override
-          public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
-            return new TestAsyncDataClient(node, dataGroupMemberMap);
-          }
-        });
+    // TODO fixme : 恢复正常的provider
+    ClusterIoTDB.getInstance()
+        .setClientProvider(
+            new DataClientProvider(new TBinaryProtocol.Factory()) {
+              @Override
+              public AsyncDataClient getAsyncDataClient(Node node, int timeout) throws IOException {
+                return new TestAsyncDataClient(node, dataGroupMemberMap);
+              }
+            });
     return metaGroupMember;
   }
 
-  private void buildDataGroups(DataClusterServer dataClusterServer) {
+  private void buildDataGroups(DataGroupServiceImpls dataGroupServiceImpls) {
     List<PartitionGroup> partitionGroups = partitionTable.getLocalGroups();
 
-    dataClusterServer.setPartitionTable(partitionTable);
+    dataGroupServiceImpls.setPartitionTable(partitionTable);
     for (PartitionGroup partitionGroup : partitionGroups) {
       RaftNode header = partitionGroup.getHeader();
       DataGroupMember dataGroupMember = getDataGroupMember(partitionGroup, TestUtils.getNode(0));
       dataGroupMember.start();
-      dataClusterServer.addDataGroupMember(dataGroupMember, header);
+      dataGroupServiceImpls.addDataGroupMember(dataGroupMember, header);
     }
   }
 
@@ -600,8 +594,8 @@ public class MetaGroupMemberTest extends BaseMember {
         StorageEngine.getInstance().getProcessor(new PartialPath(TestUtils.getTestSg(0)));
     assertTrue(processor.getWorkSequenceTsFileProcessors().isEmpty());
 
-    int prevTimeout = RaftServer.getConnectionTimeoutInMS();
-    RaftServer.setConnectionTimeoutInMS(100);
+    int prevTimeout = ClusterConstant.getConnectionTimeoutInMS();
+    ClusterConstant.setConnectionTimeoutInMS(100);
     try {
       System.out.println("Create the first file");
       for (int i = 20; i < 30; i++) {
@@ -636,7 +630,7 @@ public class MetaGroupMemberTest extends BaseMember {
       assertFalse(testMetaMember.closePartition(TestUtils.getTestSg(0), 0, true));
       assertFalse(processor.getWorkSequenceTsFileProcessors().isEmpty());
     } finally {
-      RaftServer.setConnectionTimeoutInMS(prevTimeout);
+      ClusterConstant.setConnectionTimeoutInMS(prevTimeout);
     }
     testThreadPool.shutdownNow();
   }
@@ -696,8 +690,8 @@ public class MetaGroupMemberTest extends BaseMember {
   @Test
   public void testJoinClusterFailed() throws QueryProcessException {
     System.out.println("Start testJoinClusterFailed()");
-    long prevInterval = RaftServer.getHeartBeatIntervalMs();
-    RaftServer.setHeartBeatIntervalMs(10);
+    long prevInterval = ClusterConstant.getHeartBeatIntervalMs();
+    ClusterConstant.setHeartBeatIntervalMs(10);
     ClusterDescriptor.getInstance().getConfig().setJoinClusterTimeOutMs(100);
     dummyResponse.set(Response.RESPONSE_NO_CONNECTION);
     MetaGroupMember newMember = getMetaGroupMember(TestUtils.getNode(10));
@@ -708,7 +702,7 @@ public class MetaGroupMemberTest extends BaseMember {
       assertTrue(e instanceof StartUpCheckFailureException);
     } finally {
       newMember.closeLogManager();
-      RaftServer.setHeartBeatIntervalMs(prevInterval);
+      ClusterConstant.setHeartBeatIntervalMs(prevInterval);
     }
   }
 
@@ -890,7 +884,7 @@ public class MetaGroupMemberTest extends BaseMember {
       throws QueryProcessException, StorageEngineException, IOException,
           StorageGroupNotSetException, IllegalPathException {
     System.out.println("Start testGetReaderByTimestamp()");
-    RaftServer.setReadOperationTimeoutMS(10000);
+    ClusterConstant.setReadOperationTimeoutMS(10000);
     mockDataClusterServer = true;
     InsertRowPlan insertPlan = new InsertRowPlan();
     insertPlan.setNeedInferType(true);
@@ -960,7 +954,7 @@ public class MetaGroupMemberTest extends BaseMember {
     insertPlan.setNeedInferType(true);
     insertPlan.setMeasurements(new String[] {TestUtils.getTestMeasurement(0)});
     insertPlan.setDataTypes(new TSDataType[insertPlan.getMeasurements().length]);
-    RaftServer.setReadOperationTimeoutMS(1000);
+    ClusterConstant.setReadOperationTimeoutMS(1000);
 
     for (int i = 0; i < 10; i++) {
       insertPlan.setPrefixPath(new PartialPath(TestUtils.getTestSg(i)));
@@ -1112,7 +1106,7 @@ public class MetaGroupMemberTest extends BaseMember {
   @Test
   public void testRemoteAddNode() {
     System.out.println("Start testRemoteAddNode()");
-    int prevTimeout = RaftServer.getConnectionTimeoutInMS();
+    int prevTimeout = ClusterConstant.getConnectionTimeoutInMS();
 
     try {
       // cannot add node when partition table is not built
@@ -1245,7 +1239,7 @@ public class MetaGroupMemberTest extends BaseMember {
 
     } finally {
       testMetaMember.stop();
-      RaftServer.setConnectionTimeoutInMS(prevTimeout);
+      ClusterConstant.setConnectionTimeoutInMS(prevTimeout);
     }
   }
 
diff --git a/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java b/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
index d37f57e..60179af 100644
--- a/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
+++ b/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
@@ -49,9 +49,15 @@ public enum ThreadName {
   CLUSTER_INFO_SERVICE("ClusterInfoClient"),
   CLUSTER_RPC_SERVICE("ClusterRPC"),
   CLUSTER_RPC_CLIENT("Cluster-RPC-Client"),
-  CLUSTER_META_SERVICE("ClusterMetaService"),
-  CLUSTER_META_HEARTBEAT_SERVICE("ClusterMetaHeartbeatService"),
-  CLUSTER_DATA_SERVICE("ClusterDataService");
+  CLUSTER_META_RPC_SERVICE("ClusterMetaRPC"),
+  CLUSTER_META_RPC_CLIENT("ClusterMetaRPC-Client"),
+  CLUSTER_META_HEARTBEAT_RPC_SERVICE("ClusterMetaHeartbeatRPC"),
+  CLUSTER_META_HEARTBEAT_RPC_CLIENT("ClusterMetaHeartbeatRPC-Client"),
+  CLUSTER_DATA_RPC_SERVICE("ClusterDataRPC"),
+  CLUSTER_DATA_RPC_CLIENT("ClusterDataRPC-Client"),
+  CLUSTER_DATA_HEARTBEAT_RPC_SERVICE("ClusterDataHeartbeatRPC"),
+  CLUSTER_DATA_HEARTBEAT_RPC_CLIENT("ClusterDataHeartbeatRPC-Client"),
+  ;
 
   private final String name;
 
diff --git a/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java b/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
index 90b0136..34d892c 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
@@ -58,9 +58,12 @@ public enum ServiceType {
 
   CLUSTER_RPC_SERVICE("Cluster RPC Service", "ClusterRPCService"),
   CLUSTER_META_RPC_SERVICE("Cluster Meta RPC Service", "ClusterMetaRPCService"),
+  CLUSTER_META_HEART_BEAT_RPC_SERVICE(
+      "Cluster Meta Heartbeat RPC Service", "ClusterMetaHeartbeatRPCService"),
   CLUSTER_DATA_RPC_SERVICE("Cluster Data RPC Service", "ClusterDataRPCService"),
+  CLUSTER_DATA_HEART_BEAT_RPC_SERVICE(
+      "Cluster Data Heartbeat RPC Service", "ClusterDataHeartbeatRPCService"),
   CLUSTER_META_ENGINE("Cluster Meta Engine", "ClusterMetaEngine"),
-  CLUSTER_META_HEART_BEAT("Cluster Meta Heartbeat Service", "ClusterMetaHeartbeat"),
   ;
 
   private final String name;
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
index 45fb0ec..b6acaa8 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.StartupException;
 import org.apache.iotdb.db.service.IService;
 import org.apache.iotdb.db.service.JMXService;
+
 import org.apache.thrift.TProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -109,9 +110,9 @@ public abstract class ThriftService implements IService {
     try {
       reset();
       initTProcessor();
-      if (setSyncedImpl || setAsyncedImpl) {
+      if (!setSyncedImpl && !setAsyncedImpl) {
         throw new StartupException(
-            "At least one service implementataion of {} should be set.", this.getID().getName());
+            getID().getName(), "At least one service implementataion should be set.");
       }
       initThriftServiceThread();
       thriftServiceThread.setThreadStopLatch(stopLatch);
diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
index ed2237d..3760974 100644
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.db.conf.IoTDBConstant;
 import org.apache.iotdb.db.exception.runtime.RPCServiceException;
 import org.apache.iotdb.db.utils.CommonUtils;
 import org.apache.iotdb.rpc.RpcTransportFactory;
+
 import org.apache.thrift.TBaseAsyncProcessor;
 import org.apache.thrift.TProcessor;
 import org.apache.thrift.protocol.TBinaryProtocol;
diff --git a/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java b/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
index c7a1b9e..a197397 100644
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.db.sync.receiver.load.FileLoaderManager;
 import org.apache.iotdb.db.sync.receiver.recover.SyncReceiverLogAnalyzer;
 import org.apache.iotdb.db.sync.receiver.transfer.SyncServiceImpl;
 import org.apache.iotdb.service.sync.thrift.SyncService;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

[iotdb] 04/07: Merge remote-tracking branch 'origin/master' into cluster-

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit ae1e677ea89c2f60d83f20dea426949bf8429a96
Merge: bba25de 40fa7b3
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Sun Aug 8 00:02:00 2021 +0800

    Merge remote-tracking branch 'origin/master' into cluster-

 client-cpp/src/main/Session.cpp                    |   9 +-
 client-cpp/src/main/Session.h                      |   4 +-
 client-cpp/src/test/main.cpp                       |   6 +-
 .../main/java/org/apache/iotdb/SessionExample.java |  33 +++++++
 .../resources/conf/iotdb-engine.properties         |   6 +-
 .../apache/iotdb/db/cost/statistic/Operation.java  |   3 +-
 .../compaction/CompactionMergeTaskPoolManager.java |  13 +--
 .../engine/storagegroup/StorageGroupProcessor.java |   3 +
 .../iotdb/db/engine/upgrade/UpgradeTask.java       |  60 ++++++++++---
 .../iotdb/db/query/control/SessionManager.java     |  17 ++--
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  19 ++--
 .../org/apache/iotdb/db/service/UpgradeSevice.java |  24 ++---
 .../apache/iotdb/db/tools/TsFileRewriteTool.java   |  30 +++++--
 .../db/tools/upgrade/TsFileOnlineUpgradeTool.java  |   4 +-
 .../org/apache/iotdb/db/utils/UpgradeUtils.java    |  10 ---
 site/README-zh.md                                  |   9 +-
 site/README.md                                     |   5 ++
 site/pom.xml                                       | 100 ++++++++++++---------
 site/src/main/.asf.yaml                            |  25 ++++++
 .../iotdb/tsfile/write/chunk/ChunkWriterImpl.java  |  28 ++++--
 20 files changed, 281 insertions(+), 127 deletions(-)

[iotdb] 02/07: Merge remote-tracking branch 'origin/master' into cluster-

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 19c9456e9f57d38f1e6a8923e0f865fe89a44072
Merge: 5bdf918 204b7d3
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Aug 3 20:56:24 2021 +0800

    Merge remote-tracking branch 'origin/master' into cluster-

 CONTRIBUTING.md                                    |   2 +-
 Jenkinsfile                                        |   2 +-
 README.md                                          |   2 +-
 README_ZH.md                                       |   4 +-
 client-cpp/src/main/Session.cpp                    | 754 +++++++++------------
 client-cpp/src/main/Session.h                      | 563 ++++++++-------
 .../apache/iotdb/cluster/metadata/CMManager.java   |   3 +-
 compile-tools/thrift/pom.xml                       |   3 +-
 .../Data-Concept/Data-Model-and-Terminology.md     | 195 ++----
 docs/UserGuide/Data-Concept/Data-Type.md           | 125 ++++
 .../Data-Concept/Data-Model-and-Terminology.md     | 195 ++----
 docs/zh/UserGuide/Data-Concept/Data-Type.md        | 123 ++++
 .../org/apache/iotdb/db/metadata/MManager.java     | 156 ++---
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  65 +-
 .../org/apache/iotdb/db/metadata/MetaUtils.java    |   4 +-
 .../db/metadata/template/TemplateManager.java      |  63 +-
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |   3 +-
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |  24 +-
 .../iotdb/db/integration/IoTDBAlignByDeviceIT.java |  54 ++
 .../iotdb/db/metadata/MManagerBasicTest.java       | 251 ++++---
 .../iotdb/db/metadata/MManagerImproveTest.java     |   2 +-
 .../theme/global-components/Contributor.vue        |   7 +
 22 files changed, 1338 insertions(+), 1262 deletions(-)


[iotdb] 01/07: temporary commit for refactor thrift rpc

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 5bdf9187b5a6a74904b5d2f64ff1b564188b8ee8
Merge: 4f92cc5 b484f2e
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Aug 3 19:17:27 2021 +0800

    temporary commit for refactor thrift rpc

 README_ZH.md                                       |    2 +-
 .../antlr4/org/apache/iotdb/db/qp/sql/SqlBase.g4   |   73 +-
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     |  159 ++--
 .../iotdb/cluster/config/ClusterConstant.java      |   52 +
 .../iotdb/cluster/coordinator/Coordinator.java     |    8 +-
 .../iotdb/cluster/log/applier/BaseApplier.java     |   17 +-
 .../log/manage/PartitionedSnapshotLogManager.java  |    8 +-
 .../apache/iotdb/cluster/metadata/CMManager.java   |  223 ++---
 .../apache/iotdb/cluster/metadata/MetaPuller.java  |   27 +-
 .../cluster/query/ClusterPhysicalGenerator.java    |   18 +-
 .../iotdb/cluster/query/ClusterPlanExecutor.java   |   44 +-
 .../apache/iotdb/cluster/query/ClusterPlanner.java |   17 +-
 .../iotdb/cluster/query/ClusterQueryRouter.java    |   40 +
 .../cluster/query/ClusterUDTFQueryExecutor.java    |  111 +++
 .../iotdb/cluster/query/LocalQueryExecutor.java    |   32 +-
 .../cluster/query/aggregate/ClusterAggregator.java |    9 +-
 .../cluster/query/fill/ClusterPreviousFill.java    |   10 +-
 .../query/groupby/RemoteGroupByExecutor.java       |   27 +-
 .../query/last/ClusterLastQueryExecutor.java       |   26 +-
 .../cluster/query/manage/ClusterQueryManager.java  |    8 +-
 .../cluster/query/reader/ClusterReaderFactory.java |    9 +-
 .../cluster/query/reader/ClusterTimeGenerator.java |   14 +-
 .../iotdb/cluster/query/reader/DataSourceInfo.java |   28 +-
 .../reader/RemoteSeriesReaderByTimestamp.java      |    3 +
 .../query/reader/RemoteSimpleSeriesReader.java     |    3 +
 .../query/reader/mult/MultDataSourceInfo.java      |    8 +-
 .../query/reader/mult/RemoteMultSeriesReader.java  |   10 +-
 .../iotdb/cluster/server/ClusterRPCService.java    |   17 +-
 .../iotdb/cluster/server/ClusterTSServiceImpl.java |  112 +--
 .../iotdb/cluster/server/MetaClusterServer.java    |  369 -------
 .../iotdb/cluster/server/MetaClusterServer2.java   |  372 ++++++++
 .../apache/iotdb/cluster/server/RaftServer.java    |  263 -----
 .../cluster/server/heartbeat/HeartbeatThread.java  |    6 +
 .../server/heartbeat/MetaHeartbeatServer.java      |   13 +-
 .../cluster/server/member/MetaGroupMember.java     |   72 +-
 .../apache/iotdb/cluster/utils/PartitionUtils.java |    4 +-
 .../cluster/utils/nodetool/ClusterMonitor.java     |   11 +-
 .../org/apache/iotdb/cluster/common/IoTDBTest.java |    7 +-
 .../org/apache/iotdb/cluster/common/TestUtils.java |    7 +-
 .../cluster/integration/BaseSingleNodeTest.java    |    9 +-
 .../cluster/log/applier/DataLogApplierTest.java    |   40 +-
 .../cluster/log/logtypes/SerializeLogTest.java     |    4 +-
 .../cluster/log/snapshot/FileSnapshotTest.java     |    2 +-
 .../iotdb/cluster/partition/MManagerWhiteBox.java  |    2 +-
 .../query/ClusterAggregateExecutorTest.java        |    4 +-
 .../query/ClusterDataQueryExecutorTest.java        |   10 +-
 .../cluster/query/ClusterFillExecutorTest.java     |    4 +-
 .../query/ClusterPhysicalGeneratorTest.java        |    3 +-
 .../cluster/query/ClusterPlanExecutorTest.java     |    8 +-
 .../cluster/query/ClusterQueryRouterTest.java      |   44 +-
 .../query/ClusterUDTFQueryExecutorTest.java        |  116 +++
 .../iotdb/cluster/query/LoadConfigurationTest.java |    2 +-
 .../ClusterGroupByNoVFilterDataSetTest.java        |    2 +-
 .../groupby/ClusterGroupByVFilterDataSetTest.java  |    2 +-
 .../query/groupby/MergeGroupByExecutorTest.java    |    4 +-
 .../query/groupby/RemoteGroupByExecutorTest.java   |    4 +-
 .../query/manage/ClusterQueryManagerTest.java      |   12 +-
 .../query/reader/ClusterReaderFactoryTest.java     |    2 +-
 .../query/reader/ClusterTimeGeneratorTest.java     |    4 +-
 .../clusterinfo/ClusterInfoServiceImplTest.java    |   13 +-
 .../cluster/server/member/DataGroupMemberTest.java |   14 +-
 .../cluster/server/member/MetaGroupMemberTest.java |   12 +-
 docs/Development/ContributeGuide.md                |   37 +-
 docs/SystemDesign/SchemaManager/SchemaManager.md   |   39 +-
 docs/SystemDesign/TsFile/Format.md                 |  477 +++++-----
 docs/UserGuide/Advanced-Features/Select-Into.md    |  235 +++++
 .../Programming-MQTT.md                            |   79 +-
 .../UserGuide/Ecosystem Integration/Flink IoTDB.md |    3 +-
 .../DDL-Data-Definition-Language.md                |    6 +-
 .../UserGuide/System-Tools/Load-External-Tsfile.md |   32 +-
 docs/zh/Community/Community-Powered By.md          |   41 +-
 docs/zh/Community/Feedback.md                      |   18 +-
 docs/zh/Development/Committer.md                   |   38 +-
 docs/zh/Development/ContributeGuide.md             |   59 +-
 docs/zh/Development/HowToCommit.md                 |   40 +-
 docs/zh/Development/VoteRelease.md                 |    7 +-
 docs/zh/Download/README.md                         |   73 +-
 docs/zh/SystemDesign/Architecture/Architecture.md  |    1 -
 docs/zh/SystemDesign/Client/RPC.md                 |    3 -
 docs/zh/SystemDesign/Connector/Hive-TsFile.md      |   11 +-
 docs/zh/SystemDesign/Connector/Spark-IOTDB.md      |   39 +-
 docs/zh/SystemDesign/Connector/Spark-TsFile.md     |   25 +-
 docs/zh/SystemDesign/DataQuery/AggregationQuery.md |   31 +-
 .../SystemDesign/DataQuery/AlignByDeviceQuery.md   |   12 +-
 docs/zh/SystemDesign/DataQuery/FillFunction.md     |   30 +-
 docs/zh/SystemDesign/DataQuery/GroupByFillQuery.md |   37 +-
 docs/zh/SystemDesign/DataQuery/GroupByQuery.md     |   48 +-
 docs/zh/SystemDesign/DataQuery/LastQuery.md        |   22 +-
 docs/zh/SystemDesign/DataQuery/OrderByTimeQuery.md |   75 +-
 .../zh/SystemDesign/DataQuery/QueryFundamentals.md |   58 +-
 docs/zh/SystemDesign/DataQuery/RawDataQuery.md     |   62 +-
 docs/zh/SystemDesign/DataQuery/SeriesReader.md     |   24 +-
 docs/zh/SystemDesign/QueryEngine/Planner.md        |    1 -
 .../QueryEngine/ResultSetConstruction.md           |    2 +-
 .../zh/SystemDesign/SchemaManager/SchemaManager.md |  190 ++--
 docs/zh/SystemDesign/StorageEngine/Compaction.md   |   40 +-
 .../SystemDesign/StorageEngine/DataManipulation.md |   41 +-
 .../zh/SystemDesign/StorageEngine/DataPartition.md |   24 +-
 docs/zh/SystemDesign/StorageEngine/FileLists.md    |   39 +-
 docs/zh/SystemDesign/StorageEngine/FlushManager.md |    4 +-
 docs/zh/SystemDesign/StorageEngine/MergeManager.md |   22 +-
 docs/zh/SystemDesign/StorageEngine/Recover.md      |   29 +-
 .../zh/SystemDesign/StorageEngine/StorageEngine.md |    2 +-
 docs/zh/SystemDesign/StorageEngine/WAL.md          |    4 +-
 docs/zh/SystemDesign/Tools/Sync.md                 |  105 +-
 docs/zh/SystemDesign/TsFile/Format.md              |  584 ++++++------
 docs/zh/SystemDesign/TsFile/Read.md                |  110 +--
 docs/zh/SystemDesign/TsFile/TsFile.md              |    1 -
 docs/zh/SystemDesign/TsFile/Write.md               |    3 +-
 .../zh/UserGuide/API/Programming-Cpp-Native-API.md |   87 +-
 docs/zh/UserGuide/API/Programming-Go-Native-API.md |   18 +-
 docs/zh/UserGuide/API/Programming-JDBC.md          |   14 +-
 .../UserGuide/API/Programming-Java-Native-API.md   |   59 +-
 .../UserGuide/API/Programming-Python-Native-API.md |   70 +-
 docs/zh/UserGuide/API/Programming-TsFile-API.md    |  137 ++-
 docs/zh/UserGuide/API/Time-zone.md                 |    1 -
 .../Administration-Management/Administration.md    |   35 +-
 docs/zh/UserGuide/Advanced-Features/Alerting.md    |   15 +-
 .../Advanced-Features/Continuous-Query.md          |   17 +-
 docs/zh/UserGuide/Advanced-Features/Select-Into.md |  234 +++++
 docs/zh/UserGuide/Advanced-Features/Triggers.md    |  170 +---
 .../Advanced-Features/UDF-User-Defined-Function.md |  225 ++---
 docs/zh/UserGuide/Appendix/Config-Manual.md        |  139 ++-
 docs/zh/UserGuide/Appendix/SQL-Reference.md        |  160 ++--
 docs/zh/UserGuide/Appendix/Status-Codes.md         |   19 +-
 docs/zh/UserGuide/CLI/Command-Line-Interface.md    |  123 ++-
 docs/zh/UserGuide/Cluster/Cluster-Setup-Example.md |   12 +-
 docs/zh/UserGuide/Cluster/Cluster-Setup.md         |   67 +-
 .../Collaboration-of-Edge-and-Cloud/Sync-Tool.md   |   40 +-
 .../Programming-MQTT.md                            |  111 ++-
 .../Programming-Thrift.md                          |   30 +-
 docs/zh/UserGuide/Comparison/TSDB-Comparison.md    |  201 ++--
 docs/zh/UserGuide/Data-Concept/Compression.md      |   12 +-
 .../Data-Concept/Data-Model-and-Terminology.md     |   59 +-
 docs/zh/UserGuide/Data-Concept/Data-Type.md        |    4 +-
 docs/zh/UserGuide/Data-Concept/Encoding.md         |   24 +-
 docs/zh/UserGuide/Data-Concept/SDT.md              |   30 +-
 docs/zh/UserGuide/Ecosystem Integration/DBeaver.md |   20 +-
 .../UserGuide/Ecosystem Integration/Flink IoTDB.md |    5 +-
 .../Ecosystem Integration/Flink TsFile.md          |   17 +-
 docs/zh/UserGuide/Ecosystem Integration/Grafana.md |   72 +-
 .../UserGuide/Ecosystem Integration/Hive TsFile.md |   55 +-
 .../Ecosystem Integration/MapReduce TsFile.md      |   39 +-
 .../UserGuide/Ecosystem Integration/Spark IoTDB.md |   17 +-
 .../Ecosystem Integration/Spark TsFile.md          |   88 +-
 .../Ecosystem Integration/Writing Data on HDFS.md  |   46 +-
 .../Ecosystem Integration/Zeppelin-IoTDB.md        |   51 +-
 .../zh/UserGuide/FAQ/Frequently-asked-questions.md |   33 +-
 .../UserGuide/IoTDB-Introduction/Architecture.md   |   14 +-
 docs/zh/UserGuide/IoTDB-Introduction/Features.md   |    8 +-
 .../zh/UserGuide/IoTDB-Introduction/Publication.md |    2 +-
 docs/zh/UserGuide/IoTDB-Introduction/Scenario.md   |   20 +-
 .../UserGuide/IoTDB-Introduction/What-is-IoTDB.md  |    4 +-
 .../DDL-Data-Definition-Language.md                |   72 +-
 .../DML-Data-Manipulation-Language.md              |  364 ++++---
 .../IoTDB-SQL-Language/Maintenance-Command.md      |   10 +-
 docs/zh/UserGuide/QuickStart/Files.md              |   17 +-
 docs/zh/UserGuide/QuickStart/QuickStart.md         |   78 +-
 docs/zh/UserGuide/QuickStart/ServerFileList.md     |   64 +-
 docs/zh/UserGuide/QuickStart/WayToGetIoTDB.md      |   43 +-
 docs/zh/UserGuide/System-Tools/CSV-Tool.md         |   24 +-
 docs/zh/UserGuide/System-Tools/JMX-Tool.md         |   24 +-
 .../UserGuide/System-Tools/Load-External-Tsfile.md |   58 +-
 docs/zh/UserGuide/System-Tools/MLogParser-Tool.md  |    7 +-
 .../System-Tools/Monitor-and-Log-Tools.md          |   96 +-
 docs/zh/UserGuide/System-Tools/NodeTool.md         |  117 ++-
 .../Query-History-Visualization-Tool.md            |    6 +-
 docs/zh/UserGuide/System-Tools/Watermark-Tool.md   |   34 +-
 docs/zh/UserGuide/UserGuideReadme.md               |    9 +-
 .../org/apache/iotdb/flink/FlinkIoTDBSink.java     |   26 +-
 .../RPC.md => example/mqtt-customize/README.md     |   45 +-
 example/mqtt-customize/pom.xml                     |   42 +
 .../server/CustomizedJsonPayloadFormatter.java     |   62 ++
 .../org.apache.iotdb.db.mqtt.PayloadFormatter      |    1 +
 example/pom.xml                                    |    1 +
 .../iotdb/HybridTimeseriesSessionExample.java      |  129 +++
 .../org/apache/iotdb/SessionConcurrentExample.java |  199 ++++
 .../main/java/org/apache/iotdb/SessionExample.java |   14 +
 .../iotdb/tsfile/TsFileWriteVectorWithTablet.java  |   89 +-
 .../java/org/apache/iotdb/flink/IoTDBSink.java     |   26 +-
 .../iotdb/flink/options/IoTDBSinkOptions.java      |   11 -
 ...tITCase.java => RowTSRecordOutputFormatIT.java} |    2 +-
 ...rmatITCase.java => RowTsFileInputFormatIT.java} |    2 +-
 pom.xml                                            |    2 +
 .../resources/conf/iotdb-engine.properties         |   24 +
 .../org/apache/iotdb/db/auth/AuthorityChecker.java |    1 +
 .../db/concurrent/IoTDBThreadPoolFactory.java      |   18 +
 .../org/apache/iotdb/db/concurrent/ThreadName.java |    5 +-
 .../java/org/apache/iotdb/db/conf/IoTDBConfig.java |   50 +
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   43 +-
 .../apache/iotdb/db/cq/ContinuousQueryTask.java    |    6 +-
 .../org/apache/iotdb/db/engine/StorageEngine.java  |  183 ++--
 .../db/engine/cache/TimeSeriesMetadataCache.java   |   71 +-
 .../level/LevelCompactionTsFileManagement.java     |    2 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |   15 +-
 .../apache/iotdb/db/engine/memtable/IMemTable.java |    2 +
 .../iotdb/db/engine/merge/task/MergeTask.java      |   10 +-
 .../selectinto/InsertTabletPlanGenerator.java      |  254 +++++
 .../selectinto/InsertTabletPlansIterator.java      |  139 +++
 .../engine/storagegroup/StorageGroupProcessor.java |  196 ++--
 .../db/engine/storagegroup/TsFileProcessor.java    |   10 +-
 .../db/engine/storagegroup/TsFileResource.java     |   10 +-
 .../storagegroup/timeindex/DeviceTimeIndex.java    |   13 +-
 .../storagegroup/timeindex/FileTimeIndex.java      |    5 +
 .../engine/storagegroup/timeindex/ITimeIndex.java  |    8 +
 .../storagegroup/timeindex/TimeIndexLevel.java     |   10 -
 .../virtualSg/VirtualStorageGroupManager.java      |  110 ++-
 .../db/engine/trigger/executor/TriggerEngine.java  |   16 +-
 .../engine/trigger/executor/TriggerExecutor.java   |    8 +-
 .../service/TriggerRegistrationService.java        |   10 +-
 .../exception/query/PathNumOverLimitException.java |   13 +-
 .../org/apache/iotdb/db/metadata/MManager.java     | 1004 ++++++--------------
 .../java/org/apache/iotdb/db/metadata/MTree.java   |  657 ++++++++-----
 .../org/apache/iotdb/db/metadata/MetaUtils.java    |   18 +-
 .../iotdb/db/metadata/MetadataOperationType.java   |    4 +
 .../db/metadata/{ => logfile}/MLogTxtWriter.java   |   71 +-
 .../iotdb/db/metadata/logfile/MLogWriter.java      |   24 +-
 .../db/metadata/{ => logfile}/TagLogFile.java      |    2 +-
 .../iotdb/db/metadata/mnode/EntityMNode.java       |  117 +++
 .../iotdb/db/metadata/mnode/IEntityMNode.java      |   55 ++
 .../org/apache/iotdb/db/metadata/mnode/IMNode.java |   82 ++
 .../iotdb/db/metadata/mnode/IMeasurementMNode.java |   58 ++
 .../mnode/IStorageGroupMNode.java}                 |   14 +-
 .../iotdb/db/metadata/mnode/InternalMNode.java     |  271 ++++++
 .../org/apache/iotdb/db/metadata/mnode/MNode.java  |  339 +------
 .../iotdb/db/metadata/mnode/MeasurementMNode.java  |  207 ++--
 ...roupMNode.java => StorageGroupEntityMNode.java} |   23 +-
 .../iotdb/db/metadata/mnode/StorageGroupMNode.java |   11 +-
 .../apache/iotdb/db/metadata/tag/TagManager.java   |  556 +++++++++++
 .../iotdb/db/metadata/template/Template.java       |   11 +-
 .../db/metadata/template/TemplateManager.java      |  141 +++
 .../org/apache/iotdb/db/monitor/StatMonitor.java   |    2 +-
 .../main/java/org/apache/iotdb/db/qp/Planner.java  |   51 +-
 .../apache/iotdb/db/qp/constant/SQLConstant.java   |    4 +
 .../apache/iotdb/db/qp/executor/PlanExecutor.java  |   73 +-
 .../org/apache/iotdb/db/qp/logical/Operator.java   |    6 +-
 .../iotdb/db/qp/logical/crud/QueryOperator.java    |  185 ++--
 .../db/qp/logical/crud/SelectIntoOperator.java     |  110 +++
 .../iotdb/db/qp/logical/sys/LoadFilesOperator.java |   25 +-
 .../apache/iotdb/db/qp/physical/PhysicalPlan.java  |   38 +-
 .../db/qp/physical/crud/AlignByDevicePlan.java     |   57 +-
 .../iotdb/db/qp/physical/crud/InsertPlan.java      |   12 +-
 .../iotdb/db/qp/physical/crud/InsertRowPlan.java   |    3 +-
 .../iotdb/db/qp/physical/crud/MeasurementInfo.java |   75 ++
 .../iotdb/db/qp/physical/crud/SelectIntoPlan.java  |  113 +++
 ...emplatePlan.java => SetSchemaTemplatePlan.java} |   14 +-
 .../iotdb/db/qp/physical/sys/OperateFilePlan.java  |   23 +-
 ...tePlan.java => SetUsingSchemaTemplatePlan.java} |   16 +-
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    |  191 ++--
 .../iotdb/db/qp/strategy/LogicalChecker.java       |    5 +
 .../iotdb/db/qp/strategy/PhysicalGenerator.java    |   24 +-
 .../qp/strategy/optimizer/ConcatPathOptimizer.java |    8 +-
 .../qp/strategy/optimizer/ILogicalOptimizer.java   |    3 +-
 .../apache/iotdb/db/qp/utils/WildcardsRemover.java |   28 +-
 .../db/query/control/QueryResourceManager.java     |  100 +-
 .../iotdb/db/query/control/QueryTimeManager.java   |   14 +
 .../iotdb/db/query/control/SessionManager.java     |   10 +-
 .../apache/iotdb/db/query/control/TracingInfo.java |   85 ++
 .../iotdb/db/query/control/TracingManager.java     |  141 ++-
 .../db/query/dataset/AlignByDeviceDataSet.java     |   26 +-
 .../iotdb/db/query/executor/LastQueryExecutor.java |    6 +-
 .../iotdb/db/query/reader/series/SeriesReader.java |   99 +-
 .../reader/universal/DescPriorityMergeReader.java  |    5 +-
 .../reader/universal/PriorityMergeReader.java      |   13 +-
 .../apache/iotdb/db/rescon/MemTableManager.java    |    4 +
 .../apache/iotdb/db/rescon/TVListAllocator.java    |   12 +-
 .../java/org/apache/iotdb/db/service/IoTDB.java    |    4 +-
 .../org/apache/iotdb/db/service/RPCService.java    |    1 +
 .../org/apache/iotdb/db/service/ServiceType.java   |    7 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |  313 +++---
 .../org/apache/iotdb/db/service/UpgradeSevice.java |    9 +-
 .../iotdb/db/service/thrift/ThriftService.java     |   18 +-
 .../db/service/thrift/ThriftServiceThread.java     |  220 ++++-
 .../iotdb/db/sync/receiver/SyncServerManager.java  |    7 +-
 .../apache/iotdb/db/tools/TsFileSketchTool.java    |  583 ++++++++----
 .../org/apache/iotdb/db/tools/mlog/MLogParser.java |   19 +-
 .../org/apache/iotdb/db/utils/SchemaUtils.java     |   21 +-
 .../iotdb/db/writelog/recover/LogReplayer.java     |    6 +-
 .../writelog/recover/TsFileRecoverPerformer.java   |   26 +-
 .../db/engine/memtable/MemTableFlushTaskTest.java  |   22 +-
 .../db/engine/memtable/MemTableTestUtils.java      |    5 +-
 .../db/engine/memtable/PrimitiveMemTableTest.java  |    3 +-
 .../storagegroup/StorageGroupProcessorTest.java    |   84 +-
 .../iotdb/db/engine/storagegroup/TTLTest.java      |    9 +-
 .../engine/storagegroup/TsFileProcessorTest.java   |   14 +-
 .../iotdb/db/integration/IoTDBAddSubDeviceIT.java  |   11 +-
 .../iotdb/db/integration/IoTDBAlignByDeviceIT.java |    3 +-
 .../org/apache/iotdb/db/integration/IoTDBAsIT.java |    2 +-
 .../db/integration/IoTDBAutoCreateSchemaIT.java    |    6 +-
 .../db/integration/IoTDBContinuousQueryIT.java     |  147 ++-
 .../db/integration/IoTDBCreateStorageGroupIT.java  |  128 +++
 .../db/integration/IoTDBCreateTimeseriesIT.java    |   34 +-
 .../db/integration/IoTDBInsertWithoutTimeIT.java   |  129 +++
 .../apache/iotdb/db/integration/IoTDBLastIT.java   |   22 +-
 .../db/integration/IoTDBLoadExternalTsfileIT.java  |  121 ++-
 .../iotdb/db/integration/IoTDBMetadataFetchIT.java |   20 +-
 .../db/integration/IoTDBQueryMemoryControlIT.java  |   20 +-
 .../iotdb/db/integration/IoTDBRestartIT.java       |   48 +
 .../iotdb/db/integration/IoTDBSelectIntoIT.java    |  617 ++++++++++++
 .../db/integration/IoTDBSequenceDataQueryIT.java   |   12 +-
 .../iotdb/db/integration/IoTDBSeriesReaderIT.java  |   11 +-
 .../iotdb/db/integration/IoTDBSimpleQueryIT.java   |   14 +-
 .../db/integration/IoTDBTriggerExecutionIT.java    |   43 +-
 .../iotdb/db/metadata/MManagerAdvancedTest.java    |   20 +-
 .../iotdb/db/metadata/MManagerBasicTest.java       |  170 ++--
 .../iotdb/db/metadata/MManagerImproveTest.java     |    8 +-
 .../org/apache/iotdb/db/metadata/MTreeTest.java    |  103 +-
 .../apache/iotdb/db/metadata/MetaUtilsTest.java    |   14 +-
 .../apache/iotdb/db/metadata/mnode/MNodeTest.java  |   41 +-
 .../iotdb/db/qp/logical/LogicalPlanSmallTest.java  |    2 +-
 .../iotdb/db/qp/physical/InsertRowPlanTest.java    |    8 +-
 .../iotdb/db/qp/physical/InsertTabletPlanTest.java |   14 +-
 .../iotdb/db/qp/physical/PhysicalPlanTest.java     |   83 +-
 .../iotdb/db/query/control/TracingManagerTest.java |    7 +-
 .../query/reader/series/SeriesReaderTestUtil.java  |    2 +-
 .../org/apache/iotdb/db/tools/MLogParserTest.java  |   71 +-
 .../iotdb/db/tools/TsFileSketchToolTest.java       |    4 +-
 .../apache/iotdb/db/utils/EnvironmentUtils.java    |   11 +-
 .../iotdb/db/utils/TsFileRewriteToolTest.java      |    4 +-
 .../iotdb/db/writelog/recover/LogReplayerTest.java |    3 +-
 .../db/writelog/recover/SeqTsFileRecoverTest.java  |    2 +-
 .../apache/iotdb/session/IoTDBSessionSimpleIT.java |    6 +-
 .../apache/iotdb/session/IoTDBSessionVectorIT.java |  213 +++++
 .../java/org/apache/iotdb/session/SessionTest.java |    2 +-
 site/README.md                                     |    2 +-
 site/src/main/.vuepress/config.js                  |   31 +-
 site/src/main/.vuepress/theme/components/Page.vue  |   15 +-
 .../apache/iotdb/spark/db/EnvironmentUtils.java    |  111 ++-
 .../test/java/org/apache/iotdb/db/sql/Cases.java   |  235 ++---
 .../file/metadata/MetadataIndexConstructor.java    |   52 +-
 .../iotdb/tsfile/read/TsFileSequenceReader.java    |   17 +-
 .../org/apache/iotdb/tsfile/read/common/Path.java  |    4 +
 .../java/org/apache/iotdb/tsfile/utils/BitMap.java |    5 +
 .../apache/iotdb/tsfile/write/TsFileWriter.java    |   12 +-
 .../tsfile/write/chunk/ChunkGroupWriterImpl.java   |   77 +-
 .../tsfile/write/chunk/VectorChunkWriterImpl.java  |    5 +-
 .../tsfile/write/schema/IMeasurementSchema.java    |    5 +
 .../tsfile/write/schema/MeasurementSchema.java     |   12 +-
 .../apache/iotdb/tsfile/write/schema/Schema.java   |   28 +-
 .../write/schema/VectorMeasurementSchema.java      |   12 +-
 .../iotdb/tsfile/write/writer/TsFileIOWriter.java  |   10 +
 ...ateTest.java => DefaultSchemaTemplateTest.java} |    8 +-
 .../tsfile/write/MetadataIndexConstructorTest.java |  478 ++++++++++
 .../write/schema/converter/SchemaBuilderTest.java  |    4 +-
 .../write/writer/VectorChunkWriterImplTest.java    |   34 +-
 .../write/writer/VectorMeasurementSchemaStub.java  |   12 +-
 346 files changed, 12967 insertions(+), 7924 deletions(-)

diff --cc cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index cec70b2,adc4661..4fcb5a5
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@@ -22,33 -22,28 +22,40 @@@ import org.apache.iotdb.cluster.client.
  import org.apache.iotdb.cluster.client.sync.SyncClientAdaptor;
  import org.apache.iotdb.cluster.config.ClusterConfig;
  import org.apache.iotdb.cluster.config.ClusterDescriptor;
++import org.apache.iotdb.cluster.coordinator.Coordinator;
  import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
  import org.apache.iotdb.cluster.exception.StartUpCheckFailureException;
++import org.apache.iotdb.cluster.metadata.CMManager;
++import org.apache.iotdb.cluster.metadata.MetaPuller;
  import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
  import org.apache.iotdb.cluster.partition.slot.SlotStrategy;
  import org.apache.iotdb.cluster.rpc.thrift.Node;
 -import org.apache.iotdb.cluster.server.MetaClusterServer;
 +import org.apache.iotdb.cluster.server.ClusterRPCService;
- import org.apache.iotdb.cluster.server.MetaClusterServer;
++import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
  import org.apache.iotdb.cluster.server.Response;
  import org.apache.iotdb.cluster.server.clusterinfo.ClusterInfoServer;
++import org.apache.iotdb.cluster.server.member.MetaGroupMember;
++import org.apache.iotdb.cluster.server.raft.MetaRaftHeartBeatService;
++import org.apache.iotdb.cluster.server.raft.MetaRaftService;
++import org.apache.iotdb.cluster.server.service.MetaAsyncService;
++import org.apache.iotdb.cluster.server.service.MetaSyncService;
  import org.apache.iotdb.cluster.utils.ClusterUtils;
 +import org.apache.iotdb.cluster.utils.nodetool.ClusterMonitor;
  import org.apache.iotdb.db.conf.IoTDBConfigCheck;
  import org.apache.iotdb.db.conf.IoTDBConstant;
  import org.apache.iotdb.db.conf.IoTDBDescriptor;
  import org.apache.iotdb.db.exception.StartupException;
  import org.apache.iotdb.db.exception.query.QueryProcessException;
 +import org.apache.iotdb.db.service.IoTDB;
 +import org.apache.iotdb.db.service.JMXService;
 +import org.apache.iotdb.db.service.RegisterManager;
++import org.apache.iotdb.db.service.thrift.ThriftServiceThread;
  import org.apache.iotdb.db.utils.TestOnly;
--
  import org.apache.thrift.TException;
  import org.apache.thrift.async.TAsyncClientManager;
  import org.apache.thrift.protocol.TBinaryProtocol.Factory;
  import org.apache.thrift.protocol.TCompactProtocol;
  import org.apache.thrift.protocol.TProtocolFactory;
--import org.apache.thrift.transport.TTransportException;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -58,12 -53,9 +65,13 @@@ import java.util.Set
  
  import static org.apache.iotdb.cluster.utils.ClusterUtils.UNKNOWN_CLIENT_IP;
  
- //we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
 -public class ClusterMain {
++// we do not inherent IoTDB instance, as it may break the singleton mode of IoTDB.
 +public class ClusterIoTDB {
  
 -  private static final Logger logger = LoggerFactory.getLogger(ClusterMain.class);
 +  private static final Logger logger = LoggerFactory.getLogger(ClusterIoTDB.class);
 +  private final String mbeanName =
-       String.format("%s:%s=%s", IoTDBConstant.IOTDB_PACKAGE, IoTDBConstant.JMX_TYPE, "ClusterIoTDB");
++      String.format(
++          "%s:%s=%s", IoTDBConstant.IOTDB_PACKAGE, IoTDBConstant.JMX_TYPE, "ClusterIoTDB");
  
    // establish the cluster as a seed
    private static final String MODE_START = "-s";
@@@ -73,13 -65,8 +81,27 @@@
    // metaport-of-removed-node
    private static final String MODE_REMOVE = "-r";
  
-   private MetaClusterServer metaServer;
 -  private static MetaClusterServer metaServer;
++  private MetaGroupMember metaGroupEngine;
++  private Node thisNode;
++  private Coordinator coordinator;
 +
 +  private IoTDB iotdb = IoTDB.getInstance();
 +
 +  // Cluster IoTDB uses a individual registerManager with its parent.
 +  private RegisterManager registerManager = new RegisterManager();
 +
++  private ClusterIoTDB() {
++    ClusterConfig config = ClusterDescriptor.getInstance().getConfig();
++    thisNode = new Node();
++    // set internal rpc ip and ports
++    thisNode.setInternalIp(config.getInternalIp());
++    thisNode.setMetaPort(config.getInternalMetaPort());
++    thisNode.setDataPort(config.getInternalDataPort());
++    // set client rpc ip and ports
++    thisNode.setClientPort(config.getClusterRpcPort());
++    thisNode.setClientIp(IoTDBDescriptor.getInstance().getConfig().getRpcAddress());
++  }
+ 
    public static void main(String[] args) {
      if (args.length < 1) {
        logger.error(
@@@ -115,18 -103,50 +137,18 @@@
      String mode = args[0];
      logger.info("Running mode {}", mode);
  
 +    ClusterIoTDB cluster = ClusterIoTDBHolder.INSTANCE;
-     //we start IoTDB kernel first.
-     cluster.iotdb.active();
++    // we start IoTDB kernel first.
++    // cluster.iotdb.active();
 +
-     //then we start the cluster module.
++    // then we start the cluster module.
      if (MODE_START.equals(mode)) {
 -      try {
 -        metaServer = new MetaClusterServer();
 -        startServerCheck();
 -        preStartCustomize();
 -        metaServer.start();
 -        metaServer.buildCluster();
 -        // Currently, we do not register ClusterInfoService as a JMX Bean,
 -        // so we use startService() rather than start()
 -        ClusterInfoServer.getInstance().startService();
 -      } catch (TTransportException
 -          | StartupException
 -          | QueryProcessException
 -          | StartUpCheckFailureException
 -          | ConfigInconsistentException e) {
 -        metaServer.stop();
 -        logger.error("Fail to start meta server", e);
 -      }
 +      cluster.activeStartNodeMode();
      } else if (MODE_ADD.equals(mode)) {
 -      try {
 -        long startTime = System.currentTimeMillis();
 -        metaServer = new MetaClusterServer();
 -        preStartCustomize();
 -        metaServer.start();
 -        metaServer.joinCluster();
 -        // Currently, we do not register ClusterInfoService as a JMX Bean,
 -        // so we use startService() rather than start()
 -        ClusterInfoServer.getInstance().startService();
 -
 -        logger.info(
 -            "Adding this node {} to cluster costs {} ms",
 -            metaServer.getMember().getThisNode(),
 -            (System.currentTimeMillis() - startTime));
 -      } catch (TTransportException
 -          | StartupException
 -          | QueryProcessException
 -          | StartUpCheckFailureException
 -          | ConfigInconsistentException e) {
 -        metaServer.stop();
 -        logger.error("Fail to join cluster", e);
 -      }
 +      cluster.activeAddNodeMode();
      } else if (MODE_REMOVE.equals(mode)) {
        try {
 -        doRemoveNode(args);
 +        cluster.doRemoveNode(args);
        } catch (IOException e) {
          logger.error("Fail to remove node in cluster", e);
        }
@@@ -135,61 -155,7 +157,94 @@@
      }
    }
  
 -  private static void startServerCheck() throws StartupException {
 +  public void activeStartNodeMode() {
 +    try {
-       metaServer = new MetaClusterServer();
 +      startServerCheck();
 +      preStartCustomize();
-       metaServer.start();
-       metaServer.buildCluster();
++
++      coordinator = new Coordinator();
++      // register MetaGroupMember. MetaGroupMember has the same position with "StorageEngine" in the
++      // cluster moduel.
++      // TODO fixme it is better to remove coordinator out of metaGroupEngine
++
++      // local engine
++      metaGroupEngine =
++          new MetaGroupMember(
++              ThriftServiceThread.getProtocolFactory(
++                  IoTDBDescriptor.getInstance().getConfig().isRpcThriftCompressionEnable()),
++              thisNode,
++              coordinator);
++      IoTDB.setMetaManager(CMManager.getInstance());
++      ((CMManager) IoTDB.metaManager).setMetaGroupMember(metaGroupEngine);
++      ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
++      MetaPuller.getInstance().init(metaGroupEngine);
++      iotdb.active();
++
++      registerManager.register(metaGroupEngine);
++
++      metaGroupEngine.buildCluster();
++
++      // rpc service
++      if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
++        MetaAsyncService metaAsyncService = new MetaAsyncService(metaGroupEngine);
++        MetaRaftHeartBeatService.getInstance().initAsyncedServiceImpl(metaAsyncService);
++        MetaRaftService.getInstance().initAsyncedServiceImpl(metaAsyncService);
++      } else {
++        MetaSyncService syncService = new MetaSyncService(metaGroupEngine);
++        MetaRaftHeartBeatService.getInstance().initSyncedServiceImpl(syncService);
++        MetaRaftService.getInstance().initSyncedServiceImpl(syncService);
++      }
++
++      // meta group heart beat rpc
++      registerManager.register(MetaRaftHeartBeatService.getInstance());
++      registerManager.register(MetaRaftService.getInstance());
++
 +      // Currently, we do not register ClusterInfoService as a JMX Bean,
 +      // so we use startService() rather than start()
 +      ClusterInfoServer.getInstance().startService();
 +      // JMX based DBA API
 +      registerManager.register(ClusterMonitor.INSTANCE);
 +      // we must wait until the metaGroup established.
 +      // So that the ClusterRPCService can work.
 +      registerManager.register(ClusterRPCService.getInstance());
-     } catch (TTransportException
-         | StartupException
++    } catch (StartupException
 +        | QueryProcessException
 +        | StartUpCheckFailureException
 +        | ConfigInconsistentException e) {
 +      stop();
 +      logger.error("Fail to start meta server", e);
 +    }
 +  }
 +
 +  public void activeAddNodeMode() {
-     try {
-       long startTime = System.currentTimeMillis();
-       metaServer = new MetaClusterServer();
-       preStartCustomize();
-       metaServer.start();
-       metaServer.joinCluster();
-       // Currently, we do not register ClusterInfoService as a JMX Bean,
-       // so we use startService() rather than start()
-       ClusterInfoServer.getInstance().startService();
-       // JMX based DBA API
-       registerManager.register(ClusterMonitor.INSTANCE);
-       //finally, we start the RPC service
-       registerManager.register(ClusterRPCService.getInstance());
-       logger.info(
-           "Adding this node {} to cluster costs {} ms",
-           metaServer.getMember().getThisNode(),
-           (System.currentTimeMillis() - startTime));
-     } catch (TTransportException
-         | StartupException
-         | QueryProcessException
-         | StartUpCheckFailureException
-         | ConfigInconsistentException e) {
-       stop();
-       logger.error("Fail to join cluster", e);
-     }
++    //    try {
++    //      long startTime = System.currentTimeMillis();
++    //      metaServer = new RaftTSMetaServiceImpl();
++    //      preStartCustomize();
++    //      metaServer.start();
++    //      metaServer.joinCluster();
++    //      // Currently, we do not register ClusterInfoService as a JMX Bean,
++    //      // so we use startService() rather than start()
++    //      ClusterInfoServer.getInstance().startService();
++    //      // JMX based DBA API
++    //      registerManager.register(ClusterMonitor.INSTANCE);
++    //      // finally, we start the RPC service
++    //      registerManager.register(ClusterRPCService.getInstance());
++    //      logger.info(
++    //          "Adding this node {} to cluster costs {} ms",
++    //          metaServer.getMember().getThisNode(),
++    //          (System.currentTimeMillis() - startTime));
++    //    } catch (TTransportException
++    //        | StartupException
++    //        | QueryProcessException
++    //        | StartUpCheckFailureException
++    //        | ConfigInconsistentException e) {
++    //      stop();
++    //      logger.error("Fail to join cluster", e);
++    //    }
 +  }
 +
- 
 +  private void startServerCheck() throws StartupException {
      ClusterConfig config = ClusterDescriptor.getInstance().getConfig();
      // check the initial replicateNum and refuse to start when the replicateNum <= 0
      if (config.getReplicationNum() <= 0) {
@@@ -236,18 -202,18 +291,12 @@@
      }
  
      // assert this node is in seed nodes list
--    Node localNode = new Node();
--    localNode
--        .setInternalIp(config.getInternalIp())
--        .setMetaPort(config.getInternalMetaPort())
--        .setDataPort(config.getInternalDataPort())
--        .setClientPort(config.getClusterRpcPort())
--        .setClientIp(IoTDBDescriptor.getInstance().getConfig().getRpcAddress());
--    if (!seedNodes.contains(localNode)) {
++
++    if (!seedNodes.contains(thisNode)) {
        String message =
            String.format(
                "SeedNodes must contains local node in start-server mode. LocalNode: %s ,SeedNodes: %s",
--              localNode.toString(), config.getSeedNodeUrls());
++              thisNode.toString(), config.getSeedNodeUrls());
        throw new StartupException(metaServer.getMember().getName(), message);
      }
    }
@@@ -307,7 -273,7 +356,7 @@@
      }
    }
  
-   public MetaClusterServer getMetaServer() {
 -  public static MetaClusterServer getMetaServer() {
++  public RaftTSMetaServiceImpl getMetaServer() {
      return metaServer;
    }
  
@@@ -358,35 -324,8 +407,33 @@@
          });
    }
  
- 
- 
    @TestOnly
-   public void setMetaClusterServer(MetaClusterServer metaClusterServer) {
 -  public static void setMetaClusterServer(MetaClusterServer metaClusterServer) {
--    metaServer = metaClusterServer;
++  public void setMetaClusterServer(RaftTSMetaServiceImpl RaftTSMetaServiceImpl) {
++    metaServer = RaftTSMetaServiceImpl;
 +  }
 +
 +  public void stop() {
 +    deactivate();
 +  }
 +
 +  private void deactivate() {
 +    logger.info("Deactivating Cluster IoTDB...");
 +    metaServer.stop();
 +    registerManager.deregisterAll();
 +    JMXService.deregisterMBean(mbeanName);
 +    logger.info("ClusterIoTDB is deactivated.");
-     //stop the iotdb kernel
++    // stop the iotdb kernel
 +    iotdb.stop();
 +  }
 +
- 
 +  public static ClusterIoTDB getInstance() {
 +    return ClusterIoTDBHolder.INSTANCE;
 +  }
++
 +  private static class ClusterIoTDBHolder {
 +
 +    private static final ClusterIoTDB INSTANCE = new ClusterIoTDB();
 +
 +    private ClusterIoTDBHolder() {}
    }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
index b377b1a,b377b1a..f5b0a49
--- a/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/config/ClusterConstant.java
@@@ -19,6 -19,6 +19,7 @@@
  package org.apache.iotdb.cluster.config;
  
  import org.apache.iotdb.cluster.rpc.thrift.Node;
++import org.apache.iotdb.cluster.server.RaftServer;
  import org.apache.iotdb.db.utils.TestOnly;
  
  public class ClusterConstant {
@@@ -67,4 -67,4 +68,55 @@@
    public static void setElectionRandomTimeOutMs(long electionRandomTimeOutMs) {
      ClusterConstant.electionRandomTimeOutMs = electionRandomTimeOutMs;
    }
++
++  private static int connectionTimeoutInMS =
++      ClusterDescriptor.getInstance().getConfig().getConnectionTimeoutInMS();
++  private static int readOperationTimeoutMS =
++      ClusterDescriptor.getInstance().getConfig().getReadOperationTimeoutMS();
++  private static int writeOperationTimeoutMS =
++      ClusterDescriptor.getInstance().getConfig().getWriteOperationTimeoutMS();
++  private static int syncLeaderMaxWaitMs = 20 * 1000;
++  private static long heartBeatIntervalMs = 1000L;
++
++  public static int getConnectionTimeoutInMS() {
++    return connectionTimeoutInMS;
++  }
++
++  public static void setConnectionTimeoutInMS(int connectionTimeoutInMS) {
++    ClusterConstant.connectionTimeoutInMS = connectionTimeoutInMS;
++  }
++
++  public static int getReadOperationTimeoutMS() {
++    return readOperationTimeoutMS;
++  }
++
++  public static int getWriteOperationTimeoutMS() {
++    return writeOperationTimeoutMS;
++  }
++
++  public static int getSyncLeaderMaxWaitMs() {
++    return syncLeaderMaxWaitMs;
++  }
++
++  public static void setSyncLeaderMaxWaitMs(int syncLeaderMaxWaitMs) {
++    ClusterConstant.syncLeaderMaxWaitMs = syncLeaderMaxWaitMs;
++  }
++
++  public static long getHeartBeatIntervalMs() {
++    return heartBeatIntervalMs;
++  }
++
++  public static void setHeartBeatIntervalMs(long heartBeatIntervalMs) {
++    ClusterConstant.heartBeatIntervalMs = heartBeatIntervalMs;
++  }
++
++  @TestOnly
++  public static void setReadOperationTimeoutMS(int readOperationTimeoutMS) {
++    RaftServer.readOperationTimeoutMS = readOperationTimeoutMS;
++  }
++
++  @TestOnly
++  public static void setWriteOperationTimeoutMS(int writeOperationTimeoutMS) {
++    RaftServer.writeOperationTimeoutMS = writeOperationTimeoutMS;
++  }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterRPCService.java
index 8c79ac5,5bbddec..b8a2c00
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterRPCService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterRPCService.java
@@@ -33,15 -26,21 +33,15 @@@ import org.apache.iotdb.db.service.thri
  import org.apache.iotdb.db.service.thrift.ThriftServiceThread;
  import org.apache.iotdb.service.rpc.thrift.TSIService.Processor;
  
- public class ClusterRPCService  extends ThriftService implements ClusterRPCServiceMBean {
 -/** A service to handle jdbc request from client. */
 -public class RPCService extends ThriftService implements RPCServiceMBean {
 -
 -  private TSServiceImpl impl;
++public class ClusterRPCService extends ThriftService implements ClusterRPCServiceMBean {
  
 -  private RPCService() {}
 +  private ClusterTSServiceImpl impl;
  
 -  public static RPCService getInstance() {
 -    return RPCServiceHolder.INSTANCE;
 -  }
 +  private ClusterRPCService() {}
  
    @Override
 -  public int getRPCPort() {
 -    IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
 -    return config.getRpcPort();
 +  public ThriftService getImplementation() {
 +    return ClusterRPCServiceHolder.INSTANCE;
    }
  
    @Override
@@@ -50,9 -49,12 +50,13 @@@
    }
  
    @Override
--  public void initTProcessor()
-       throws IllegalAccessException, InstantiationException {
-     impl = new ClusterTSServiceImpl();
 -      throws ClassNotFoundException, IllegalAccessException, InstantiationException {
 -    impl =
 -        (TSServiceImpl)
 -            Class.forName(IoTDBDescriptor.getInstance().getConfig().getRpcImplClassName())
 -                .newInstance();
++  public void initTProcessor() throws IllegalAccessException, InstantiationException {
++    try {
++      impl = new ClusterTSServiceImpl();
++      initSyncedServiceImpl(null);
++    } catch (QueryProcessException e) {
++      throw new InstantiationException(e.getMessage());
++    }
      processor = new Processor<>(impl);
    }
  
@@@ -64,9 -66,9 +68,9 @@@
            new ThriftServiceThread(
                processor,
                getID().getName(),
 -              ThreadName.RPC_CLIENT.getName(),
 -              config.getRpcAddress(),
 -              config.getRpcPort(),
 +              ThreadName.CLUSTER_RPC_CLIENT.getName(),
-               config.getRpcAddress(),
-               config.getRpcPort(),
++              getBindIP(),
++              getBindPort(),
                config.getRpcMaxConcurrentClientNum(),
                config.getThriftServerAwaitTimeForStopService(),
                new RPCServiceThriftHandler(impl),
@@@ -88,27 -90,14 +92,26 @@@
    }
  
    @Override
 -  public ServiceType getID() {
 -    return ServiceType.RPC_SERVICE;
 +  public int getRPCPort() {
 +    return getBindPort();
 +  }
 +
 +  public static ClusterRPCService getInstance() {
 +    return ClusterRPCServiceHolder.INSTANCE;
 +  }
 +
 +  public void assignExecutorToServiceImpl(MetaGroupMember member) throws QueryProcessException {
 +    this.impl.setExecutor(member);
 +  }
 +
 +  public void assignCoordinator(Coordinator coordinator) {
 +    this.impl.setCoordinator(coordinator);
    }
  
- 
 -  private static class RPCServiceHolder {
 +  private static class ClusterRPCServiceHolder {
  
 -    private static final RPCService INSTANCE = new RPCService();
 +    private static final ClusterRPCService INSTANCE = new ClusterRPCService();
  
 -    private RPCServiceHolder() {}
 +    private ClusterRPCServiceHolder() {}
    }
  }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
index e43e503,0000000..f1fd75a
mode 100644,000000..100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/ClusterTSServiceImpl.java
@@@ -1,237 -1,0 +1,161 @@@
 +/*
 + * 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;
 +
 +import org.apache.iotdb.cluster.client.async.AsyncDataClient;
 +import org.apache.iotdb.cluster.client.sync.SyncDataClient;
++import org.apache.iotdb.cluster.config.ClusterConstant;
 +import org.apache.iotdb.cluster.config.ClusterDescriptor;
 +import org.apache.iotdb.cluster.coordinator.Coordinator;
- import org.apache.iotdb.cluster.metadata.CMManager;
 +import org.apache.iotdb.cluster.query.ClusterPlanExecutor;
- import org.apache.iotdb.cluster.query.ClusterPlanner;
 +import org.apache.iotdb.cluster.query.RemoteQueryContext;
 +import org.apache.iotdb.cluster.rpc.thrift.Node;
 +import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
 +import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
 +import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 +import org.apache.iotdb.db.exception.StorageEngineException;
- import org.apache.iotdb.db.exception.metadata.MetadataException;
 +import org.apache.iotdb.db.exception.query.QueryProcessException;
- import org.apache.iotdb.db.metadata.PartialPath;
 +import org.apache.iotdb.db.qp.physical.PhysicalPlan;
 +import org.apache.iotdb.db.query.context.QueryContext;
- import org.apache.iotdb.db.service.IoTDB;
 +import org.apache.iotdb.db.service.TSServiceImpl;
 +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.file.metadata.enums.TSDataType;
- 
 +import org.apache.thrift.TException;
- import org.apache.thrift.protocol.TProtocol;
- import org.apache.thrift.server.ServerContext;
- import org.apache.thrift.server.TServerEventHandler;
- import org.apache.thrift.transport.TTransport;
 +import org.slf4j.Logger;
 +import org.slf4j.LoggerFactory;
 +
 +import java.io.IOException;
- import java.util.List;
 +import java.util.Map;
 +import java.util.Map.Entry;
 +import java.util.Set;
 +import java.util.concurrent.ConcurrentHashMap;
 +import java.util.concurrent.atomic.AtomicReference;
 +
 +/**
-  * ClusterTSServiceImpl is the cluster version of TSServiceImpl, which is responsible for the processing of
-  * the user requests (sqls and session api). It inherits the basic procedures from TSServiceImpl,
-  * but redirect the queries of data and metadata to a MetaGroupMember of the local node.
++ * ClusterTSServiceImpl is the cluster version of TSServiceImpl, which is responsible for the
++ * processing of the user requests (sqls and session api). It inherits the basic procedures from
++ * TSServiceImpl, but redirect the queries of data and metadata to a MetaGroupMember of the local
++ * node.
 + */
 +public class ClusterTSServiceImpl extends TSServiceImpl {
 +
 +  private static final Logger logger = LoggerFactory.getLogger(ClusterTSServiceImpl.class);
 +  /**
-    * The Coordinator of the local node. Through this node queries data and meta from
-    * the cluster and performs data manipulations to the cluster.
++   * The Coordinator of the local node. Through this node queries data and meta from the cluster and
++   * performs data manipulations to the cluster.
 +   */
 +  private Coordinator coordinator;
 +
- 
- //  /**
- //   * Using the poolServer, ClusterTSServiceImpl will listen to a socket to accept thrift requests like an
- //   * HttpServer.
- //   */
- //  private TServer poolServer;
- //
- //  /** The socket poolServer will listen to. Async service requires nonblocking socket */
- //  private TServerTransport serverTransport;
- 
 +  /**
 +   * queryId -> queryContext map. When a query ends either normally or accidentally, the resources
 +   * used by the query can be found in the context and then released.
 +   */
 +  private Map<Long, RemoteQueryContext> queryContextMap = new ConcurrentHashMap<>();
 +
-   public ClusterTSServiceImpl(MetaGroupMember metaGroupMember) throws QueryProcessException {
-     super();
-     this.processor = new ClusterPlanner();
-   }
++  public ClusterTSServiceImpl() throws QueryProcessException {}
 +
 +  public void setExecutor(MetaGroupMember metaGroupMember) throws QueryProcessException {
-     this.executor = new ClusterPlanExecutor(metaGroupMember);
++    executor = new ClusterPlanExecutor(metaGroupMember);
 +  }
 +
 +  public void setCoordinator(Coordinator coordinator) {
 +    this.coordinator = coordinator;
 +  }
 +
- 
 +  /**
 +   * Redirect the plan to the local Coordinator so that it will be processed cluster-wide.
 +   *
 +   * @param plan
 +   * @return
 +   */
 +  @Override
 +  protected TSStatus executeNonQueryPlan(PhysicalPlan plan) {
 +    try {
 +      plan.checkIntegrity();
 +    } catch (QueryProcessException e) {
 +      logger.warn("Illegal plan detected: {}", plan);
 +      return RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, e.getMessage());
 +    }
 +
 +    return coordinator.executeNonQueryPlan(plan);
 +  }
 +
 +  /**
-    * EventHandler handles the preprocess and postprocess of the thrift requests, but it currently
-    * only release resources when a client disconnects.
-    */
-   class EventHandler implements TServerEventHandler {
- 
-     @Override
-     public void preServe() {
-       // do nothing
-     }
- 
-     @Override
-     public ServerContext createContext(TProtocol input, TProtocol output) {
-       return null;
-     }
- 
-     @Override
-     public void deleteContext(ServerContext serverContext, TProtocol input, TProtocol output) {
-       ClusterTSServiceImpl.this.handleClientExit();
-     }
- 
-     @Override
-     public void processContext(
-         ServerContext serverContext, TTransport inputTransport, TTransport outputTransport) {
-       // do nothing
-     }
-   }
- 
-   /**
-    * Get the data types of each path in “paths”. If "aggregations" is not null, then it should be
-    * corresponding to "paths" one to one and the data type will be the type of the aggregation over
-    * the corresponding path.
-    *
-    * @param paths full timeseries paths
-    * @param aggregations if not null, it should be the same size as "paths"
-    * @return the data types of "paths" (using the aggregations)
-    * @throws MetadataException
-    */
-   @Override
-   protected List<TSDataType> getSeriesTypesByPaths(
-       List<PartialPath> paths, List<String> aggregations) throws MetadataException {
-     return ((CMManager) IoTDB.metaManager).getSeriesTypesByPath(paths, aggregations).left;
-   }
- 
-   /**
-    * Get the data types of each path in “paths”. If "aggregation" is not null, all "paths" will use
-    * this aggregation.
-    *
-    * @param paths full timeseries paths
-    * @param aggregation if not null, it means "paths" all use this aggregation
-    * @return the data types of "paths" (using the aggregation)
-    * @throws MetadataException
-    */
-   protected List<TSDataType> getSeriesTypesByString(List<PartialPath> paths, String aggregation)
-       throws MetadataException {
-     return ((CMManager) IoTDB.metaManager).getSeriesTypesByPaths(paths, aggregation).left;
-   }
- 
-   /**
 +   * Generate and cache a QueryContext using "queryId". In the distributed version, the QueryContext
 +   * is a RemoteQueryContext.
 +   *
 +   * @param queryId
 +   * @return a RemoteQueryContext using queryId
 +   */
 +  @Override
 +  protected QueryContext genQueryContext(long queryId, boolean debug) {
 +    RemoteQueryContext context = new RemoteQueryContext(queryId, debug);
 +    queryContextMap.put(queryId, context);
 +    return context;
 +  }
 +
 +  /**
 +   * Release the local and remote resources used by a query.
 +   *
 +   * @param queryId
 +   * @throws StorageEngineException
 +   */
 +  @Override
 +  protected void releaseQueryResource(long queryId) throws StorageEngineException {
 +    // release resources locally
 +    super.releaseQueryResource(queryId);
 +    // release resources remotely
 +    RemoteQueryContext context = queryContextMap.remove(queryId);
 +    if (context != null) {
 +      // release the resources in every queried node
 +      for (Entry<RaftNode, Set<Node>> headerEntry : context.getQueriedNodesMap().entrySet()) {
 +        RaftNode header = headerEntry.getKey();
 +        Set<Node> queriedNodes = headerEntry.getValue();
 +
 +        for (Node queriedNode : queriedNodes) {
 +          GenericHandler<Void> handler = new GenericHandler<>(queriedNode, new AtomicReference<>());
 +          try {
 +            if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
 +              AsyncDataClient client =
 +                  coordinator.getAsyncDataClient(
-                       queriedNode, RaftServer.getReadOperationTimeoutMS());
++                      queriedNode, ClusterConstant.getReadOperationTimeoutMS());
 +              client.endQuery(header, coordinator.getThisNode(), queryId, handler);
 +            } else {
 +              try (SyncDataClient syncDataClient =
 +                  coordinator.getSyncDataClient(
-                       queriedNode, RaftServer.getReadOperationTimeoutMS())) {
-                 syncDataClient.endQuery(header, coordinator.getThisNode(), queryId);
++                      queriedNode, ClusterConstant.getReadOperationTimeoutMS())) {
++                try {
++                  syncDataClient.endQuery(header, coordinator.getThisNode(), queryId);
++                } catch (TException e) {
++                  // the connection may be broken, close it to avoid it being reused
++                  syncDataClient.getInputProtocol().getTransport().close();
++                  throw e;
++                }
 +              }
 +            }
 +          } catch (IOException | TException e) {
 +            logger.error("Cannot end query {} in {}", queryId, queriedNode);
 +          }
 +        }
 +      }
 +    }
 +  }
 +}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
index b0f8a25,fce7a87..0000000
deleted file mode 100644,100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
+++ /dev/null
@@@ -1,369 -1,378 +1,0 @@@
--/*
-- * Licensed to the Apache Software Foundation (ASF) under one
-- * or more contributor license agreements.  See the NOTICE file
-- * distributed with this work for additional information
-- * regarding copyright ownership.  The ASF licenses this file
-- * to you under the Apache License, Version 2.0 (the
-- * "License"); you may not use this file except in compliance
-- * with the License.  You may obtain a copy of the License at
-- *
-- *     http://www.apache.org/licenses/LICENSE-2.0
-- *
-- * Unless required by applicable law or agreed to in writing,
-- * software distributed under the License is distributed on an
-- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- * KIND, either express or implied.  See the License for the
-- * specific language governing permissions and limitations
-- * under the License.
-- */
--package org.apache.iotdb.cluster.server;
--
- import org.apache.iotdb.cluster.ClusterIoTDB;
--import org.apache.iotdb.cluster.config.ClusterDescriptor;
--import org.apache.iotdb.cluster.coordinator.Coordinator;
--import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
--import org.apache.iotdb.cluster.exception.StartUpCheckFailureException;
--import org.apache.iotdb.cluster.metadata.CMManager;
--import org.apache.iotdb.cluster.metadata.MetaPuller;
--import org.apache.iotdb.cluster.rpc.thrift.*;
--import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncProcessor;
--import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Processor;
--import org.apache.iotdb.cluster.server.heartbeat.MetaHeartbeatServer;
--import org.apache.iotdb.cluster.server.member.MetaGroupMember;
--import org.apache.iotdb.cluster.server.service.MetaAsyncService;
--import org.apache.iotdb.cluster.server.service.MetaSyncService;
--import org.apache.iotdb.cluster.utils.nodetool.ClusterMonitor;
--import org.apache.iotdb.db.exception.StartupException;
--import org.apache.iotdb.db.exception.query.QueryProcessException;
--import org.apache.iotdb.db.service.IoTDB;
--import org.apache.iotdb.db.service.RegisterManager;
--import org.apache.iotdb.db.utils.TestOnly;
--import org.apache.iotdb.service.rpc.thrift.TSStatus;
--
--import org.apache.thrift.TException;
--import org.apache.thrift.TProcessor;
--import org.apache.thrift.async.AsyncMethodCallback;
--import org.apache.thrift.transport.TNonblockingServerSocket;
--import org.apache.thrift.transport.TServerSocket;
--import org.apache.thrift.transport.TServerTransport;
--import org.apache.thrift.transport.TTransportException;
--import org.slf4j.Logger;
--import org.slf4j.LoggerFactory;
--
--import java.net.InetSocketAddress;
--import java.nio.ByteBuffer;
--
--/**
-- * MetaCluster manages the whole cluster's metadata, such as what nodes are in the cluster and the
-- * data partition. Each node has one MetaClusterServer instance, the single-node IoTDB instance is
-- * started-up at the same time.
-- */
--public class MetaClusterServer extends RaftServer
--    implements TSMetaService.AsyncIface, TSMetaService.Iface {
--  private static Logger logger = LoggerFactory.getLogger(MetaClusterServer.class);
--
--  // each node only contains one MetaGroupMember
--  private MetaGroupMember member;
--  private Coordinator coordinator;
- 
- 
 -  // the single-node IoTDB instance
 -  private IoTDB ioTDB;
 -  // to register the ClusterMonitor that helps monitoring the cluster
 -  private RegisterManager registerManager = new RegisterManager();
--  private MetaAsyncService asyncService;
--  private MetaSyncService syncService;
--  private MetaHeartbeatServer metaHeartbeatServer;
--
--  public MetaClusterServer() throws QueryProcessException {
--    super();
--    metaHeartbeatServer = new MetaHeartbeatServer(thisNode, this);
--    coordinator = new Coordinator();
--    member = new MetaGroupMember(protocolFactory, thisNode, coordinator);
--    coordinator.setMetaGroupMember(member);
--    asyncService = new MetaAsyncService(member);
--    syncService = new MetaSyncService(member);
--    MetaPuller.getInstance().init(member);
--  }
--
--  /**
--   * Besides the standard RaftServer start-up, the IoTDB instance, a MetaGroupMember and the
--   * ClusterMonitor are also started.
--   *
--   * @throws TTransportException
--   * @throws StartupException
--   */
--  @Override
--  public void start() throws TTransportException, StartupException {
--    super.start();
--    metaHeartbeatServer.start();
- 
 -    ioTDB = new IoTDB();
--    IoTDB.setMetaManager(CMManager.getInstance());
--    ((CMManager) IoTDB.metaManager).setMetaGroupMember(member);
--    ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
-     //TODO FIXME move this out of MetaClusterServer
-     IoTDB.getInstance().active();
- 
 -    ioTDB.active();
--    member.start();
- 
 -    // JMX based DBA API
 -    registerManager.register(ClusterMonitor.INSTANCE);
--  }
--
--  /** Also stops the IoTDB instance, the MetaGroupMember and the ClusterMonitor. */
--  @Override
--  public void stop() {
- 
 -    if (ioTDB == null) {
 -      return;
 -    }
--    metaHeartbeatServer.stop();
--    super.stop();
 -    ioTDB.stop();
 -    ioTDB = null;
--    member.stop();
 -    registerManager.deregisterAll();
--  }
--
--  /** Build a initial cluster with other nodes on the seed list. */
--  public void buildCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
--    member.buildCluster();
--  }
--
--  /**
--   * Pick up a node from the seed list and send a join request to it.
--   *
--   * @return whether the node has joined the cluster.
--   */
--  public void joinCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
--    member.joinCluster();
--  }
--
--  /**
--   * MetaClusterServer uses the meta port to create the socket.
--   *
--   * @return the TServerTransport
--   * @throws TTransportException if create the socket fails
--   */
--  @Override
--  TServerTransport getServerSocket() throws TTransportException {
--    logger.info(
--        "[{}] Cluster node will listen {}:{}",
--        getServerClientName(),
--        config.getInternalIp(),
--        config.getInternalMetaPort());
--    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
--      return new TNonblockingServerSocket(
--          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()),
--          getConnectionTimeoutInMS());
--    } else {
--      return new TServerSocket(
--          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()));
--    }
--  }
--
--  @Override
--  String getClientThreadPrefix() {
--    return "MetaClientThread-";
--  }
--
--  @Override
--  String getServerClientName() {
--    return "MetaServerThread-";
--  }
--
--  @Override
--  TProcessor getProcessor() {
--    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
--      return new AsyncProcessor<>(this);
--    } else {
--      return new Processor<>(this);
--    }
--  }
--
--  // Request forwarding. There is only one MetaGroupMember each node, so all requests will be
--  // directly sent to that member. See the methods in MetaGroupMember for details
--
--  @Override
--  public void addNode(Node node, StartUpStatus startUpStatus, AsyncMethodCallback resultHandler) {
--    asyncService.addNode(node, startUpStatus, resultHandler);
--  }
--
--  @Override
--  public void sendHeartbeat(HeartBeatRequest request, AsyncMethodCallback resultHandler) {
--    asyncService.sendHeartbeat(request, resultHandler);
--  }
--
--  @Override
--  public void startElection(ElectionRequest electionRequest, AsyncMethodCallback resultHandler) {
--    asyncService.startElection(electionRequest, resultHandler);
--  }
--
--  @Override
--  public void appendEntries(AppendEntriesRequest request, AsyncMethodCallback resultHandler) {
--    asyncService.appendEntries(request, resultHandler);
--  }
--
--  @Override
--  public void appendEntry(AppendEntryRequest request, AsyncMethodCallback resultHandler) {
--    asyncService.appendEntry(request, resultHandler);
--  }
--
--  @Override
--  public void sendSnapshot(SendSnapshotRequest request, AsyncMethodCallback resultHandler) {
--    asyncService.sendSnapshot(request, resultHandler);
--  }
--
--  @Override
--  public void executeNonQueryPlan(
--      ExecutNonQueryReq request, AsyncMethodCallback<TSStatus> resultHandler) {
--    asyncService.executeNonQueryPlan(request, resultHandler);
--  }
--
--  @Override
--  public void requestCommitIndex(
--      RaftNode header, AsyncMethodCallback<RequestCommitIndexResponse> resultHandler) {
--    asyncService.requestCommitIndex(header, resultHandler);
--  }
--
--  @Override
--  public void checkAlive(AsyncMethodCallback<Node> resultHandler) {
--    asyncService.checkAlive(resultHandler);
--  }
--
--  @Override
--  public void collectMigrationStatus(AsyncMethodCallback<ByteBuffer> resultHandler) {
--    asyncService.collectMigrationStatus(resultHandler);
--  }
--
--  @Override
--  public void readFile(
--      String filePath, long offset, int length, AsyncMethodCallback<ByteBuffer> resultHandler) {
--    asyncService.readFile(filePath, offset, length, resultHandler);
--  }
--
--  @Override
--  public void queryNodeStatus(AsyncMethodCallback<TNodeStatus> resultHandler) {
--    asyncService.queryNodeStatus(resultHandler);
--  }
--
--  public MetaGroupMember getMember() {
--    return member;
--  }
--
--  @Override
--  public void checkStatus(
--      StartUpStatus startUpStatus, AsyncMethodCallback<CheckStatusResponse> resultHandler) {
--    asyncService.checkStatus(startUpStatus, resultHandler);
--  }
--
--  @Override
--  public void removeNode(Node node, AsyncMethodCallback<Long> resultHandler) {
--    asyncService.removeNode(node, resultHandler);
--  }
--
--  @Override
--  public void exile(ByteBuffer removeNodeLog, AsyncMethodCallback<Void> resultHandler) {
--    asyncService.exile(removeNodeLog, resultHandler);
--  }
--
--  @Override
--  public void matchTerm(
--      long index, long term, RaftNode header, AsyncMethodCallback<Boolean> resultHandler) {
--    asyncService.matchTerm(index, term, header, resultHandler);
--  }
--
--  @Override
--  public AddNodeResponse addNode(Node node, StartUpStatus startUpStatus) throws TException {
--    return syncService.addNode(node, startUpStatus);
--  }
--
--  @Override
--  public CheckStatusResponse checkStatus(StartUpStatus startUpStatus) {
--    return syncService.checkStatus(startUpStatus);
--  }
--
--  @Override
--  public long removeNode(Node node) throws TException {
--    return syncService.removeNode(node);
--  }
--
--  @Override
--  public void exile(ByteBuffer removeNodeLog) {
--    syncService.exile(removeNodeLog);
--  }
--
--  @Override
--  public TNodeStatus queryNodeStatus() {
--    return syncService.queryNodeStatus();
--  }
--
--  @Override
--  public Node checkAlive() {
--    return syncService.checkAlive();
--  }
--
--  @Override
--  public ByteBuffer collectMigrationStatus() {
--    return syncService.collectMigrationStatus();
--  }
--
--  @Override
--  public HeartBeatResponse sendHeartbeat(HeartBeatRequest request) {
--    return syncService.sendHeartbeat(request);
--  }
--
--  @Override
--  public long startElection(ElectionRequest request) {
--    return syncService.startElection(request);
--  }
--
--  @Override
--  public long appendEntries(AppendEntriesRequest request) throws TException {
--    return syncService.appendEntries(request);
--  }
--
--  @Override
--  public long appendEntry(AppendEntryRequest request) throws TException {
--    return syncService.appendEntry(request);
--  }
--
--  @Override
--  public void sendSnapshot(SendSnapshotRequest request) throws TException {
--    syncService.sendSnapshot(request);
--  }
--
--  @Override
--  public TSStatus executeNonQueryPlan(ExecutNonQueryReq request) throws TException {
--    return syncService.executeNonQueryPlan(request);
--  }
--
--  @Override
--  public RequestCommitIndexResponse requestCommitIndex(RaftNode header) throws TException {
--    return syncService.requestCommitIndex(header);
--  }
--
--  @Override
--  public ByteBuffer readFile(String filePath, long offset, int length) throws TException {
--    return syncService.readFile(filePath, offset, length);
--  }
--
--  @Override
--  public boolean matchTerm(long index, long term, RaftNode header) {
--    return syncService.matchTerm(index, term, header);
--  }
--
--  @Override
--  public void removeHardLink(String hardLinkPath) throws TException {
--    syncService.removeHardLink(hardLinkPath);
--  }
--
--  @Override
--  public void removeHardLink(String hardLinkPath, AsyncMethodCallback<Void> resultHandler) {
--    asyncService.removeHardLink(hardLinkPath, resultHandler);
--  }
--
--  @Override
--  public void handshake(Node sender) {
--    syncService.handshake(sender);
--  }
--
--  @Override
--  public void handshake(Node sender, AsyncMethodCallback<Void> resultHandler) {
--    asyncService.handshake(sender, resultHandler);
--  }
--
--  @TestOnly
--  public void setMetaGroupMember(MetaGroupMember metaGroupMember) {
--    this.member = metaGroupMember;
--  }
--
 -  @TestOnly
 -  public IoTDB getIoTDB() {
 -    return ioTDB;
 -  }
--}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer2.java
index 0000000,0000000..65db372
new file mode 100644
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer2.java
@@@ -1,0 -1,0 +1,372 @@@
++/// *
++// * 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;
++//
++// import org.apache.iotdb.cluster.config.ClusterDescriptor;
++// import org.apache.iotdb.cluster.coordinator.Coordinator;
++// import org.apache.iotdb.cluster.exception.ConfigInconsistentException;
++// import org.apache.iotdb.cluster.exception.StartUpCheckFailureException;
++// import org.apache.iotdb.cluster.metadata.CMManager;
++// import org.apache.iotdb.cluster.metadata.MetaPuller;
++// import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
++// import org.apache.iotdb.cluster.rpc.thrift.AppendEntriesRequest;
++// import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
++// import org.apache.iotdb.cluster.rpc.thrift.CheckStatusResponse;
++// import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
++// import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
++// import org.apache.iotdb.cluster.rpc.thrift.HeartBeatRequest;
++// import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
++// import org.apache.iotdb.cluster.rpc.thrift.Node;
++// 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.StartUpStatus;
++// import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
++// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService;
++// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncProcessor;
++// import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Processor;
++// import org.apache.iotdb.cluster.server.heartbeat.MetaHeartbeatServer;
++// import org.apache.iotdb.cluster.server.member.MetaGroupMember;
++// import org.apache.iotdb.cluster.server.service.MetaAsyncService;
++// import org.apache.iotdb.cluster.server.service.MetaSyncService;
++// import org.apache.iotdb.db.exception.StartupException;
++// import org.apache.iotdb.db.exception.query.QueryProcessException;
++// import org.apache.iotdb.db.service.IoTDB;
++// import org.apache.iotdb.db.utils.TestOnly;
++// import org.apache.iotdb.service.rpc.thrift.TSStatus;
++// import org.apache.thrift.TException;
++// import org.apache.thrift.async.AsyncMethodCallback;
++// import org.apache.thrift.transport.TNonblockingServerSocket;
++// import org.slf4j.Logger;
++// import org.slf4j.LoggerFactory;
++//
++// import java.net.InetSocketAddress;
++// import java.nio.ByteBuffer;
++//
++/// **
++// * MetaCluster manages the whole cluster's metadata, such as what nodes are in the cluster and the
++// * data partition. Each node has one MetaClusterServer instance, the single-node IoTDB instance is
++// * started-up at the same time.
++// */
++// public class MetaClusterServer2 extends RaftServer
++//    implements TSMetaService.AsyncIface, TSMetaService.Iface {
++//  private static Logger logger = LoggerFactory.getLogger(MetaClusterServer2.class);
++//
++//  // each node only contains one MetaGroupMember
++//  private MetaGroupMember member;
++//  private Coordinator coordinator;
++//
++//  private MetaAsyncService asyncService;
++//  private MetaSyncService syncService;
++//  private MetaHeartbeatServer metaHeartbeatServer;
++//
++//  public MetaClusterServer2() throws QueryProcessException {
++//    super();
++//    metaHeartbeatServer = new MetaHeartbeatServer(thisNode, this);
++//    coordinator = new Coordinator();
++//    member = new MetaGroupMember(protocolFactory, thisNode, coordinator);
++//    coordinator.setMetaGroupMember(member);
++//    asyncService = new MetaAsyncService(member);
++//    syncService = new MetaSyncService(member);
++//    MetaPuller.getInstance().init(member);
++//  }
++//
++//  /**
++//   * Besides the standard RaftServer start-up, the IoTDB instance, a MetaGroupMember and the
++//   * ClusterMonitor are also started.
++//   *
++//   * @throws TTransportException
++//   * @throws StartupException
++//   */
++//  @Override
++//  public void start() throws TTransportException, StartupException {
++//    super.start();
++//    metaHeartbeatServer.start();
++//
++//    IoTDB.setMetaManager(CMManager.getInstance());
++//    ((CMManager) IoTDB.metaManager).setMetaGroupMember(member);
++//    ((CMManager) IoTDB.metaManager).setCoordinator(coordinator);
++//    // TODO FIXME move this out of MetaClusterServer
++//    IoTDB.getInstance().active();
++//
++//    member.start();
++//  }
++//
++//  /** Also stops the IoTDB instance, the MetaGroupMember and the ClusterMonitor. */
++//  @Override
++//  public void stop() {
++//
++//    metaHeartbeatServer.stop();
++//    super.stop();
++//    member.stop();
++//  }
++//
++//  /** Build a initial cluster with other nodes on the seed list. */
++//  public void buildCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
++//    member.buildCluster();
++//  }
++//
++//  /**
++//   * Pick up a node from the seed list and send a join request to it.
++//   *
++//   * @return whether the node has joined the cluster.
++//   */
++//  public void joinCluster() throws ConfigInconsistentException, StartUpCheckFailureException {
++//    member.joinCluster();
++//  }
++//
++//  /**
++//   * MetaClusterServer uses the meta port to create the socket.
++//   *
++//   * @return the TServerTransport
++//   * @throws TTransportException if create the socket fails
++//   */
++//  @Override
++//  TServerTransport getServerSocket() throws TTransportException {
++//    logger.info(
++//        "[{}] Cluster node will listen {}:{}",
++//        getServerClientName(),
++//        config.getInternalIp(),
++//        config.getInternalMetaPort());
++//    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
++//      return new TNonblockingServerSocket(
++//          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()),
++//          getConnectionTimeoutInMS());
++//    } else {
++//      return new TServerSocket(
++//          new InetSocketAddress(config.getInternalIp(), config.getInternalMetaPort()));
++//    }
++//  }
++//
++//  @Override
++//  String getClientThreadPrefix() {
++//    return "MetaClientThread-";
++//  }
++//
++//  @Override
++//  String getServerClientName() {
++//    return "MetaServerThread-";
++//  }
++//
++//  @Override
++//  TProcessor getProcessor() {
++//    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
++//      return new AsyncProcessor<>(this);
++//    } else {
++//      return new Processor<>(this);
++//    }
++//  }
++//
++//  // Request forwarding. There is only one MetaGroupMember each node, so all requests will be
++//  // directly sent to that member. See the methods in MetaGroupMember for details
++//
++//  @Override
++//  public void addNode(Node node, StartUpStatus startUpStatus, AsyncMethodCallback resultHandler) {
++//    asyncService.addNode(node, startUpStatus, resultHandler);
++//  }
++//
++//  @Override
++//  public void sendHeartbeat(HeartBeatRequest request, AsyncMethodCallback resultHandler) {
++//    asyncService.sendHeartbeat(request, resultHandler);
++//  }
++//
++//  @Override
++//  public void startElection(ElectionRequest electionRequest, AsyncMethodCallback resultHandler) {
++//    asyncService.startElection(electionRequest, resultHandler);
++//  }
++//
++//  @Override
++//  public void appendEntries(AppendEntriesRequest request, AsyncMethodCallback resultHandler) {
++//    asyncService.appendEntries(request, resultHandler);
++//  }
++//
++//  @Override
++//  public void appendEntry(AppendEntryRequest request, AsyncMethodCallback resultHandler) {
++//    asyncService.appendEntry(request, resultHandler);
++//  }
++//
++//  @Override
++//  public void sendSnapshot(SendSnapshotRequest request, AsyncMethodCallback resultHandler) {
++//    asyncService.sendSnapshot(request, resultHandler);
++//  }
++//
++//  @Override
++//  public void executeNonQueryPlan(
++//      ExecutNonQueryReq request, AsyncMethodCallback<TSStatus> resultHandler) {
++//    asyncService.executeNonQueryPlan(request, resultHandler);
++//  }
++//
++//  @Override
++//  public void requestCommitIndex(
++//      RaftNode header, AsyncMethodCallback<RequestCommitIndexResponse> resultHandler) {
++//    asyncService.requestCommitIndex(header, resultHandler);
++//  }
++//
++//  @Override
++//  public void checkAlive(AsyncMethodCallback<Node> resultHandler) {
++//    asyncService.checkAlive(resultHandler);
++//  }
++//
++//  @Override
++//  public void collectMigrationStatus(AsyncMethodCallback<ByteBuffer> resultHandler) {
++//    asyncService.collectMigrationStatus(resultHandler);
++//  }
++//
++//  @Override
++//  public void readFile(
++//      String filePath, long offset, int length, AsyncMethodCallback<ByteBuffer> resultHandler) {
++//    asyncService.readFile(filePath, offset, length, resultHandler);
++//  }
++//
++//  @Override
++//  public void queryNodeStatus(AsyncMethodCallback<TNodeStatus> resultHandler) {
++//    asyncService.queryNodeStatus(resultHandler);
++//  }
++//
++//  public MetaGroupMember getMember() {
++//    return member;
++//  }
++//
++//  @Override
++//  public void checkStatus(
++//      StartUpStatus startUpStatus, AsyncMethodCallback<CheckStatusResponse> resultHandler) {
++//    asyncService.checkStatus(startUpStatus, resultHandler);
++//  }
++//
++//  @Override
++//  public void removeNode(Node node, AsyncMethodCallback<Long> resultHandler) {
++//    asyncService.removeNode(node, resultHandler);
++//  }
++//
++//  @Override
++//  public void exile(ByteBuffer removeNodeLog, AsyncMethodCallback<Void> resultHandler) {
++//    asyncService.exile(removeNodeLog, resultHandler);
++//  }
++//
++//  @Override
++//  public void matchTerm(
++//      long index, long term, RaftNode header, AsyncMethodCallback<Boolean> resultHandler) {
++//    asyncService.matchTerm(index, term, header, resultHandler);
++//  }
++//
++//  @Override
++//  public AddNodeResponse addNode(Node node, StartUpStatus startUpStatus) throws TException {
++//    return syncService.addNode(node, startUpStatus);
++//  }
++//
++//  @Override
++//  public CheckStatusResponse checkStatus(StartUpStatus startUpStatus) {
++//    return syncService.checkStatus(startUpStatus);
++//  }
++//
++//  @Override
++//  public long removeNode(Node node) throws TException {
++//    return syncService.removeNode(node);
++//  }
++//
++//  @Override
++//  public void exile(ByteBuffer removeNodeLog) {
++//    syncService.exile(removeNodeLog);
++//  }
++//
++//  @Override
++//  public TNodeStatus queryNodeStatus() {
++//    return syncService.queryNodeStatus();
++//  }
++//
++//  @Override
++//  public Node checkAlive() {
++//    return syncService.checkAlive();
++//  }
++//
++//  @Override
++//  public ByteBuffer collectMigrationStatus() {
++//    return syncService.collectMigrationStatus();
++//  }
++//
++//  @Override
++//  public HeartBeatResponse sendHeartbeat(HeartBeatRequest request) {
++//    return syncService.sendHeartbeat(request);
++//  }
++//
++//  @Override
++//  public long startElection(ElectionRequest request) {
++//    return syncService.startElection(request);
++//  }
++//
++//  @Override
++//  public long appendEntries(AppendEntriesRequest request) throws TException {
++//    return syncService.appendEntries(request);
++//  }
++//
++//  @Override
++//  public long appendEntry(AppendEntryRequest request) throws TException {
++//    return syncService.appendEntry(request);
++//  }
++//
++//  @Override
++//  public void sendSnapshot(SendSnapshotRequest request) throws TException {
++//    syncService.sendSnapshot(request);
++//  }
++//
++//  @Override
++//  public TSStatus executeNonQueryPlan(ExecutNonQueryReq request) throws TException {
++//    return syncService.executeNonQueryPlan(request);
++//  }
++//
++//  @Override
++//  public RequestCommitIndexResponse requestCommitIndex(RaftNode header) throws TException {
++//    return syncService.requestCommitIndex(header);
++//  }
++//
++//  @Override
++//  public ByteBuffer readFile(String filePath, long offset, int length) throws TException {
++//    return syncService.readFile(filePath, offset, length);
++//  }
++//
++//  @Override
++//  public boolean matchTerm(long index, long term, RaftNode header) {
++//    return syncService.matchTerm(index, term, header);
++//  }
++//
++//  @Override
++//  public void removeHardLink(String hardLinkPath) throws TException {
++//    syncService.removeHardLink(hardLinkPath);
++//  }
++//
++//  @Override
++//  public void removeHardLink(String hardLinkPath, AsyncMethodCallback<Void> resultHandler) {
++//    asyncService.removeHardLink(hardLinkPath, resultHandler);
++//  }
++//
++//  @Override
++//  public void handshake(Node sender) {
++//    syncService.handshake(sender);
++//  }
++//
++//  @Override
++//  public void handshake(Node sender, AsyncMethodCallback<Void> resultHandler) {
++//    asyncService.handshake(sender, resultHandler);
++//  }
++//
++//  @TestOnly
++//  public void setMetaGroupMember(MetaGroupMember metaGroupMember) {
++//    this.member = metaGroupMember;
++//  }
++// }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/RaftServer.java
index 09956d2,09956d2..0000000
deleted file mode 100644,100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/RaftServer.java
+++ /dev/null
@@@ -1,263 -1,263 +1,0 @@@
--/*
-- * Licensed to the Apache Software Foundation (ASF) under one
-- * or more contributor license agreements.  See the NOTICE file
-- * distributed with this work for additional information
-- * regarding copyright ownership.  The ASF licenses this file
-- * to you under the Apache License, Version 2.0 (the
-- * "License"); you may not use this file except in compliance
-- * with the License.  You may obtain a copy of the License at
-- *
-- *     http://www.apache.org/licenses/LICENSE-2.0
-- *
-- * Unless required by applicable law or agreed to in writing,
-- * software distributed under the License is distributed on an
-- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-- * KIND, either express or implied.  See the License for the
-- * specific language governing permissions and limitations
-- * under the License.
-- */
--
--package org.apache.iotdb.cluster.server;
--
--import org.apache.iotdb.cluster.config.ClusterConfig;
--import org.apache.iotdb.cluster.config.ClusterDescriptor;
--import org.apache.iotdb.cluster.rpc.thrift.Node;
--import org.apache.iotdb.cluster.rpc.thrift.RaftService;
--import org.apache.iotdb.cluster.utils.ClusterUtils;
--import org.apache.iotdb.db.conf.IoTDBDescriptor;
--import org.apache.iotdb.db.exception.StartupException;
--import org.apache.iotdb.db.utils.CommonUtils;
--import org.apache.iotdb.db.utils.TestOnly;
--import org.apache.iotdb.rpc.RpcTransportFactory;
--
--import org.apache.thrift.TProcessor;
--import org.apache.thrift.protocol.TBinaryProtocol;
--import org.apache.thrift.protocol.TCompactProtocol;
--import org.apache.thrift.protocol.TProtocolFactory;
--import org.apache.thrift.server.TServer;
--import org.apache.thrift.server.TThreadedSelectorServer;
--import org.apache.thrift.transport.TNonblockingServerTransport;
--import org.apache.thrift.transport.TServerTransport;
--import org.apache.thrift.transport.TTransportException;
--import org.slf4j.Logger;
--import org.slf4j.LoggerFactory;
--
--import java.util.ConcurrentModificationException;
--import java.util.concurrent.ExecutorService;
--import java.util.concurrent.Executors;
--import java.util.concurrent.SynchronousQueue;
--import java.util.concurrent.ThreadFactory;
--import java.util.concurrent.ThreadPoolExecutor;
--import java.util.concurrent.atomic.AtomicLong;
--
--/**
-- * RaftServer works as a broker (network and protocol layer) that sends the requests to the proper
-- * RaftMembers to process.
-- */
--public abstract class RaftServer implements RaftService.AsyncIface, RaftService.Iface {
--
--  private static final Logger logger = LoggerFactory.getLogger(RaftServer.class);
--  private static int connectionTimeoutInMS =
--      ClusterDescriptor.getInstance().getConfig().getConnectionTimeoutInMS();
--  private static int readOperationTimeoutMS =
--      ClusterDescriptor.getInstance().getConfig().getReadOperationTimeoutMS();
--  private static int writeOperationTimeoutMS =
--      ClusterDescriptor.getInstance().getConfig().getWriteOperationTimeoutMS();
--  private static int syncLeaderMaxWaitMs = 20 * 1000;
--  private static long heartBeatIntervalMs = 1000L;
--
--  ClusterConfig config = ClusterDescriptor.getInstance().getConfig();
--  // the socket poolServer will listen to
--  private TServerTransport socket;
--  // RPC processing server
--  private TServer poolServer;
--  Node thisNode;
--
--  TProtocolFactory protocolFactory =
--      config.isRpcThriftCompressionEnabled()
--          ? new TCompactProtocol.Factory()
--          : new TBinaryProtocol.Factory();
--
--  // this thread pool is to run the thrift server (poolServer above)
--  private ExecutorService clientService;
--
--  RaftServer() {
--    thisNode = new Node();
--    // set internal rpc ip and ports
--    thisNode.setInternalIp(config.getInternalIp());
--    thisNode.setMetaPort(config.getInternalMetaPort());
--    thisNode.setDataPort(config.getInternalDataPort());
--    // set client rpc ip and ports
--    thisNode.setClientPort(config.getClusterRpcPort());
--    thisNode.setClientIp(IoTDBDescriptor.getInstance().getConfig().getRpcAddress());
--  }
--
--  RaftServer(Node thisNode) {
--    this.thisNode = thisNode;
--  }
--
--  public static int getConnectionTimeoutInMS() {
--    return connectionTimeoutInMS;
--  }
--
--  public static void setConnectionTimeoutInMS(int connectionTimeoutInMS) {
--    RaftServer.connectionTimeoutInMS = connectionTimeoutInMS;
--  }
--
--  public static int getReadOperationTimeoutMS() {
--    return readOperationTimeoutMS;
--  }
--
--  public static int getWriteOperationTimeoutMS() {
--    return writeOperationTimeoutMS;
--  }
--
--  public static int getSyncLeaderMaxWaitMs() {
--    return syncLeaderMaxWaitMs;
--  }
--
--  public static void setSyncLeaderMaxWaitMs(int syncLeaderMaxWaitMs) {
--    RaftServer.syncLeaderMaxWaitMs = syncLeaderMaxWaitMs;
--  }
--
--  public static long getHeartBeatIntervalMs() {
--    return heartBeatIntervalMs;
--  }
--
--  public static void setHeartBeatIntervalMs(long heartBeatIntervalMs) {
--    RaftServer.heartBeatIntervalMs = heartBeatIntervalMs;
--  }
--
--  /**
--   * Establish a thrift server with the configurations in ClusterConfig to listen to and respond to
--   * thrift RPCs. Calling the method twice does not induce side effects.
--   *
--   * @throws TTransportException
--   */
--  @SuppressWarnings("java:S1130") // thrown in override method
--  public void start() throws TTransportException, StartupException {
--    if (poolServer != null) {
--      return;
--    }
--
--    establishServer();
--  }
--
--  /**
--   * Stop the thrift server, close the socket and interrupt all in progress RPCs. Calling the method
--   * twice does not induce side effects.
--   */
--  public void stop() {
--    if (poolServer == null) {
--      return;
--    }
--
--    try {
--      poolServer.stop();
--    } catch (ConcurrentModificationException e) {
--      // ignore
--    }
--    socket.close();
--    clientService.shutdownNow();
--    socket = null;
--    poolServer = null;
--  }
--
--  /**
--   * @return An AsyncProcessor that contains the extended interfaces of a non-abstract subclass of
--   *     RaftService (DataService or MetaService).
--   */
--  abstract TProcessor getProcessor();
--
--  /**
--   * @return A socket that will be used to establish a thrift server to listen to RPC requests.
--   *     DataServer and MetaServer use different port, so this is to be determined.
--   * @throws TTransportException
--   */
--  abstract TServerTransport getServerSocket() throws TTransportException;
--
--  /**
--   * Each thrift RPC request will be processed in a separate thread and this will return the name
--   * prefix of such threads. This is used to fast distinguish DataServer and MetaServer in the logs
--   * for the sake of debug.
--   *
--   * @return name prefix of RPC processing threads.
--   */
--  abstract String getClientThreadPrefix();
--
--  /**
--   * The thrift server will be run in a separate thread, and this will be its name. It help you
--   * locate the desired logs quickly when debugging.
--   *
--   * @return The name of the thread running the thrift server.
--   */
--  abstract String getServerClientName();
--
--  private TServer createAsyncServer() throws TTransportException {
--    socket = getServerSocket();
--    TThreadedSelectorServer.Args poolArgs =
--        new TThreadedSelectorServer.Args((TNonblockingServerTransport) socket);
--    poolArgs.maxReadBufferBytes = IoTDBDescriptor.getInstance().getConfig().getThriftMaxFrameSize();
--    poolArgs.selectorThreads(CommonUtils.getCpuCores());
--    int maxConcurrentClientNum =
--        Math.max(CommonUtils.getCpuCores(), config.getMaxConcurrentClientNum());
--    poolArgs.executorService(
--        new ThreadPoolExecutor(
--            CommonUtils.getCpuCores(),
--            maxConcurrentClientNum,
--            poolArgs.getStopTimeoutVal(),
--            poolArgs.getStopTimeoutUnit(),
--            new SynchronousQueue<>(),
--            new ThreadFactory() {
--              private AtomicLong threadIndex = new AtomicLong(0);
--
--              @Override
--              public Thread newThread(Runnable r) {
--                return new Thread(r, getClientThreadPrefix() + threadIndex.incrementAndGet());
--              }
--            }));
--    poolArgs.processor(getProcessor());
--    poolArgs.protocolFactory(protocolFactory);
--    // async service requires FramedTransport
--    poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
--
--    // run the thrift server in a separate thread so that the main thread is not blocked
--    return new TThreadedSelectorServer(poolArgs);
--  }
--
--  private TServer createSyncServer() throws TTransportException {
--    socket = getServerSocket();
--    return ClusterUtils.createTThreadPoolServer(
--        socket, getClientThreadPrefix(), getProcessor(), protocolFactory);
--  }
--
--  private void establishServer() throws TTransportException {
--    logger.info(
--        "[{}] Cluster node {} begins to set up with {} mode",
--        getServerClientName(),
--        thisNode,
--        ClusterDescriptor.getInstance().getConfig().isUseAsyncServer() ? "Async" : "Sync");
--
--    if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
--      poolServer = createAsyncServer();
--    } else {
--      poolServer = createSyncServer();
--    }
--
--    clientService = Executors.newSingleThreadExecutor(r -> new Thread(r, getServerClientName()));
--
--    clientService.submit(() -> poolServer.serve());
--
--    logger.info("[{}] Cluster node {} is up", getServerClientName(), thisNode);
--  }
--
--  @TestOnly
--  public static void setReadOperationTimeoutMS(int readOperationTimeoutMS) {
--    RaftServer.readOperationTimeoutMS = readOperationTimeoutMS;
--  }
--
--  @TestOnly
--  public static void setWriteOperationTimeoutMS(int writeOperationTimeoutMS) {
--    RaftServer.writeOperationTimeoutMS = writeOperationTimeoutMS;
--  }
--}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
index ed99c3d,ed99c3d..348cda0
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
@@@ -23,9 -23,9 +23,8 @@@ import org.apache.iotdb.cluster.config.
  import org.apache.iotdb.cluster.rpc.thrift.Node;
  import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncProcessor;
  import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.Processor;
--import org.apache.iotdb.cluster.server.MetaClusterServer;
++import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
  import org.apache.iotdb.cluster.utils.ClusterUtils;
--
  import org.apache.thrift.TProcessor;
  import org.apache.thrift.transport.TNonblockingServerSocket;
  import org.apache.thrift.transport.TServerSocket;
@@@ -39,22 -39,22 +38,22 @@@ import java.net.InetSocketAddress
  public class MetaHeartbeatServer extends HeartbeatServer {
    private static Logger logger = LoggerFactory.getLogger(MetaHeartbeatServer.class);
  
--  private MetaClusterServer metaClusterServer;
++  private RaftTSMetaServiceImpl RaftTSMetaServiceImpl;
  
    /** Do not use this method for initialization */
    private MetaHeartbeatServer() {}
  
--  public MetaHeartbeatServer(Node thisNode, MetaClusterServer metaClusterServer) {
++  public MetaHeartbeatServer(Node thisNode, RaftTSMetaServiceImpl RaftTSMetaServiceImpl) {
      super(thisNode);
--    this.metaClusterServer = metaClusterServer;
++    this.RaftTSMetaServiceImpl = RaftTSMetaServiceImpl;
    }
  
    @Override
    TProcessor getProcessor() {
      if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
--      return new AsyncProcessor<>(metaClusterServer);
++      return new AsyncProcessor<>(RaftTSMetaServiceImpl);
      } else {
--      return new Processor<>(metaClusterServer);
++      return new Processor<>(RaftTSMetaServiceImpl);
      }
    }
  
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
index 39ebf3c,f917916..62ce37e
--- 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
@@@ -65,11 -65,11 +65,9 @@@ import org.apache.iotdb.cluster.rpc.thr
  import org.apache.iotdb.cluster.rpc.thrift.StartUpStatus;
  import org.apache.iotdb.cluster.rpc.thrift.TSMetaService;
  import org.apache.iotdb.cluster.rpc.thrift.TSMetaService.AsyncClient;
- import org.apache.iotdb.cluster.server.ClusterTSServiceImpl;
 -import org.apache.iotdb.cluster.server.ClientServer;
  import org.apache.iotdb.cluster.server.DataClusterServer;
  import org.apache.iotdb.cluster.server.HardLinkCleaner;
  import org.apache.iotdb.cluster.server.NodeCharacter;
--import org.apache.iotdb.cluster.server.RaftServer;
  import org.apache.iotdb.cluster.server.Response;
  import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
  import org.apache.iotdb.cluster.server.handlers.caller.NodeStatusHandler;
@@@ -87,20 -87,20 +85,22 @@@ import org.apache.iotdb.cluster.utils.S
  import org.apache.iotdb.cluster.utils.nodetool.function.Status;
  import org.apache.iotdb.db.conf.IoTDBDescriptor;
  import org.apache.iotdb.db.engine.StorageEngine;
++import org.apache.iotdb.db.exception.ShutdownException;
  import org.apache.iotdb.db.exception.StartupException;
  import org.apache.iotdb.db.exception.StorageEngineException;
  import org.apache.iotdb.db.exception.metadata.MetadataException;
  import org.apache.iotdb.db.exception.query.QueryProcessException;
  import org.apache.iotdb.db.metadata.PartialPath;
  import org.apache.iotdb.db.qp.physical.PhysicalPlan;
++import org.apache.iotdb.db.service.IService;
  import org.apache.iotdb.db.service.IoTDB;
++import org.apache.iotdb.db.service.ServiceType;
  import org.apache.iotdb.db.utils.TestOnly;
  import org.apache.iotdb.db.utils.TimeValuePairUtils;
  import org.apache.iotdb.db.utils.TimeValuePairUtils.Intervals;
  import org.apache.iotdb.service.rpc.thrift.EndPoint;
  import org.apache.iotdb.service.rpc.thrift.TSStatus;
  import org.apache.iotdb.tsfile.read.filter.basic.Filter;
--
  import org.apache.thrift.TException;
  import org.apache.thrift.protocol.TProtocolFactory;
  import org.apache.thrift.transport.TTransportException;
@@@ -145,7 -145,7 +145,7 @@@ import static org.apache.iotdb.cluster.
  import static org.apache.iotdb.cluster.utils.ClusterUtils.analyseStartUpCheckResult;
  
  @SuppressWarnings("java:S1135")
--public class MetaGroupMember extends RaftMember {
++public class MetaGroupMember extends RaftMember implements IService {
  
    /** the file that contains the identifier of this node */
    static final String NODE_IDENTIFIER_FILE_NAME =
@@@ -209,12 -209,12 +209,6 @@@
    /** each node starts a data heartbeat server to transfer heartbeat requests */
    private DataHeartbeatServer dataHeartbeatServer;
  
--  /**
--   * an override of TSServiceImpl, which redirect JDBC and Session requests to the MetaGroupMember
--   * so they can be processed cluster-wide
--   */
-   private ClusterTSServiceImpl clusterTSServiceImpl;
 -  private ClientServer clientServer;
--
    private DataClientProvider dataClientProvider;
  
    /**
@@@ -276,7 -276,7 +270,6 @@@
      Factory dataMemberFactory = new Factory(factory, this);
      dataClusterServer = new DataClusterServer(thisNode, dataMemberFactory, this);
      dataHeartbeatServer = new DataHeartbeatServer(thisNode, dataClusterServer);
-     clusterTSServiceImpl = new ClusterTSServiceImpl(this);
 -    clientServer = new ClientServer(this);
      startUpStatus = getNewStartUpStatus();
  
      // try loading the partition table if there was a previous cluster
@@@ -333,8 -333,8 +326,8 @@@
    }
  
    /**
-    * Stop the heartbeat and catch-up thread pool, DataClusterServer, ClusterTSServiceImpl and reportThread.
 -   * Stop the heartbeat and catch-up thread pool, DataClusterServer, ClientServer and reportThread.
--   * Calling the method twice does not induce side effects.
++   * Stop the heartbeat and catch-up thread pool, DataClusterServer, ClusterTSServiceImpl and
++   * reportThread. Calling the method twice does not induce side effects.
     */
    @Override
    public void stop() {
@@@ -345,9 -345,9 +338,6 @@@
      if (getDataHeartbeatServer() != null) {
        getDataHeartbeatServer().stop();
      }
-     if (clusterTSServiceImpl != null) {
-       clusterTSServiceImpl.stop();
 -    if (clientServer != null) {
 -      clientServer.stop();
--    }
      if (reportThread != null) {
        reportThread.shutdownNow();
        try {
@@@ -370,15 -370,15 +360,29 @@@
      logger.info("{}: stopped", name);
    }
  
++  @Override
++  public void waitAndStop(long milliseconds) {
++    IService.super.waitAndStop(milliseconds);
++  }
++
++  @Override
++  public void shutdown(long milliseconds) throws ShutdownException {
++    IService.super.shutdown(milliseconds);
++  }
++
++  @Override
++  public ServiceType getID() {
++    return ServiceType.CLUSTER_META_ENGINE;
++  }
++
    /**
-    * Start DataClusterServer and ClusterTSServiceImpl so this node will be able to respond to other nodes
 -   * Start DataClusterServer and ClientServer so this node will be able to respond to other nodes
--   * and clients.
++   * Start DataClusterServer and ClusterTSServiceImpl so this node will be able to respond to other
++   * nodes and clients.
     */
    protected void initSubServers() throws TTransportException, StartupException {
      getDataClusterServer().start();
      getDataHeartbeatServer().start();
-     clusterTSServiceImpl.setCoordinator(this.coordinator);
-     clusterTSServiceImpl.start();
 -    clientServer.setCoordinator(this.coordinator);
 -    clientServer.start();
++    // TODO FIXME
    }
  
    /**
@@@ -715,9 -714,9 +718,9 @@@
    /**
     * Process a HeartBeatResponse from a follower. If the follower has provided its identifier, try
     * registering for it and if all nodes have registered and there is no available partition table,
-    * initialize a new one and start the ClusterTSServiceImpl and DataClusterServer. If the follower requires
 -   * initialize a new one and start the ClientServer and DataClusterServer. If the follower requires
--   * a partition table, add it to the blind node list so that at the next heartbeat this node will
--   * send it a partition table
++   * initialize a new one and start the ClusterTSServiceImpl and DataClusterServer. If the follower
++   * requires a partition table, add it to the blind node list so that at the next heartbeat this
++   * node will send it a partition table
     */
    @Override
    public void processValidHeartbeatResp(HeartBeatResponse response, Node receiver) {
@@@ -800,8 -799,8 +803,8 @@@
    }
  
    /**
-    * Start the DataClusterServer and ClusterTSServiceImpl` so this node can serve other nodes and clients.
 -   * Start the DataClusterServer and ClientServer so this node can serve other nodes and clients.
--   * Also build DataGroupMembers using the partition table.
++   * Start the DataClusterServer and ClusterTSServiceImpl` so this node can serve other nodes and
++   * clients. Also build DataGroupMembers using the partition table.
     */
    protected synchronized void startSubServers() {
      logger.info("Starting sub-servers...");
@@@ -1452,7 -1451,7 +1455,8 @@@
    private TSStatus forwardDataPlanAsync(PhysicalPlan plan, Node receiver, RaftNode header)
        throws IOException {
      RaftService.AsyncClient client =
--        getClientProvider().getAsyncDataClient(receiver, RaftServer.getWriteOperationTimeoutMS());
++        getClientProvider()
++            .getAsyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
      return forwardPlanAsync(plan, receiver, header, client);
    }
  
@@@ -1461,7 -1460,7 +1465,8 @@@
      Client client;
      try {
        client =
--          getClientProvider().getSyncDataClient(receiver, RaftServer.getWriteOperationTimeoutMS());
++          getClientProvider()
++              .getSyncDataClient(receiver, ClusterConstant.getWriteOperationTimeoutMS());
      } catch (TException e) {
        throw new IOException(e);
      }
@@@ -1630,7 -1629,7 +1635,7 @@@
      client.collectMigrationStatus(migrationStatusHandler);
      synchronized (resultRef) {
        if (resultRef.get() == null) {
--        resultRef.wait(RaftServer.getConnectionTimeoutInMS());
++        resultRef.wait(ClusterConstant.getConnectionTimeoutInMS());
        }
      }
      return ClusterUtils.deserializeMigrationStatus(resultRef.get());
@@@ -1814,9 -1813,9 +1819,10 @@@
                      // ignore
                    }
                    super.stop();
-                   if (clusterTSServiceImpl != null) {
-                     clusterTSServiceImpl.stop();
 -                  if (clientServer != null) {
 -                    clientServer.stop();
--                  }
++                  // TODO FIXME
++                  //                  if (clusterTSServiceImpl != null) {
++                  //                    clusterTSServiceImpl.stop();
++                  //                  }
                    logger.info("{} has been removed from the cluster", name);
                  })
              .start();
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
index 9250785,ce941f5..560c0fe
--- a/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/utils/nodetool/ClusterMonitor.java
@@@ -18,7 -18,7 +18,8 @@@
   */
  package org.apache.iotdb.cluster.utils.nodetool;
  
 -import org.apache.iotdb.cluster.ClusterMain;
++import org.apache.commons.collections4.map.MultiKeyMap;
 +import org.apache.iotdb.cluster.ClusterIoTDB;
  import org.apache.iotdb.cluster.config.ClusterConstant;
  import org.apache.iotdb.cluster.config.ClusterDescriptor;
  import org.apache.iotdb.cluster.partition.PartitionGroup;
@@@ -26,8 -26,8 +27,8 @@@ import org.apache.iotdb.cluster.partiti
  import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
  import org.apache.iotdb.cluster.rpc.thrift.Node;
  import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
--import org.apache.iotdb.cluster.server.MetaClusterServer;
  import org.apache.iotdb.cluster.server.NodeCharacter;
++import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
  import org.apache.iotdb.cluster.server.member.DataGroupMember;
  import org.apache.iotdb.cluster.server.member.MetaGroupMember;
  import org.apache.iotdb.cluster.server.monitor.Timer;
@@@ -40,8 -40,8 +41,6 @@@ import org.apache.iotdb.db.service.ISer
  import org.apache.iotdb.db.service.JMXService;
  import org.apache.iotdb.db.service.ServiceType;
  import org.apache.iotdb.tsfile.utils.Pair;
--
--import org.apache.commons.collections4.map.MultiKeyMap;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -201,11 -201,11 +200,11 @@@ public class ClusterMonitor implements 
    }
  
    private MetaGroupMember getMetaGroupMember() {
-     MetaClusterServer metaClusterServer = ClusterIoTDB.getInstance().getMetaServer();
 -    MetaClusterServer metaClusterServer = ClusterMain.getMetaServer();
--    if (metaClusterServer == null) {
++    RaftTSMetaServiceImpl RaftTSMetaServiceImpl = ClusterIoTDB.getInstance().getMetaServer();
++    if (RaftTSMetaServiceImpl == null) {
        return null;
      }
--    return metaClusterServer.getMember();
++    return RaftTSMetaServiceImpl.getMember();
    }
  
    private PartitionTable getPartitionTable() {
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
index 7565e9d,70fbb66..c4f1dd7
--- a/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/integration/BaseSingleNodeTest.java
@@@ -20,12 -20,12 +20,11 @@@
  package org.apache.iotdb.cluster.integration;
  
  import org.apache.iotdb.cluster.config.ClusterDescriptor;
--import org.apache.iotdb.cluster.server.MetaClusterServer;
++import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
  import org.apache.iotdb.cluster.utils.Constants;
  import org.apache.iotdb.db.utils.EnvironmentUtils;
  import org.apache.iotdb.rpc.IoTDBConnectionException;
  import org.apache.iotdb.session.Session;
--
  import org.junit.After;
  import org.junit.Before;
  
@@@ -34,7 -34,7 +33,7 @@@ import java.util.List
  
  public abstract class BaseSingleNodeTest {
  
--  private MetaClusterServer metaServer;
++  private RaftTSMetaServiceImpl metaServer;
  
    private boolean useAsyncServer;
    private List<String> seedNodeUrls;
@@@ -44,14 -44,13 +43,14 @@@
    @Before
    public void setUp() throws Exception {
      initConfigs();
--    metaServer = new MetaClusterServer();
++    metaServer = new RaftTSMetaServiceImpl();
      metaServer.start();
      metaServer.buildCluster();
    }
  
    @After
    public void tearDown() throws Exception {
-     //TODO fixme
++    // TODO fixme
      metaServer.stop();
      recoverConfigs();
      EnvironmentUtils.cleanEnv();
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
index 499efce,5dde20f..60da68d8
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServiceImplTest.java
@@@ -19,15 -19,15 +19,14 @@@
  
  package org.apache.iotdb.cluster.server.clusterinfo;
  
 -import org.apache.iotdb.cluster.ClusterMain;
 +import org.apache.iotdb.cluster.ClusterIoTDB;
  import org.apache.iotdb.cluster.rpc.thrift.DataPartitionEntry;
  import org.apache.iotdb.cluster.rpc.thrift.Node;
--import org.apache.iotdb.cluster.server.MetaClusterServer;
++import org.apache.iotdb.cluster.server.RaftTSMetaServiceImpl;
  import org.apache.iotdb.cluster.server.member.MetaGroupMember;
  import org.apache.iotdb.cluster.server.member.MetaGroupMemberTest;
  import org.apache.iotdb.db.exception.metadata.MetadataException;
  import org.apache.iotdb.db.metadata.PartialPath;
--
  import org.apache.thrift.TException;
  import org.junit.After;
  import org.junit.Assert;
@@@ -48,13 -48,13 +47,13 @@@ public class ClusterInfoServiceImplTes
      metaGroupMemberTest.setUp();
      MetaGroupMember metaGroupMember = metaGroupMemberTest.getTestMetaGroupMember();
  
--    MetaClusterServer metaClusterServer = new MetaClusterServer();
--    metaClusterServer.getMember().stop();
--    metaClusterServer.setMetaGroupMember(metaGroupMember);
++    RaftTSMetaServiceImpl RaftTSMetaServiceImpl = new RaftTSMetaServiceImpl();
++    RaftTSMetaServiceImpl.getMember().stop();
++    RaftTSMetaServiceImpl.setMetaGroupMember(metaGroupMember);
  
-     ClusterIoTDB.setMetaClusterServer(metaClusterServer);
 -    ClusterMain.setMetaClusterServer(metaClusterServer);
++    ClusterIoTDB.setMetaClusterServer(RaftTSMetaServiceImpl);
  
--    metaClusterServer.getIoTDB().metaManager.setStorageGroup(new PartialPath("root", "sg"));
++    RaftTSMetaServiceImpl.getIoTDB().metaManager.setStorageGroup(new PartialPath("root", "sg"));
      // metaClusterServer.getMember()
      impl = new ClusterInfoServiceImpl();
    }
diff --cc server/src/main/java/org/apache/iotdb/db/concurrent/IoTDBThreadPoolFactory.java
index 6f425ae,6f425ae..7c75e89
--- a/server/src/main/java/org/apache/iotdb/db/concurrent/IoTDBThreadPoolFactory.java
+++ b/server/src/main/java/org/apache/iotdb/db/concurrent/IoTDBThreadPoolFactory.java
@@@ -27,6 -27,6 +27,7 @@@ import java.util.concurrent.Executors
  import java.util.concurrent.ScheduledExecutorService;
  import java.util.concurrent.SynchronousQueue;
  import java.util.concurrent.ThreadPoolExecutor;
++import java.util.concurrent.TimeUnit;
  
  /** This class is used to create thread pool which must contain the pool name. */
  public class IoTDBThreadPoolFactory {
@@@ -132,6 -132,6 +133,23 @@@
  
    /** function for creating thrift rpc client thread pool. */
    public static ExecutorService createThriftRpcClientThreadPool(
++      int minWorkerThreads,
++      int maxWorkerThreads,
++      int stopTimeoutVal,
++      TimeUnit stopTimeoutUnit,
++      String poolName) {
++    SynchronousQueue<Runnable> executorQueue = new SynchronousQueue<>();
++    return new ThreadPoolExecutor(
++        minWorkerThreads,
++        maxWorkerThreads,
++        stopTimeoutVal,
++        stopTimeoutUnit,
++        executorQueue,
++        new IoTThreadFactory(poolName));
++  }
++
++  /** function for creating thrift rpc client thread pool. */
++  public static ExecutorService createThriftRpcClientThreadPool(
        TThreadPoolServer.Args args, String poolName, Thread.UncaughtExceptionHandler handler) {
      SynchronousQueue<Runnable> executorQueue = new SynchronousQueue<>();
      return new ThreadPoolExecutor(
diff --cc server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
index bbbd6f1,0850b75..d37f57e
--- a/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
+++ b/server/src/main/java/org/apache/iotdb/db/concurrent/ThreadName.java
@@@ -46,9 -46,7 +46,12 @@@ public enum ThreadName 
    QUERY_SERVICE("Query"),
    WINDOW_EVALUATION_SERVICE("WindowEvaluationTaskPoolManager"),
    CONTINUOUS_QUERY_SERVICE("ContinuousQueryTaskPoolManager"),
 -  CLUSTER_INFO_SERVICE("ClusterInfoClient");
 +  CLUSTER_INFO_SERVICE("ClusterInfoClient"),
 +  CLUSTER_RPC_SERVICE("ClusterRPC"),
-   CLUSTER_RPC_CLIENT("Cluster-RPC-Client");
++  CLUSTER_RPC_CLIENT("Cluster-RPC-Client"),
++  CLUSTER_META_SERVICE("ClusterMetaService"),
++  CLUSTER_META_HEARTBEAT_SERVICE("ClusterMetaHeartbeatService"),
++  CLUSTER_DATA_SERVICE("ClusterDataService");
  
    private final String name;
  
diff --cc server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
index 6b61323,b2dd13a..83db4bc
--- a/server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/control/TracingManager.java
@@@ -43,19 -43,13 +43,20 @@@ public class TracingManager 
    private static final String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
    private BufferedWriter writer;
    private Map<Long, Long> queryStartTime = new ConcurrentHashMap<>();
+   private Map<Long, TracingInfo> tracingInfoMap = new ConcurrentHashMap<>();
  
 -  public TracingManager(String dirName, String logFileName) {
 -    initTracingManager(dirName, logFileName);
 +  private TracingManager() {
 +    initTracingManager();
    }
  
 -  public void initTracingManager(String dirName, String logFileName) {
 +  public void initTracingManager() {
 +    if (this.writer != null) {
-       //the tracing manager has been initialized.
++      // the tracing manager has been initialized.
 +      return;
 +    }
 +    String dirName = IoTDBDescriptor.getInstance().getConfig().getTracingDir();
 +    String logFileName = IoTDBConstant.TRACING_LOG;
 +
      File tracingDir = SystemFileFactory.INSTANCE.getFile(dirName);
      if (!tracingDir.exists()) {
        if (tracingDir.mkdirs()) {
diff --cc server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
index 9cd89e6,1154e3d..f15d384
--- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java
@@@ -152,14 -152,6 +152,14 @@@ public class IoTDB implements IoTDBMBea
  
    private void deactivate() {
      logger.info("Deactivating IoTDB...");
-     //some user may call Tracing on but do not close tracing.
-     //so, when remove the system, we have to close the tracing
++    // some user may call Tracing on but do not close tracing.
++    // so, when remove the system, we have to close the tracing
 +    if (IoTDBDescriptor.getInstance().getConfig().isEnablePerformanceTracing()) {
 +      TracingManager.getInstance().close();
 +    }
 +    PrimitiveArrayManager.close();
 +    SystemInfo.getInstance().close();
 +
      registerManager.deregisterAll();
      JMXService.deregisterMBean(mbeanName);
      logger.info("IoTDB is deactivated.");
diff --cc server/src/main/java/org/apache/iotdb/db/service/RPCService.java
index be5f2f7,5bbddec..6f9292c
--- a/server/src/main/java/org/apache/iotdb/db/service/RPCService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/RPCService.java
@@@ -47,6 -55,6 +47,7 @@@ public class RPCService extends ThriftS
          (TSServiceImpl)
              Class.forName(IoTDBDescriptor.getInstance().getConfig().getRpcImplClassName())
                  .newInstance();
++    initSyncedServiceImpl(null);
      processor = new Processor<>(impl);
    }
  
diff --cc server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
index febacac,2f61d90..90b0136
--- a/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/ServiceType.java
@@@ -55,9 -55,6 +55,12 @@@ public enum ServiceType 
    SYSTEMINFO_SERVICE("MemTable Monitor Service", "MemTable, Monitor"),
    CONTINUOUS_QUERY_SERVICE("Continuous Query Service", "Continuous Query Service"),
    CLUSTER_INFO_SERVICE("Cluster Monitor Service (thrift-based)", "Cluster Monitor-Thrift"),
 +
-   CLUSTER_RPC_SERVICE("Cluster RPC ServerService", "ClusterRPCService"),
- 
++  CLUSTER_RPC_SERVICE("Cluster RPC Service", "ClusterRPCService"),
++  CLUSTER_META_RPC_SERVICE("Cluster Meta RPC Service", "ClusterMetaRPCService"),
++  CLUSTER_DATA_RPC_SERVICE("Cluster Data RPC Service", "ClusterDataRPCService"),
++  CLUSTER_META_ENGINE("Cluster Meta Engine", "ClusterMetaEngine"),
++  CLUSTER_META_HEART_BEAT("Cluster Meta Heartbeat Service", "ClusterMetaHeartbeat"),
    ;
  
    private final String name;
diff --cc server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
index dfb2526,d975743..45fb0ec
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftService.java
@@@ -19,13 -19,13 +19,10 @@@
  
  package org.apache.iotdb.db.service.thrift;
  
--import org.apache.iotdb.db.conf.IoTDBConfig;
  import org.apache.iotdb.db.conf.IoTDBConstant;
--import org.apache.iotdb.db.conf.IoTDBDescriptor;
  import org.apache.iotdb.db.exception.StartupException;
  import org.apache.iotdb.db.service.IService;
  import org.apache.iotdb.db.service.JMXService;
--
  import org.apache.thrift.TProcessor;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@@ -78,6 -83,6 +75,17 @@@ public abstract class ThriftService imp
      JMXService.deregisterMBean(mbeanName);
    }
  
++  boolean setSyncedImpl = false;
++  boolean setAsyncedImpl = false;
++
++  public void initSyncedServiceImpl(Object serviceImpl) {
++    setSyncedImpl = true;
++  }
++
++  public void initAsyncedServiceImpl(Object serviceImpl) {
++    setAsyncedImpl = true;
++  }
++
    public abstract void initTProcessor()
        throws ClassNotFoundException, IllegalAccessException, InstantiationException;
  
@@@ -101,6 -106,6 +109,10 @@@
      try {
        reset();
        initTProcessor();
++      if (setSyncedImpl || setAsyncedImpl) {
++        throw new StartupException(
++            "At least one service implementataion of {} should be set.", this.getID().getName());
++      }
        initThriftServiceThread();
        thriftServiceThread.setThreadStopLatch(stopLatch);
        thriftServiceThread.start();
diff --cc server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
index 2564d05,612d187..ed2237d
--- a/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
+++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/ThriftServiceThread.java
@@@ -24,14 -24,14 +24,18 @@@ import org.apache.iotdb.db.conf.IoTDBCo
  import org.apache.iotdb.db.exception.runtime.RPCServiceException;
  import org.apache.iotdb.db.utils.CommonUtils;
  import org.apache.iotdb.rpc.RpcTransportFactory;
--
++import org.apache.thrift.TBaseAsyncProcessor;
  import org.apache.thrift.TProcessor;
  import org.apache.thrift.protocol.TBinaryProtocol;
  import org.apache.thrift.protocol.TCompactProtocol;
  import org.apache.thrift.protocol.TProtocolFactory;
++import org.apache.thrift.server.THsHaServer;
  import org.apache.thrift.server.TServer;
  import org.apache.thrift.server.TServerEventHandler;
  import org.apache.thrift.server.TThreadPoolServer;
++import org.apache.thrift.server.TThreadedSelectorServer;
++import org.apache.thrift.transport.TNonblockingServerSocket;
++import org.apache.thrift.transport.TNonblockingServerTransport;
  import org.apache.thrift.transport.TServerSocket;
  import org.apache.thrift.transport.TServerTransport;
  import org.apache.thrift.transport.TTransportException;
@@@ -40,6 -40,6 +44,7 @@@ import org.slf4j.LoggerFactory
  
  import java.net.InetSocketAddress;
  import java.util.concurrent.CountDownLatch;
++import java.util.concurrent.TimeUnit;
  
  public class ThriftServiceThread extends Thread {
  
@@@ -51,8 -51,8 +56,95 @@@
    private String serviceName;
  
    private TProtocolFactory protocolFactory;
--  private TThreadPoolServer.Args poolArgs;
  
++  // currently, we can reuse the ProtocolFactory instance.
++  private static TCompactProtocol.Factory compactProtocolFactory = new TCompactProtocol.Factory();
++  private static TBinaryProtocol.Factory binaryProtocolFactory = new TBinaryProtocol.Factory();
++
++  private void initProtocolFactory(boolean compress) {
++    protocolFactory = getProtocolFactory(compress);
++  }
++
++  public static TProtocolFactory getProtocolFactory(boolean compress) {
++    if (compress) {
++      return compactProtocolFactory;
++    } else {
++      return binaryProtocolFactory;
++    }
++  }
++
++  private void catchFailedInitialization(TTransportException e) throws RPCServiceException {
++    close();
++    if (threadStopLatch == null) {
++      logger.debug("Stop Count Down latch is null");
++    } else {
++      logger.debug("Stop Count Down latch is {}", threadStopLatch.getCount());
++    }
++    if (threadStopLatch != null && threadStopLatch.getCount() == 1) {
++      threadStopLatch.countDown();
++    }
++    logger.debug(
++        "{}: close TThreadPoolServer and TServerSocket for {}",
++        IoTDBConstant.GLOBAL_DB_NAME,
++        serviceName);
++    throw new RPCServiceException(
++        String.format(
++            "%s: failed to start %s, because ", IoTDBConstant.GLOBAL_DB_NAME, serviceName),
++        e);
++  }
++
++  /** for asynced ThriftService */
++  @SuppressWarnings("squid:S107")
++  public ThriftServiceThread(
++      TBaseAsyncProcessor processor,
++      String serviceName,
++      String threadsName,
++      String bindAddress,
++      int port,
++      int maxWorkerThreads,
++      int timeoutSecond,
++      TServerEventHandler serverEventHandler,
++      boolean compress,
++      int connectionTimeoutInMS,
++      int maxReadBufferBytes,
++      ServerType serverType) {
++    initProtocolFactory(compress);
++    this.serviceName = serviceName;
++    try {
++      serverTransport = openNonblockingTransport(bindAddress, port, connectionTimeoutInMS);
++      switch (serverType) {
++        case SELECTOR:
++          TThreadedSelectorServer.Args poolArgs =
++              initAsyncedSelectorPoolArgs(
++                  processor, threadsName, maxWorkerThreads, timeoutSecond, maxReadBufferBytes);
++          poolServer = new TThreadedSelectorServer(poolArgs);
++          break;
++        case HSHA:
++          THsHaServer.Args poolArgs1 =
++              initAsyncedHshaPoolArgs(
++                  processor, threadsName, maxWorkerThreads, timeoutSecond, maxReadBufferBytes);
++          poolServer = new THsHaServer(poolArgs1);
++          break;
++      }
++      poolServer.setServerEventHandler(serverEventHandler);
++    } catch (TTransportException e) {
++      catchFailedInitialization(e);
++    }
++  }
++
++  /**
++   * for synced ThriftServiceThread
++   *
++   * @param processor
++   * @param serviceName
++   * @param threadsName
++   * @param bindAddress
++   * @param port
++   * @param maxWorkerThreads
++   * @param timeoutSecond
++   * @param serverEventHandler
++   * @param compress
++   */
    @SuppressWarnings("squid:S107")
    public ThriftServiceThread(
        TProcessor processor,
@@@ -61,53 -61,53 +153,84 @@@
        String bindAddress,
        int port,
        int maxWorkerThreads,
 -      int timeoutMs,
 +      int timeoutSecond,
        TServerEventHandler serverEventHandler,
        boolean compress) {
--    if (compress) {
--      protocolFactory = new TCompactProtocol.Factory();
--    } else {
--      protocolFactory = new TBinaryProtocol.Factory();
--    }
++    initProtocolFactory(compress);
      this.serviceName = serviceName;
  
      try {
        serverTransport = openTransport(bindAddress, port);
--      poolArgs =
--          new TThreadPoolServer.Args(serverTransport)
--              .maxWorkerThreads(maxWorkerThreads)
--              .minWorkerThreads(CommonUtils.getCpuCores())
-               .stopTimeoutVal(timeoutSecond);
 -              .stopTimeoutVal(timeoutMs);
--      poolArgs.executorService =
--          IoTDBThreadPoolFactory.createThriftRpcClientThreadPool(poolArgs, threadsName);
--      poolArgs.processor(processor);
--      poolArgs.protocolFactory(protocolFactory);
--      poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
++      TThreadPoolServer.Args poolArgs =
++          initSyncedPoolArgs(processor, threadsName, maxWorkerThreads, timeoutSecond);
        poolServer = new TThreadPoolServer(poolArgs);
        poolServer.setServerEventHandler(serverEventHandler);
      } catch (TTransportException e) {
--      close();
--      if (threadStopLatch == null) {
--        logger.debug("Stop Count Down latch is null");
--      } else {
--        logger.debug("Stop Count Down latch is {}", threadStopLatch.getCount());
--      }
--      if (threadStopLatch != null && threadStopLatch.getCount() == 1) {
--        threadStopLatch.countDown();
--      }
--      logger.debug(
--          "{}: close TThreadPoolServer and TServerSocket for {}",
--          IoTDBConstant.GLOBAL_DB_NAME,
--          serviceName);
--      throw new RPCServiceException(
--          String.format(
--              "%s: failed to start %s, because ", IoTDBConstant.GLOBAL_DB_NAME, serviceName),
--          e);
++      catchFailedInitialization(e);
      }
    }
  
++  private TThreadPoolServer.Args initSyncedPoolArgs(
++      TProcessor processor, String threadsName, int maxWorkerThreads, int timeoutSecond) {
++    TThreadPoolServer.Args poolArgs = new TThreadPoolServer.Args(serverTransport);
++    poolArgs
++        .maxWorkerThreads(maxWorkerThreads)
++        .minWorkerThreads(CommonUtils.getCpuCores())
++        .stopTimeoutVal(timeoutSecond);
++    poolArgs.executorService =
++        IoTDBThreadPoolFactory.createThriftRpcClientThreadPool(poolArgs, threadsName);
++    poolArgs.processor(processor);
++    poolArgs.protocolFactory(protocolFactory);
++    poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
++    return poolArgs;
++  }
++
++  private TThreadedSelectorServer.Args initAsyncedSelectorPoolArgs(
++      TBaseAsyncProcessor processor,
++      String threadsName,
++      int maxWorkerThreads,
++      int timeoutSecond,
++      int maxReadBufferBytes) {
++    TThreadedSelectorServer.Args poolArgs =
++        new TThreadedSelectorServer.Args((TNonblockingServerTransport) serverTransport);
++    poolArgs.maxReadBufferBytes = maxReadBufferBytes;
++    poolArgs.selectorThreads(CommonUtils.getCpuCores());
++    poolArgs.executorService(
++        IoTDBThreadPoolFactory.createThriftRpcClientThreadPool(
++            CommonUtils.getCpuCores(),
++            maxWorkerThreads,
++            timeoutSecond,
++            TimeUnit.SECONDS,
++            threadsName));
++    poolArgs.processor(processor);
++    poolArgs.protocolFactory(protocolFactory);
++    poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
++    return poolArgs;
++  }
++
++  private THsHaServer.Args initAsyncedHshaPoolArgs(
++      TBaseAsyncProcessor processor,
++      String threadsName,
++      int maxWorkerThreads,
++      int timeoutSecond,
++      int maxReadBufferBytes) {
++    THsHaServer.Args poolArgs = new THsHaServer.Args((TNonblockingServerTransport) serverTransport);
++    poolArgs.maxReadBufferBytes = maxReadBufferBytes;
++    poolArgs.executorService(
++        IoTDBThreadPoolFactory.createThriftRpcClientThreadPool(
++            CommonUtils.getCpuCores(),
++            maxWorkerThreads,
++            timeoutSecond,
++            TimeUnit.SECONDS,
++            threadsName));
++    poolArgs.processor(processor);
++    poolArgs.protocolFactory(protocolFactory);
++    poolArgs.transportFactory(RpcTransportFactory.INSTANCE);
++    return poolArgs;
++  }
++
    @SuppressWarnings("java:S2259")
--  public TServerTransport openTransport(String bindAddress, int port) throws TTransportException {
++  private TServerTransport openTransport(String bindAddress, int port) throws TTransportException {
      int maxRetry = 5;
      long retryIntervalMS = 5000;
      TTransportException lastExp = null;
@@@ -127,6 -127,6 +250,28 @@@
      throw lastExp;
    }
  
++  private TServerTransport openNonblockingTransport(
++      String bindAddress, int port, int connectionTimeoutInMS) throws TTransportException {
++    int maxRetry = 5;
++    long retryIntervalMS = 5000;
++    TTransportException lastExp = null;
++    for (int i = 0; i < maxRetry; i++) {
++      try {
++        return new TNonblockingServerSocket(
++            new InetSocketAddress(bindAddress, port), connectionTimeoutInMS);
++      } catch (TTransportException e) {
++        lastExp = e;
++        try {
++          Thread.sleep(retryIntervalMS);
++        } catch (InterruptedException interruptedException) {
++          Thread.currentThread().interrupt();
++          break;
++        }
++      }
++    }
++    throw lastExp;
++  }
++
    public void setThreadStopLatch(CountDownLatch threadStopLatch) {
      this.threadStopLatch = threadStopLatch;
    }
@@@ -177,4 -177,4 +322,9 @@@
      }
      return false;
    }
++
++  public static enum ServerType {
++    SELECTOR,
++    HSHA
++  }
  }
diff --cc server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
index 96ec8ef,96ec8ef..c7a1b9e
--- a/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
+++ b/server/src/main/java/org/apache/iotdb/db/sync/receiver/SyncServerManager.java
@@@ -29,7 -29,7 +29,6 @@@ import org.apache.iotdb.db.sync.receive
  import org.apache.iotdb.db.sync.receiver.recover.SyncReceiverLogAnalyzer;
  import org.apache.iotdb.db.sync.receiver.transfer.SyncServiceImpl;
  import org.apache.iotdb.service.sync.thrift.SyncService;
--
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
@@@ -61,6 -61,6 +60,7 @@@ public class SyncServerManager extends 
  
    @Override
    public void initTProcessor() {
++    initSyncedServiceImpl(null);
      serviceImpl = new SyncServiceImpl();
      processor = new SyncService.Processor<>(serviceImpl);
    }
@@@ -93,6 -93,6 +93,11 @@@
    }
  
    @Override
++  public int getRPCPort() {
++    return getBindPort();
++  }
++
++  @Override
    public void startService() throws StartupException {
      IoTDBConfig config = IoTDBDescriptor.getInstance().getConfig();
      if (!config.isSyncEnable()) {

[iotdb] 06/07: Merge remote-tracking branch 'origin/master' into cluster-

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit aae37ad7c23ec2293c154d8a375725b717969b09
Merge: 4246406 4884dc8
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Aug 10 09:51:35 2021 +0800

    Merge remote-tracking branch 'origin/master' into cluster-

 .../iotdb/cluster/config/ClusterDescriptor.java    |    2 +-
 example/mqtt-customize/pom.xml                     |    1 -
 .../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java     |   68 +-
 .../main/java/org/apache/iotdb/jdbc/Constant.java  |    3 +
 .../src/main/java/org/apache/iotdb/jdbc/Field.java |   71 +
 .../iotdb/jdbc/GroupedLSBWatermarkEncoder.java     |  139 +
 .../org/apache/iotdb/jdbc/IoTDBConnection.java     |   16 +-
 .../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java   | 2744 +++++++++++++++++---
 .../org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java  |   58 +-
 .../iotdb/jdbc/IoTDBNonAlignJDBCResultSet.java     |   38 +-
 .../apache/iotdb/jdbc/IoTDBPreparedStatement.java  |  585 ++++-
 .../org/apache/iotdb/jdbc/IoTDBResultMetadata.java |  173 +-
 .../java/org/apache/iotdb/jdbc/IoTDBStatement.java |   38 +-
 .../iotdb/jdbc/{Constant.java => ListDataSet.java} |   33 +-
 .../java/org/apache/iotdb/jdbc/StringUtils.java    |   78 +
 .../jdbc/{Constant.java => WatermarkEncoder.java}  |   15 +-
 .../org/apache/iotdb/jdbc/IoTDBConnectionTest.java |    3 +-
 .../iotdb/jdbc/IoTDBDatabaseMetadataTest.java      |  162 ++
 .../iotdb/jdbc/IoTDBPreparedStatementTest.java     |   32 +-
 .../apache/iotdb/jdbc/IoTDBResultMetadataTest.java |   21 +-
 .../db/engine/storagegroup/TsFileResource.java     |    6 +-
 .../storagegroup/timeindex/DeviceTimeIndex.java    |    2 +-
 .../storagegroup/timeindex/FileTimeIndex.java      |   71 +-
 .../engine/storagegroup/timeindex/ITimeIndex.java  |    2 +-
 .../org/apache/iotdb/db/service/TSServiceImpl.java |   67 +-
 .../apache/iotdb/db/tools/TsFileRewriteTool.java   |  148 +-
 .../db/tools/upgrade/TsFileOnlineUpgradeTool.java  |  151 +-
 .../org/apache/iotdb/rpc/IoTDBJDBCDataSet.java     |  618 +++++
 thrift/src/main/thrift/rpc.thrift                  |   13 +
 29 files changed, 4726 insertions(+), 632 deletions(-)


[iotdb] 05/07: almost pass

Posted by hx...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

hxd pushed a commit to branch cluster-
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 4246406fab87631394c5e96003187d6f1ef13e96
Author: xiangdong huang <sa...@gmail.com>
AuthorDate: Tue Aug 10 09:51:04 2021 +0800

    almost pass
---
 .../org/apache/iotdb/cluster/ClusterIoTDB.java     | 14 ++--
 .../cluster/client/async/AsyncClientPool.java      |  5 +-
 .../iotdb/cluster/client/sync/SyncClientPool.java  | 10 ++-
 .../cluster/log/snapshot/MetaSimpleSnapshot.java   |  2 +-
 .../org/apache/iotdb/cluster/server/Response.java  |  3 +
 .../server/clusterinfo/ClusterInfoServer.java      |  1 +
 .../server/heartbeat/MetaHeartbeatThread.java      |  4 +-
 .../cluster/server/member/MetaGroupMember.java     | 79 ++++++++++++++++------
 .../cluster/server/service/MetaSyncService.java    | 32 +++++++--
 .../cluster/log/applier/DataLogApplierTest.java    |  3 +-
 .../log/snapshot/MetaSimpleSnapshotTest.java       |  2 +-
 .../cluster/query/reader/DatasourceInfoTest.java   |  1 +
 .../reader/RemoteSeriesReaderByTimestampTest.java  |  1 +
 .../query/reader/RemoteSimpleSeriesReaderTest.java |  1 +
 .../mult/AssignPathManagedMergeReaderTest.java     |  5 +-
 .../reader/mult/RemoteMultSeriesReaderTest.java    |  5 +-
 .../iotdb/cluster/server/member/BaseMember.java    |  1 +
 .../cluster/server/member/MetaGroupMemberTest.java |  1 +
 .../resources/node1conf/iotdb-engine.properties    | 12 ++--
 .../resources/node2conf/iotdb-engine.properties    | 12 ++--
 .../resources/node3conf/iotdb-engine.properties    | 12 ++--
 21 files changed, 148 insertions(+), 58 deletions(-)

diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
index 07aee1e..e72b5f0 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/ClusterIoTDB.java
@@ -238,6 +238,8 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
 
   public void activeStartNodeMode() {
     try {
+      stopRaftInfoReport();
+
       startServerCheck();
       preStartCustomize();
 
@@ -249,8 +251,6 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
 
       registerManager.register(metaGroupEngine);
 
-      metaGroupEngine.buildCluster();
-
       // rpc service initialize
       if (ClusterDescriptor.getInstance().getConfig().isUseAsyncServer()) {
         MetaAsyncService metaAsyncService = new MetaAsyncService(metaGroupEngine);
@@ -265,11 +265,16 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
         DataRaftService.getInstance().initSyncedServiceImpl(dataGroupEngine);
         DataRaftHeartBeatService.getInstance().initSyncedServiceImpl(dataGroupEngine);
       }
-
       // start RPC service
+      logger.info("start Meta Heartbeat RPC service... ");
       registerManager.register(MetaRaftHeartBeatService.getInstance());
+      logger.info("start Meta RPC service... ");
       registerManager.register(MetaRaftService.getInstance());
+
+      metaGroupEngine.buildCluster();
+      logger.info("start Data Heartbeat RPC service... ");
       registerManager.register(DataRaftHeartBeatService.getInstance());
+      logger.info("start Data RPC service... ");
       registerManager.register(DataRaftService.getInstance());
       // RPC based DBA API
       registerManager.register(ClusterInfoServer.getInstance());
@@ -279,8 +284,8 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
       // So that the ClusterRPCService can work.
       registerManager.register(ClusterRPCService.getInstance());
     } catch (StartupException | StartUpCheckFailureException | ConfigInconsistentException e) {
+      logger.error("Fail to start  server", e);
       stop();
-      logger.error("Fail to start meta server", e);
     }
   }
 
@@ -291,6 +296,7 @@ public class ClusterIoTDB implements ClusterIoTDBMBean {
     //      preStartCustomize();
     //      metaServer.start();
     //      metaServer.joinCluster();
+    //      dataEngine.pullSnapshots();
     //      // Currently, we do not register ClusterInfoService as a JMX Bean,
     //      // so we use startService() rather than start()
     //      ClusterInfoServer.getInstance().startService();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
index bf0370f..719ab8d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/async/AsyncClientPool.java
@@ -25,7 +25,6 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
 import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
 import org.apache.iotdb.cluster.utils.ClusterNode;
 import org.apache.iotdb.db.utils.TestOnly;
-
 import org.apache.thrift.async.TAsyncMethodCall;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,6 +44,10 @@ public class AsyncClientPool {
   private Map<ClusterNode, Integer> nodeClientNumMap = new ConcurrentHashMap<>();
   private AsyncClientFactory asyncClientFactory;
 
+  // TODO fix me: better to throw exception if the client can not be get. Then we can remove this
+  // field.
+  public static boolean printStack;
+
   public AsyncClientPool(AsyncClientFactory asyncClientFactory) {
     this.asyncClientFactory = asyncClientFactory;
     this.waitClientTimeutMS = ClusterDescriptor.getInstance().getConfig().getWaitClientTimeoutMS();
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
index 2c279c0..c6466f4 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/client/sync/SyncClientPool.java
@@ -25,7 +25,6 @@ import org.apache.iotdb.cluster.rpc.thrift.RaftService.Client;
 import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
 import org.apache.iotdb.cluster.utils.ClusterNode;
 import org.apache.iotdb.db.utils.TestOnly;
-
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,6 +43,10 @@ public class SyncClientPool {
   private Map<ClusterNode, Integer> nodeClientNumMap = new ConcurrentHashMap<>();
   private SyncClientFactory syncClientFactory;
 
+  // TODO fix me: better to throw exception if the client can not be get. Then we can remove this
+  // field.
+  public static boolean printStack = false;
+
   public SyncClientPool(SyncClientFactory syncClientFactory) {
     this.syncClientFactory = syncClientFactory;
     this.waitClientTimeoutMS = ClusterDescriptor.getInstance().getConfig().getWaitClientTimeoutMS();
@@ -90,7 +93,10 @@ public class SyncClientPool {
           try {
             client = syncClientFactory.getSyncClient(clusterNode, this);
           } catch (TTransportException e) {
-            logger.error("Cannot open transport for client {}", node, e);
+            // TODO throw me is better.
+            if (printStack) {
+              logger.error("Cannot open transport for client {}", node, e);
+            }
             return null;
           }
           nodeClientNumMap.compute(
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshot.java b/cluster/src/main/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshot.java
index 1713426..e982d74 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshot.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshot.java
@@ -232,7 +232,7 @@ public class MetaSimpleSnapshot extends Snapshot {
         }
 
         // 4. accept partition table
-        metaGroupMember.acceptPartitionTable(snapshot.getPartitionTableBuffer(), true);
+        metaGroupMember.acceptVerifiedPartitionTable(snapshot.getPartitionTableBuffer(), true);
 
         synchronized (metaGroupMember.getLogManager()) {
           metaGroupMember.getLogManager().applySnapshot(snapshot);
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/Response.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/Response.java
index 006eec1..387549d 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/Response.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/Response.java
@@ -53,6 +53,9 @@ public class Response {
   // the request is not executed locally anc should be forwarded
   public static final long RESPONSE_NULL = Long.MIN_VALUE;
 
+  // the meta engine is not ready (except for the partitionTable is ready)
+  public static final long RESPONSE_META_NOT_READY = -12;
+
   private Response() {
     // enum-like class
   }
diff --git a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServer.java b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServer.java
index bf08e7d..39619b6 100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServer.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/clusterinfo/ClusterInfoServer.java
@@ -49,6 +49,7 @@ public class ClusterInfoServer extends ThriftService implements ClusterInfoServe
 
   @Override
   public void initTProcessor() {
+    initSyncedServiceImpl(null);
     serviceImpl = new ClusterInfoServiceImpl();
     processor = new Processor<>(serviceImpl);
   }
diff --git 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
index 4036244..137330a 100644
--- 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
@@ -22,7 +22,6 @@ package org.apache.iotdb.cluster.server.heartbeat;
 import org.apache.iotdb.cluster.rpc.thrift.Node;
 import org.apache.iotdb.cluster.server.NodeCharacter;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -85,6 +84,9 @@ public class MetaHeartbeatThread extends HeartbeatThread {
       localMetaMember
           .getAppendLogThreadPool()
           .submit(() -> localMetaMember.processEmptyContentLog());
+      // 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 --git 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
index 7b66e4d..53fbfc8 100644
--- 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
@@ -95,7 +95,6 @@ import org.apache.iotdb.db.utils.TimeValuePairUtils.Intervals;
 import org.apache.iotdb.service.rpc.thrift.EndPoint;
 import org.apache.iotdb.service.rpc.thrift.TSStatus;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
-
 import org.apache.thrift.TException;
 import org.apache.thrift.protocol.TProtocolFactory;
 import org.apache.thrift.transport.TTransportException;
@@ -211,6 +210,17 @@ public class MetaGroupMember extends RaftMember implements IService {
     return router;
   }
 
+  public boolean isReady() {
+    return ready;
+  }
+
+  public void setReady(boolean ready) {
+    this.ready = ready;
+  }
+
+  // whether the MetaEngine has been ready.
+  boolean ready = false;
+
   @TestOnly
   public MetaGroupMember() {}
 
@@ -397,8 +407,12 @@ public class MetaGroupMember extends RaftMember implements IService {
       initIdNodeMap();
       router = new ClusterPlanRouter(partitionTable);
       this.coordinator.setRouter(router);
-      startSubServers();
+      rebuildDataGroups();
+      ready = true;
     }
+    // else, we have to wait the meta group elects the Leader, and let the leader confirm the
+    // correct PartitionTable.
+    // then we can set the meta group Engine ready.
   }
 
   private void threadTaskInit() {
@@ -502,8 +516,9 @@ public class MetaGroupMember extends RaftMember implements IService {
     } else if (resp.getRespNum() == Response.RESPONSE_AGREE) {
       logger.info("Node {} admitted this node into the cluster", node);
       ByteBuffer partitionTableBuffer = resp.partitionTableBytes;
-      acceptPartitionTable(partitionTableBuffer, true);
-      getDataGroupEngine().pullSnapshots();
+      acceptVerifiedPartitionTable(partitionTableBuffer, true);
+      // this should be called in ClusterIoTDB TODO
+      // getDataGroupEngine().pullSnapshots();
       return true;
     } else if (resp.getRespNum() == Response.RESPONSE_IDENTIFIER_CONFLICT) {
       logger.info(
@@ -552,9 +567,11 @@ public class MetaGroupMember extends RaftMember implements IService {
   }
 
   /**
-   * Process the heartbeat request from a valid leader. Generate and tell the leader the identifier
-   * of the node if necessary. If the partition table is missing, use the one from the request or
-   * require it in the response.
+   * This is the behavior of a follower:
+   *
+   * <p>Process the heartbeat request from a valid leader. Generate and tell the leader the
+   * identifier of the node if necessary. If the partition table is missing, use the one from the
+   * request or require it in the response. TODO should go to RPC Service
    */
   @Override
   void processValidHeartbeatReq(HeartBeatRequest request, HeartBeatResponse response) {
@@ -575,7 +592,7 @@ public class MetaGroupMember extends RaftMember implements IService {
           // if the leader has sent the partition table then accept it
           if (partitionTable == null) {
             ByteBuffer byteBuffer = request.partitionTableBytes;
-            acceptPartitionTable(byteBuffer, true);
+            acceptVerifiedPartitionTable(byteBuffer, true);
           }
         }
       } else {
@@ -590,10 +607,11 @@ public class MetaGroupMember extends RaftMember implements IService {
    * Deserialize a partition table from the buffer, save it locally, add nodes from the partition
    * table and start DataClusterServer and ClusterTSServiceImpl.
    */
-  public synchronized void acceptPartitionTable(
+  protected synchronized void acceptPartitionTable(
       ByteBuffer partitionTableBuffer, boolean needSerialization) {
     SlotPartitionTable newTable = new SlotPartitionTable(thisNode);
     newTable.deserialize(partitionTableBuffer);
+
     // avoid overwriting current partition table with a previous one
     if (partitionTable != null) {
       long currIndex = partitionTable.getLastMetaLogIndex();
@@ -618,7 +636,20 @@ public class MetaGroupMember extends RaftMember implements IService {
 
     updateNodeList(newTable.getAllNodes());
 
-    startSubServers();
+    // we can not start the data group engine here,
+    // because the partitionTable is not verified.
+    // TODO
+    //    restartSubServers();
+  }
+
+  // this is the behavior of the follower
+  public synchronized void acceptVerifiedPartitionTable(
+      ByteBuffer partitionTableBuffer, boolean needSerialization) {
+    logger.info("new Partition Table is received.");
+    acceptPartitionTable(partitionTableBuffer, needSerialization);
+    rebuildDataGroups();
+    logger.info("The Meta Engine is ready");
+    ready = true;
   }
 
   private void updateNodeList(Collection<Node> nodes) {
@@ -632,11 +663,13 @@ public class MetaGroupMember extends RaftMember implements IService {
   }
 
   /**
-   * Process a HeartBeatResponse from a follower. If the follower has provided its identifier, try
-   * registering for it and if all nodes have registered and there is no available partition table,
-   * initialize a new one and start the ClusterTSServiceImpl and DataClusterServer. If the follower
-   * requires a partition table, add it to the blind node list so that at the next heartbeat this
-   * node will send it a partition table
+   * This is the behavior of the Leader:
+   *
+   * <p>Process a HeartBeatResponse from a follower. If the follower has provided its identifier,
+   * try registering for it and if all nodes have registered and there is no available partition
+   * table, initialize a new one and start the ClusterTSServiceImpl and DataClusterServer. If the
+   * follower requires a partition table, add it to the blind node list so that at the next
+   * heartbeat this node will send it a partition table
    */
   @Override
   public void processValidHeartbeatResp(HeartBeatResponse response, Node receiver) {
@@ -647,6 +680,8 @@ public class MetaGroupMember extends RaftMember implements IService {
       registerNodeIdentifier(response.getFollower(), response.getFollowerIdentifier());
       // if all nodes' ids are known, we can build the partition table
       if (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
@@ -658,7 +693,9 @@ public class MetaGroupMember extends RaftMember implements IService {
         }
         router = new ClusterPlanRouter(partitionTable);
         this.coordinator.setRouter(router);
-        startSubServers();
+        rebuildDataGroups();
+        logger.info("The Meta Engine is ready");
+        this.ready = true;
       }
     }
     // record the requirement of partition table of the follower
@@ -672,7 +709,7 @@ public class MetaGroupMember extends RaftMember implements IService {
    * the next heartbeat the partition table will be sent to the node.
    */
   private void addBlindNode(Node node) {
-    logger.debug("Node {} requires the node list", node);
+    logger.debug("Node {} requires the node list (partition table)", node);
     blindNodes.add(node);
   }
 
@@ -722,7 +759,7 @@ public class MetaGroupMember extends RaftMember implements IService {
    * Start the DataClusterServer and ClusterTSServiceImpl` so this node can serve other nodes and
    * clients. Also build DataGroupMembers using the partition table.
    */
-  protected synchronized void startSubServers() {
+  protected synchronized void rebuildDataGroups() {
     logger.info("Starting sub-servers...");
     synchronized (partitionTable) {
       try {
@@ -739,7 +776,7 @@ public class MetaGroupMember extends RaftMember implements IService {
   }
 
   /** When the node restarts, it sends handshakes to all other nodes so they may know it is back. */
-  private void sendHandshake() {
+  public void sendHandshake() {
     for (Node node : allNodes) {
       if (ClusterUtils.nodeEqual(node, thisNode)) {
         // no need to shake hands with yourself
@@ -1058,7 +1095,7 @@ public class MetaGroupMember extends RaftMember implements IService {
       inconsistentNum.set(0);
       checkSeedNodesStatusOnce(consistentNum, inconsistentNum);
       logger.debug(
-          "Status check result: {}-{}/{}",
+          "Status check result: consistent nodes: {}, inconsistent nodes: {}, total nodes: {}",
           consistentNum.get(),
           inconsistentNum.get(),
           getAllNodes().size());
@@ -1078,6 +1115,7 @@ public class MetaGroupMember extends RaftMember implements IService {
         }
       }
     }
+    // after checking, we enable print the error stack in 'SyncClientPool.getClient'
   }
 
   // TODO rewrite this method.
@@ -1194,6 +1232,7 @@ public class MetaGroupMember extends RaftMember implements IService {
       }
 
       ByteBuffer wrap = ByteBuffer.wrap(tableBuffer);
+      logger.info("Load Partition Table locally.");
       acceptPartitionTable(wrap, false);
 
       logger.info("Load {} nodes: {}", allNodes.size(), allNodes);
diff --git 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
index d0fe5d1..065b663 100644
--- 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
@@ -40,7 +40,6 @@ import org.apache.iotdb.cluster.server.Response;
 import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.cluster.utils.ClientUtils;
 import org.apache.iotdb.cluster.utils.ClusterUtils;
-
 import org.apache.thrift.TException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,18 +59,33 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
 
   @Override
   public long 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 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 super.appendEntry(request);
   }
 
+  private static final String ERROR_MSG_META_NOT_READY = "The metadata not is not ready.";
+
   @Override
   public AddNodeResponse addNode(Node node, StartUpStatus startUpStatus) throws TException {
     AddNodeResponse addNodeResponse;
+    if (!metaGroupMember.isReady()) {
+      logger.debug(ERROR_MSG_META_NOT_READY);
+      throw new TException(ERROR_MSG_META_NOT_READY);
+    }
+
     try {
       addNodeResponse = metaGroupMember.addNode(node, startUpStatus);
     } catch (AddSelfException | LogExecutionException | CheckConsistencyException e) {
@@ -98,6 +112,7 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
 
   @Override
   public void sendSnapshot(SendSnapshotRequest request) throws TException {
+    // even the meta engine is not ready, we still need to catch up.
     try {
       metaGroupMember.receiveSnapshot(request);
     } catch (Exception e) {
@@ -107,6 +122,7 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
 
   @Override
   public CheckStatusResponse checkStatus(StartUpStatus startUpStatus) {
+    // this method is called before the meta engine is ready.
     return ClusterUtils.checkStatus(startUpStatus, metaGroupMember.getStartUpStatus());
   }
 
@@ -149,11 +165,17 @@ public class MetaSyncService extends BaseSyncService implements TSMetaService.If
 
   @Override
   public ByteBuffer collectMigrationStatus() {
+    // TODO not sure whether it can happen before the meta engine is ready
     return ClusterUtils.serializeMigrationStatus(metaGroupMember.collectMigrationStatus());
   }
 
   @Override
   public long removeNode(Node node) throws TException {
+    if (!metaGroupMember.isReady()) {
+      logger.debug(ERROR_MSG_META_NOT_READY);
+      throw new TException(ERROR_MSG_META_NOT_READY);
+    }
+
     long result;
     try {
       result = metaGroupMember.removeNode(node);
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
index 55b24da..122b7c5 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/applier/DataLogApplierTest.java
@@ -19,7 +19,6 @@
 
 package org.apache.iotdb.cluster.log.applier;
 
-import junit.framework.TestCase;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
@@ -74,6 +73,8 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSEncoding;
 import org.apache.iotdb.tsfile.read.common.RowRecord;
 import org.apache.iotdb.tsfile.read.query.dataset.QueryDataSet;
 import org.apache.iotdb.tsfile.write.schema.TimeseriesSchema;
+
+import junit.framework.TestCase;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
 import org.junit.After;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
index 789f968..470bbc3 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/log/snapshot/MetaSimpleSnapshotTest.java
@@ -62,7 +62,7 @@ public class MetaSimpleSnapshotTest extends IoTDBTest {
     metaGroupMember =
         new TestMetaGroupMember() {
           @Override
-          protected void startSubServers() {
+          protected void rebuildDataGroups() {
             subServerInitialized = true;
           }
         };
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
index 09a3354..451e78b 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/DatasourceInfoTest.java
@@ -32,6 +32,7 @@ import org.apache.iotdb.cluster.server.member.MetaGroupMember;
 import org.apache.iotdb.db.exception.StorageEngineException;
 import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
index 1af7d57..de4d588 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSeriesReaderByTimestampTest.java
@@ -35,6 +35,7 @@ import org.apache.iotdb.db.query.control.QueryResourceManager;
 import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.common.BatchData;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
index bf07b21..d3e6eca 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/RemoteSimpleSeriesReaderTest.java
@@ -37,6 +37,7 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
+
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
index 6c08e3d..31a846f 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/AssignPathManagedMergeReaderTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.iotdb.cluster.query.reader.mult;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
@@ -40,6 +38,9 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
index a28a810..784e203 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/query/reader/mult/RemoteMultSeriesReaderTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.iotdb.cluster.query.reader.mult;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import org.apache.iotdb.cluster.ClusterIoTDB;
 import org.apache.iotdb.cluster.client.DataClientProvider;
 import org.apache.iotdb.cluster.client.async.AsyncDataClient;
@@ -41,6 +39,9 @@ import org.apache.iotdb.db.utils.SerializeUtils;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.TimeValuePair;
 import org.apache.iotdb.tsfile.read.common.BatchData;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 import org.apache.thrift.TException;
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
diff --git 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
index 60fbe31..44c58fb 100644
--- 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
@@ -57,6 +57,7 @@ import org.apache.iotdb.db.service.IoTDB;
 import org.apache.iotdb.db.service.RegisterManager;
 import org.apache.iotdb.db.utils.EnvironmentUtils;
 import org.apache.iotdb.db.utils.SchemaUtils;
+
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol.Factory;
 import org.junit.After;
diff --git a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
index c31d891..90884f2 100644
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/MetaGroupMemberTest.java
@@ -108,6 +108,7 @@ import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.ValueFilter;
 import org.apache.iotdb.tsfile.write.schema.IMeasurementSchema;
 import org.apache.iotdb.tsfile.write.schema.TimeseriesSchema;
+
 import org.apache.thrift.async.AsyncMethodCallback;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TCompactProtocol.Factory;
diff --git a/cluster/src/test/resources/node1conf/iotdb-engine.properties b/cluster/src/test/resources/node1conf/iotdb-engine.properties
index a386335..afd8911 100644
--- a/cluster/src/test/resources/node1conf/iotdb-engine.properties
+++ b/cluster/src/test/resources/node1conf/iotdb-engine.properties
@@ -16,12 +16,12 @@
 #under the License.
 
 
-base_dir=node1/tmp
-data_dirs=node1/data
-wal_dir=node1/wal
-index_root_dir=node1/index
-udf_root_dir=node1/ext
-tracing_dir=node1/data/tracing
+base_dir=target/node1/tmp
+data_dirs=target/node1/data
+wal_dir=target/node1/wal
+index_root_dir=target/node1/index
+udf_root_dir=target/node1/ext
+tracing_dir=target/node1/data/tracing
 
 rpc_port=6667
 metrics_port=8181
diff --git a/cluster/src/test/resources/node2conf/iotdb-engine.properties b/cluster/src/test/resources/node2conf/iotdb-engine.properties
index c9276c0..ec3b39b 100644
--- a/cluster/src/test/resources/node2conf/iotdb-engine.properties
+++ b/cluster/src/test/resources/node2conf/iotdb-engine.properties
@@ -16,12 +16,12 @@
 #under the License.
 
 
-base_dir=node2/tmp
-data_dirs=node2/data
-wal_dir=node2/wal
-index_root_dir=node2/index
-udf_root_dir=node2/ext
-tracing_dir=node2/data/tracing
+base_dir=target/node2/tmp
+data_dirs=target/node2/data
+wal_dir=target/node2/wal
+index_root_dir=target/node2/index
+udf_root_dir=target/node2/ext
+tracing_dir=target/node2/data/tracing
 
 rpc_port=6669
 metrics_port=8182
diff --git a/cluster/src/test/resources/node3conf/iotdb-engine.properties b/cluster/src/test/resources/node3conf/iotdb-engine.properties
index 04b1512..6eeb6af 100644
--- a/cluster/src/test/resources/node3conf/iotdb-engine.properties
+++ b/cluster/src/test/resources/node3conf/iotdb-engine.properties
@@ -16,12 +16,12 @@
 #under the License.
 
 
-base_dir=node3/tmp
-data_dirs=node3/data
-wal_dir=node3/wal
-index_root_dir=node3/index
-udf_root_dir=node3/ext
-tracing_dir=node3/data/tracing
+base_dir=target/node3/tmp
+data_dirs=target/node3/data
+wal_dir=target/node3/wal
+index_root_dir=target/node3/index
+udf_root_dir=target/node3/ext
+tracing_dir=target/node3/data/tracing
 
 rpc_port=6671
 metrics_port=8183