You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2021/12/01 02:57:45 UTC
[iotdb] 01/01: Merge branch 'master' into expr
This is an automated email from the ASF dual-hosted git repository.
jiangtian pushed a commit to branch expr
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 6dd6dbccb2404997edea52826f000e5fb46e57d0
Merge: ba4355a f43085e
Author: jt <jt...@163.com>
AuthorDate: Wed Dec 1 10:56:46 2021 +0800
Merge branch 'master' into expr
# Conflicts:
# cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
# cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/DataClusterServer.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/MetaClusterServer.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/RaftServer.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatServer.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
# cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
.github/workflows/cluster.yml | 50 +
.github/workflows/main-unix.yml | 2 +-
.github/workflows/main-win.yml | 2 +-
.gitignore | 1 -
LICENSE-binary | 6 +-
.../org/apache/iotdb/db/qp/sql/IoTDBSqlLexer.g4 | 27 +-
.../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 76 +-
cli/pom.xml | 16 +-
cli/src/assembly/resources/sbin/start-cli.bat | 2 +-
.../java/org/apache/iotdb/cli/AbstractCli.java | 2 +-
cli/src/main/java/org/apache/iotdb/cli/Cli.java | 40 +-
.../apache/iotdb/cli/IoTDBSyntaxHighlighter.java | 76 +
cli/src/main/java/org/apache/iotdb/cli/WinCli.java | 175 --
.../org/apache/iotdb/cli/utils/JlineUtils.java | 99 +
.../org/apache/iotdb/tool/AbstractCsvTool.java | 3 +-
.../main/java/org/apache/iotdb/tool/ExportCsv.java | 97 +-
.../main/java/org/apache/iotdb/tool/ImportCsv.java | 24 +-
client-cpp/pom.xml | 2 +-
client-cpp/src/main/Session.h | 4 +
client-py/SessionExample.py | 11 +-
client-py/iotdb/Session.py | 1 +
client-py/iotdb/utils/BitMap.py | 3 +-
client-py/iotdb/utils/IoTDBConstants.py | 1 +
client-py/iotdb/utils/IoTDBRpcDataSet.py | 140 +-
client-py/iotdb/utils/SessionDataSet.py | 34 +-
client-py/iotdb/utils/Tablet.py | 10 +-
client-py/tests/tablet_performance_comparison.py | 129 +-
client-py/tests/test_dataframe.py | 29 +-
client-py/tests/test_todf.py | 216 ++
cluster/pom.xml | 4 +
.../resources/conf/iotdb-cluster.properties | 5 -
cluster/src/assembly/resources/sbin/add-node.bat | 2 +-
cluster/src/assembly/resources/sbin/add-node.sh | 2 +-
.../src/assembly/resources/sbin/remove-node.bat | 4 +-
cluster/src/assembly/resources/sbin/remove-node.sh | 2 +-
cluster/src/assembly/resources/sbin/start-node.bat | 4 +-
cluster/src/assembly/resources/sbin/start-node.sh | 2 +-
cluster/src/assembly/resources/sbin/stop-node.bat | 2 +-
cluster/src/assembly/resources/sbin/stop-node.sh | 2 +-
.../java/org/apache/iotdb/cluster/ClientMain.java | 3 +-
.../org/apache/iotdb/cluster/ClusterIoTDB.java | 693 +++++
.../apache/iotdb/cluster/ClusterIoTDBMBean.java | 36 +
.../java/org/apache/iotdb/cluster/ClusterMain.java | 331 ---
.../apache/iotdb/cluster/client/BaseFactory.java | 54 +
.../iotdb/cluster/client/ClientCategory.java | 38 +
.../apache/iotdb/cluster/client/ClientManager.java | 223 ++
.../iotdb/cluster/client/ClientPoolFactory.java | 98 +
.../iotdb/cluster/client/DataClientProvider.java | 95 -
.../iotdb/cluster/client/IClientManager.java | 35 +
.../cluster/client/async/AsyncBaseFactory.java | 68 +
.../cluster/client/async/AsyncClientFactory.java | 65 -
.../cluster/client/async/AsyncClientPool.java | 216 --
.../cluster/client/async/AsyncDataClient.java | 199 +-
.../client/async/AsyncDataHeartbeatClient.java | 81 -
.../cluster/client/async/AsyncMetaClient.java | 147 +-
.../client/async/AsyncMetaHeartbeatClient.java | 81 -
.../cluster/client/sync/SyncClientAdaptor.java | 60 +-
.../cluster/client/sync/SyncClientFactory.java | 40 -
.../iotdb/cluster/client/sync/SyncClientPool.java | 169 --
.../iotdb/cluster/client/sync/SyncDataClient.java | 114 +-
.../client/sync/SyncDataHeartbeatClient.java | 79 -
.../iotdb/cluster/client/sync/SyncMetaClient.java | 121 +-
.../client/sync/SyncMetaHeartbeatClient.java | 78 -
.../apache/iotdb/cluster/config/ClusterConfig.java | 9 -
.../iotdb/cluster/config/ClusterConstant.java | 86 +
.../iotdb/cluster/config/ClusterDescriptor.java | 12 +-
.../iotdb/cluster/coordinator/Coordinator.java | 179 +-
.../cluster/expr/ExprAppendNodeEntryHandler.java | 24 -
.../org/apache/iotdb/cluster/expr/ExprBench.java | 123 -
.../org/apache/iotdb/cluster/expr/ExprMember.java | 305 ---
.../org/apache/iotdb/cluster/expr/ExprServer.java | 106 -
.../apache/iotdb/cluster/expr/ExprVotingLog.java | 59 -
.../apache/iotdb/cluster/expr/SWRaftMember.java | 206 ++
.../apache/iotdb/cluster/expr/SequencerExpr.java | 126 -
.../apache/iotdb/cluster/expr/VotingLogList.java | 111 -
.../apache/iotdb/cluster/log/LogDispatcher.java | 13 +-
.../apache/iotdb/cluster/log/VotingLogList.java | 104 +
.../cluster/log/applier/AsyncDataLogApplier.java | 4 +-
.../iotdb/cluster/log/applier/BaseApplier.java | 12 +-
.../iotdb/cluster/log/applier/DataLogApplier.java | 17 +-
.../iotdb/cluster/log/catchup/LogCatchUpTask.java | 5 +-
.../manage/FilePartitionedSnapshotLogManager.java | 4 +-
.../log/manage/MetaSingleSnapshotLogManager.java | 12 +-
.../log/manage/PartitionedSnapshotLogManager.java | 7 +-
.../iotdb/cluster/log/manage/RaftLogManager.java | 23 +-
.../iotdb/cluster/log/snapshot/FileSnapshot.java | 14 +-
.../cluster/log/snapshot/MetaSimpleSnapshot.java | 42 +-
.../cluster/log/snapshot/PullSnapshotTask.java | 5 +-
.../log/snapshot/PullSnapshotTaskDescriptor.java | 2 +-
.../apache/iotdb/cluster/metadata/CMManager.java | 430 ++--
.../apache/iotdb/cluster/metadata/MetaPuller.java | 79 +-
.../cluster/partition/NodeAdditionResult.java | 4 +-
.../iotdb/cluster/partition/NodeRemovalResult.java | 4 +-
.../iotdb/cluster/partition/PartitionGroup.java | 36 +-
.../iotdb/cluster/partition/PartitionTable.java | 8 +-
.../partition/balancer/DefaultSlotBalancer.java | 6 +-
.../cluster/partition/balancer/SlotBalancer.java | 4 +-
.../iotdb/cluster/partition/slot/SlotManager.java | 2 +-
.../partition/slot/SlotNodeAdditionResult.java | 2 +-
.../cluster/partition/slot/SlotPartitionTable.java | 48 +-
.../iotdb/cluster/partition/slot/SlotStrategy.java | 2 +-
.../partition/slot/SlotTimePartitionFilter.java | 3 +-
.../cluster/query/ClusterDataQueryExecutor.java | 6 +-
.../cluster/query/ClusterPhysicalGenerator.java | 16 +-
.../iotdb/cluster/query/ClusterPlanExecutor.java | 388 ++-
.../iotdb/cluster/query/ClusterPlanRouter.java | 16 +-
.../iotdb/cluster/query/ClusterQueryRouter.java | 25 +-
.../iotdb/cluster/query/LocalQueryExecutor.java | 88 +-
.../query/aggregate/ClusterAggregateExecutor.java | 2 +-
.../cluster/query/aggregate/ClusterAggregator.java | 38 +-
.../cluster/query/fill/ClusterFillExecutor.java | 7 +-
.../cluster/query/fill/ClusterLinearFill.java | 12 +-
.../cluster/query/fill/ClusterPreviousFill.java | 91 +-
.../cluster/query/fill/PreviousFillArguments.java | 2 +-
.../ClusterGroupByFillNoVFilterDataSet.java | 56 +
.../groupby/ClusterGroupByFillVFilterDataSet.java | 67 +
.../groupby/ClusterGroupByNoVFilterDataSet.java | 8 +-
.../groupby/ClusterGroupByVFilterDataSet.java | 6 +-
.../query/groupby/MergeGroupByExecutor.java | 2 +-
.../query/groupby/RemoteGroupByExecutor.java | 85 +-
.../query/last/ClusterLastQueryExecutor.java | 73 +-
.../query/manage/ClusterSessionManager.java | 137 +
.../cluster/query/reader/ClusterReaderFactory.java | 87 +-
.../cluster/query/reader/ClusterTimeGenerator.java | 2 +-
.../iotdb/cluster/query/reader/DataSourceInfo.java | 83 +-
.../reader/RemoteSeriesReaderByTimestamp.java | 15 +-
.../query/reader/RemoteSimpleSeriesReader.java | 15 +-
.../mult/AssignPathAscPriorityMergeReader.java | 49 +
.../mult/AssignPathDescPriorityMergeReader.java | 49 +
.../reader/mult/AssignPathManagedMergeReader.java | 43 +-
.../reader/mult/AssignPathPriorityMergeReader.java | 66 -
.../mult/IAssignPathPriorityMergeReader.java | 47 +
.../query/reader/mult/MultDataSourceInfo.java | 63 +-
.../cluster/query/reader/mult/MultElement.java | 49 +
.../query/reader/mult/RemoteMultSeriesReader.java | 41 +-
.../apache/iotdb/cluster/server/ClientServer.java | 311 ---
.../iotdb/cluster/server/ClusterRPCService.java | 109 +
.../cluster/server/ClusterRPCServiceMBean.java | 35 +
.../iotdb/cluster/server/ClusterTSServiceImpl.java | 99 +
.../iotdb/cluster/server/DataClusterServer.java | 1139 ---------
.../iotdb/cluster/server/MetaClusterServer.java | 423 ----
.../cluster/server/PullSnapshotHintService.java | 20 +-
.../apache/iotdb/cluster/server/RaftServer.java | 285 ---
.../org/apache/iotdb/cluster/server/Response.java | 3 +
.../iotdb/cluster/server/StoppedMemberManager.java | 11 +-
.../server/clusterinfo/ClusterInfoServer.java | 1 +
.../handlers/caller/AppendNodeEntryHandler.java | 7 +-
.../server/handlers/caller/HeartbeatHandler.java | 6 +-
.../handlers/caller/PreviousFillHandler.java | 26 +-
.../handlers/caller/ShowTimeSeriesHandler.java | 133 +
.../server/heartbeat/DataHeartbeatServer.java | 83 -
.../cluster/server/heartbeat/HeartbeatServer.java | 212 --
.../cluster/server/heartbeat/HeartbeatThread.java | 29 +-
.../server/heartbeat/MetaHeartbeatServer.java | 92 -
.../server/heartbeat/MetaHeartbeatThread.java | 7 +-
.../cluster/server/member/DataGroupMember.java | 97 +-
.../server/member/DataGroupMemberMBean.java | 25 +
.../cluster/server/member/MetaGroupMember.java | 501 ++--
.../server/member/MetaGroupMemberMBean.java | 35 +
.../iotdb/cluster/server/member/RaftMember.java | 306 ++-
.../cluster/server/member/RaftMemberMBean.java | 53 +
.../server/raft/AbstractDataRaftService.java | 54 +
.../server/raft/AbstractMetaRaftService.java | 52 +
.../cluster/server/raft/AbstractRaftService.java | 76 +
.../server/raft/DataRaftHeartBeatService.java | 68 +
.../server/raft/DataRaftHeartBeatServiceMBean.java | 22 +
.../iotdb/cluster/server/raft/DataRaftService.java | 65 +
.../cluster/server/raft/DataRaftServiceMBean.java | 22 +
.../server/raft/MetaRaftHeartBeatService.java | 68 +
.../server/raft/MetaRaftHeartBeatServiceMBean.java | 22 +
.../iotdb/cluster/server/raft/MetaRaftService.java | 65 +
.../cluster/server/raft/MetaRaftServiceMBean.java | 22 +
.../cluster/server/raft/RaftServiceHandler.java | 43 +
.../cluster/server/service/DataGroupEngine.java | 510 ++++
.../server/service/DataGroupEngineMBean.java | 31 +
.../server/service/DataGroupServiceImpls.java | 776 ++++++
.../cluster/server/service/MetaAsyncService.java | 42 +-
.../cluster/server/service/MetaSyncService.java | 50 +-
.../apache/iotdb/cluster/utils/ClientUtils.java | 64 +-
.../iotdb/cluster/utils/ClusterQueryUtils.java | 57 +-
.../apache/iotdb/cluster/utils/ClusterUtils.java | 53 +-
.../apache/iotdb/cluster/utils/PartitionUtils.java | 12 +-
.../cluster/utils/nodetool/ClusterMonitor.java | 32 +-
.../cluster/utils/nodetool/function/Slot.java | 2 +-
.../iotdb/cluster/client/BaseClientTest.java | 156 ++
.../iotdb/cluster/client/ClientManagerTest.java | 212 ++
.../cluster/client/ClientPoolFactoryTest.java | 262 ++
.../cluster/client/DataClientProviderTest.java | 242 --
.../iotdb/cluster/client/MockClientManager.java | 47 +
.../cluster/client/async/AsyncClientPoolTest.java | 209 --
.../cluster/client/async/AsyncDataClientTest.java | 109 +-
.../client/async/AsyncDataHeartbeatClientTest.java | 60 -
.../cluster/client/async/AsyncMetaClientTest.java | 108 +-
.../client/async/AsyncMetaHeartbeatClientTest.java | 61 -
.../cluster/client/sync/SyncClientAdaptorTest.java | 18 +-
.../cluster/client/sync/SyncClientPoolTest.java | 167 --
.../cluster/client/sync/SyncDataClientTest.java | 172 +-
.../client/sync/SyncDataHeartbeatClientTest.java | 66 -
.../cluster/client/sync/SyncMetaClientTest.java | 170 +-
.../client/sync/SyncMetaHeartbeatClientTest.java | 66 -
.../org/apache/iotdb/cluster/common/IoTDBTest.java | 18 +-
.../cluster/common/TestAsyncClientFactory.java | 55 -
.../iotdb/cluster/common/TestAsyncDataClient.java | 3 +-
.../iotdb/cluster/common/TestAsyncMetaClient.java | 9 +-
.../iotdb/cluster/common/TestLogApplier.java | 2 +-
.../apache/iotdb/cluster/common/TestSnapshot.java | 6 +-
.../cluster/common/TestSyncClientFactory.java | 88 -
.../org/apache/iotdb/cluster/common/TestUtils.java | 21 +-
.../cluster/integration/BaseSingleNodeTest.java | 16 +-
.../iotdb/cluster/integration/SingleNodeTest.java | 7 +-
.../apache/iotdb/cluster/log/LogParserTest.java | 8 +-
.../log/applier/AsyncDataLogApplierTest.java | 2 +-
.../cluster/log/applier/DataLogApplierTest.java | 182 +-
.../cluster/log/applier/MetaLogApplierTest.java | 6 +-
.../iotdb/cluster/log/catchup/CatchUpTaskTest.java | 5 -
.../cluster/log/catchup/LogCatchUpTaskTest.java | 7 +-
.../log/catchup/SnapshotCatchUpTaskTest.java | 9 +-
.../cluster/log/logtypes/SerializeLogTest.java | 8 +-
.../FilePartitionedSnapshotLogManagerTest.java | 2 +-
.../manage/MetaSingleSnapshotLogManagerTest.java | 2 +-
.../cluster/log/snapshot/DataSnapshotTest.java | 12 +-
.../cluster/log/snapshot/FileSnapshotTest.java | 2 +-
.../log/snapshot/MetaSimpleSnapshotTest.java | 46 +-
.../log/snapshot/PartitionedSnapshotTest.java | 2 +-
.../cluster/log/snapshot/PullSnapshotTaskTest.java | 7 +-
.../iotdb/cluster/partition/MManagerWhiteBox.java | 2 +-
.../cluster/partition/SlotPartitionTableTest.java | 6 +-
.../apache/iotdb/cluster/query/BaseQueryTest.java | 9 +-
.../query/ClusterAggregateExecutorTest.java | 49 +-
.../query/ClusterDataQueryExecutorTest.java | 7 +-
.../query/ClusterPhysicalGeneratorTest.java | 3 +-
.../cluster/query/ClusterPlanExecutorTest.java | 8 +-
.../iotdb/cluster/query/ClusterPlannerTest.java | 1 -
.../cluster/query/ClusterQueryRouterTest.java | 54 +-
.../query/fill/ClusterFillExecutorTest.java | 17 +-
.../ClusterGroupByNoVFilterDataSetTest.java | 11 +-
.../groupby/ClusterGroupByVFilterDataSetTest.java | 17 +-
.../query/groupby/MergeGroupByExecutorTest.java | 7 +-
.../query/groupby/RemoteGroupByExecutorTest.java | 7 +-
.../cluster/query/manage/QueryCoordinatorTest.java | 8 +-
.../query/reader/ClusterReaderFactoryTest.java | 11 +-
.../query/reader/ClusterTimeGeneratorTest.java | 9 +-
.../cluster/query/reader/DatasourceInfoTest.java | 55 +-
.../reader/RemoteSeriesReaderByTimestampTest.java | 132 +-
.../query/reader/RemoteSimpleSeriesReaderTest.java | 104 +-
.../mult/AssignPathManagedMergeReaderTest.java | 120 +-
.../reader/mult/RemoteMultSeriesReaderTest.java | 222 +-
.../server/clusterinfo/ClusterInfoServerTest.java | 5 +-
.../clusterinfo/ClusterInfoServiceImplTest.java | 28 +-
.../caller/AppendGroupEntryHandlerTest.java | 3 +-
.../caller/AppendNodeEntryHandlerTest.java | 3 +-
.../handlers/caller/ElectionHandlerTest.java | 3 +-
.../handlers/caller/HeartbeatHandlerTest.java | 3 +-
.../handlers/caller/LogCatchUpHandlerTest.java | 3 +-
.../handlers/forwarder/ForwardPlanHandlerTest.java | 2 +-
.../server/heartbeat/DataHeartbeatThreadTest.java | 5 -
.../server/heartbeat/HeartbeatThreadTest.java | 23 +-
.../server/heartbeat/MetaHeartbeatThreadTest.java | 7 +-
.../iotdb/cluster/server/member/BaseMember.java | 66 +-
.../cluster/server/member/DataGroupMemberTest.java | 69 +-
.../cluster/server/member/MetaGroupMemberTest.java | 192 +-
.../cluster/server/member/RaftMemberTest.java | 4 +-
.../cluster/utils/CreateTemplatePlanUtil.java | 74 +
.../iotdb/cluster/utils/SerializeUtilTest.java | 2 +-
.../resources/node1conf/iotdb-engine.properties | 12 +-
.../resources/node2conf/iotdb-engine.properties | 12 +-
.../resources/node3conf/iotdb-engine.properties | 12 +-
compile-tools/thrift/pom.xml | 2 +-
distribution/src/assembly/all.xml | 4 +
distribution/src/assembly/server.xml | 4 +
docs/Development/ContributeGuide.md | 2 +-
docs/Download/README.md | 34 +-
docs/SystemDesign/DataQuery/AlignByDeviceQuery.md | 12 +-
docs/UserGuide/API/Programming-Java-Native-API.md | 151 +-
docs/UserGuide/Advanced-Features/Triggers.md | 2 +-
docs/UserGuide/Appendix/SQL-Reference.md | 89 +-
docs/UserGuide/Appendix/Status-Codes.md | 1 +
docs/UserGuide/Cluster/Cluster-Setup-Example.md | 73 +-
.../Data-Concept/Data-Model-and-Terminology.md | 34 +-
.../UserGuide/Data-Concept/Measurement-Template.md | 84 -
docs/UserGuide/Data-Concept/Schema-Template.md | 84 +
.../Integration-Test-refactoring-tutorial.md | 161 ++
.../DDL-Data-Definition-Language.md | 75 +-
.../DML-Data-Manipulation-Language.md | 83 +-
.../IoTDB-SQL-Language/Maintenance-Command.md | 4 +
.../IoTDB-SQL-Language/Syntax-Conventions.md | 15 +-
docs/UserGuide/System-Tools/CSV-Tool.md | 10 +-
docs/zh/Download/README.md | 34 +-
.../SystemDesign/DataQuery/AlignByDeviceQuery.md | 12 +-
.../UserGuide/API/Programming-Java-Native-API.md | 139 +-
docs/zh/UserGuide/Advanced-Features/Triggers.md | 2 +-
docs/zh/UserGuide/Appendix/SQL-Reference.md | 87 +-
docs/zh/UserGuide/Appendix/Status-Codes.md | 2 +
docs/zh/UserGuide/Cluster/Cluster-Setup-Example.md | 72 +-
.../Communication-Service-Protocol/RestService.md | 268 ++
docs/zh/UserGuide/Comparison/TSDB-Comparison.md | 2 +-
.../Data-Concept/Data-Model-and-Terminology.md | 33 +-
.../UserGuide/Data-Concept/Measurement-Template.md | 81 -
docs/zh/UserGuide/Data-Concept/Schema-Template.md | 81 +
.../Integration-Test-refactoring-tutorial.md | 163 ++
.../DDL-Data-Definition-Language.md | 72 +-
.../DML-Data-Manipulation-Language.md | 84 +-
.../IoTDB-SQL-Language/Maintenance-Command.md | 3 +
.../IoTDB-SQL-Language/Syntax-Conventions.md | 15 +-
docs/zh/UserGuide/System-Tools/CSV-Tool.md | 69 +-
example/client-cpp-example/pom.xml | 2 +-
.../java/org/apache/iotdb/flink/TsFileUtils.java | 4 +-
.../iotdb/hadoop/tsfile/TSMRWriteExample.java | 6 +-
.../apache/iotdb/hadoop/tsfile/TsFileHelper.java | 8 +-
.../iotdb/hadoop/tsfile/TsFileWriteToHDFS.java | 6 +-
.../iotdb/AlignedTimeseriesSessionExample.java | 222 +-
.../iotdb/HybridTimeseriesSessionExample.java | 11 +-
.../org/apache/iotdb/SessionConcurrentExample.java | 46 +-
.../main/java/org/apache/iotdb/SessionExample.java | 269 +-
.../org/apache/iotdb/trigger/TriggerExample.java | 2 +-
.../iotdb/tsfile/TsFileForceAppendWrite.java | 12 +-
.../java/org/apache/iotdb/tsfile/TsFileRead.java | 8 +-
.../apache/iotdb/tsfile/TsFileSequenceRead.java | 87 +-
.../tsfile/TsFileWriteAlignedWithTSRecord.java | 89 +
.../iotdb/tsfile/TsFileWriteAlignedWithTablet.java | 141 ++
.../iotdb/tsfile/TsFileWriteVectorWithTablet.java | 118 -
.../iotdb/tsfile/TsFileWriteWithTSRecord.java | 66 +-
.../apache/iotdb/tsfile/TsFileWriteWithTablet.java | 106 +-
flink-iotdb-connector/pom.xml | 5 +
.../iotdb/flink/tsfile/TsFileInputFormat.java | 6 +-
.../tsfile/RowTsFileOutputFormatTestBase.java | 4 +-
grafana/pom.xml | 4 +-
.../controller/DatabaseConnectController.java | 63 +-
.../iotdb/web/grafana/dao/impl/BasicDaoImpl.java | 18 +-
.../grafana/service/DatabaseConnectService.java | 2 -
.../service/impl/DatabaseConnectServiceImpl.java | 5 -
.../apache/iotdb/hadoop/fileSystem/HDFSInput.java | 5 +
.../iotdb/hadoop/tsfile/TSFRecordReader.java | 4 +-
.../apache/iotdb/hadoop/tsfile/TSFHadoopTest.java | 49 +-
.../iotdb/hadoop/tsfile/TsFileTestHelper.java | 2 +-
hive-connector/pom.xml | 16 -
.../org/apache/iotdb/hive/TSFHiveRecordWriter.java | 3 +-
.../apache/iotdb/hive/TSFHiveInputFormatTest.java | 27 +-
.../apache/iotdb/hive/TSFHiveRecordReaderTest.java | 28 +-
.../org/apache/iotdb/hive/TsFileTestHelper.java | 2 +-
integration/README.md | 120 +
integration/pic/Add_New_Configuration.png | Bin 0 -> 129654 bytes
integration/pic/Cluster_Category.png | Bin 0 -> 175311 bytes
integration/pic/Fork_mode.png | Bin 0 -> 188976 bytes
integration/pic/Run(Menu).png | Bin 0 -> 99077 bytes
integration/pic/Standalone_Category.png | Bin 0 -> 183256 bytes
integration/pom.xml | 283 +++
integration/src/assembly/cluster.xml | 47 +
.../iotdb/integration/env/ClusterEnvBase.java | 245 ++
.../iotdb/integration/env/ClusterEnvConfig.java | 117 +
.../apache/iotdb/integration/env/ClusterNode.java | 166 ++
.../iotdb/integration/env/ConfigFactory.java | 52 +
.../apache/iotdb/integration/env/EnvFactory.java | 57 +
.../iotdb/integration/env/FiveNodeCluster1Env.java | 64 +
.../iotdb/integration/env/RemoteEnvConfig.java | 23 +
.../iotdb/integration/env/RemoteServerEnv.java | 81 +
.../apache/iotdb/itbase/category/ClusterTest.java | 21 +
.../iotdb/itbase/category/LocalStandaloneTest.java | 21 +
.../apache/iotdb/itbase/category/RemoteTest.java | 21 +
.../org/apache/iotdb/itbase/env/BaseConfig.java | 88 +
.../java/org/apache/iotdb/itbase/env/BaseEnv.java | 35 +
.../db/engine/trigger/example/Accumulator.java | 0
.../iotdb/db/engine/trigger/example/Counter.java | 0
.../iotdb/db/integration/IOTDBGroupByIT.java | 996 ++++++++
.../integration/IOTDBGroupByInnerIntervalIT.java | 335 +++
.../db/integration/IOTDBInsertAlignedValuesIT.java | 222 ++
.../apache/iotdb/db/integration/IOTDBInsertIT.java | 126 +
.../apache/iotdb/db/integration/IoTDBAliasIT.java | 364 +++
.../iotdb/db/integration/IoTDBAlignByDeviceIT.java | 960 +++++++
.../iotdb/db/integration/IoTDBArithmeticIT.java | 287 +++
.../org/apache/iotdb/db/integration/IoTDBAsIT.java | 564 +++++
.../db/integration/IoTDBAutoCreateSchemaIT.java | 209 ++
.../iotdb/db/integration/IoTDBCheckConfigIT.java | 145 ++
.../iotdb/db/integration/IoTDBClearCacheIT.java | 171 ++
.../apache/iotdb/db/integration/IoTDBCloseIT.java | 191 ++
.../iotdb/db/integration/IoTDBCompleteIT.java | 488 ++++
.../iotdb/db/integration/IoTDBCompressTypeIT.java | 101 +
.../db/integration/IoTDBContinuousQueryIT.java | 416 +++
.../IoTDBCreateAlignedTimeseriesIT.java | 109 +
.../db/integration/IoTDBCreateSnapshotIT.java | 180 ++
.../db/integration/IoTDBCreateStorageGroupIT.java | 131 +
.../db/integration/IoTDBCreateTimeseriesIT.java | 170 ++
.../apache/iotdb/db/integration/IoTDBDaemonIT.java | 446 ++++
.../db/integration/IoTDBDeleteStorageGroupIT.java | 160 ++
.../db/integration/IoTDBDeleteTimeseriesIT.java | 215 ++
.../iotdb/db/integration/IoTDBDeletionIT.java | 500 ++++
.../iotdb/db/integration/IoTDBDisableAlignIT.java | 392 +++
.../iotdb/db/integration/IoTDBEncodingIT.java | 350 +++
.../db/integration/IoTDBEngineTimeGeneratorIT.java | 292 +++
.../iotdb/db/integration/IoTDBExecuteBatchIT.java | 194 ++
.../iotdb/db/integration/IoTDBFilePathUtilsIT.java | 99 +
.../apache/iotdb/db/integration/IoTDBFillIT.java | 972 +++++++
.../db/integration/IoTDBFloatPrecisionIT.java | 170 ++
.../db/integration/IoTDBFlushQueryMergeIT.java | 203 ++
.../iotdb/db/integration/IoTDBFuzzyQueryIT.java | 295 +++
.../iotdb/db/integration/IoTDBGroupByFillIT.java | 2647 ++++++++++++++++++++
.../db/integration/IoTDBGroupByFillMixPathsIT.java | 489 ++++
.../integration/IoTDBGroupByFillWithRangeIT.java | 179 ++
.../db/integration/IoTDBGroupByMonthFillIT.java | 277 ++
.../iotdb/db/integration/IoTDBGroupByMonthIT.java | 273 ++
.../iotdb/db/integration/IoTDBGroupByUnseqIT.java | 185 ++
.../org/apache/iotdb/db/integration/IoTDBInIT.java | 247 ++
.../db/integration/IoTDBInsertMultiRowIT.java | 128 +
.../iotdb/db/integration/IoTDBInsertNaNIT.java | 197 ++
.../db/integration/IoTDBInsertWithQueryIT.java | 468 ++++
.../db/integration/IoTDBInsertWithoutTimeIT.java | 132 +
.../iotdb/db/integration/IoTDBKillQueryIT.java | 80 +
.../iotdb/db/integration/IoTDBLargeDataIT.java | 373 +++
.../apache/iotdb/db/integration/IoTDBLastIT.java | 599 +++++
.../iotdb/db/integration/IoTDBLimitSlimitIT.java | 204 ++
...IoTDBLoadExternalTsFileWithTimePartitionIT.java | 330 +++
.../db/integration/IoTDBLoadExternalTsfileIT.java | 825 ++++++
.../integration/IoTDBManageTsFileResourceIT.java | 295 +++
.../apache/iotdb/db/integration/IoTDBMergeIT.java | 332 +++
.../iotdb/db/integration/IoTDBMetadataFetchIT.java | 603 +++++
.../iotdb/db/integration/IoTDBMultiDeviceIT.java | 292 +++
.../IoTDBMultiOverlappedChunkInUnseqIT.java | 110 +
.../db/integration/IoTDBMultiOverlappedPageIT.java | 166 ++
.../iotdb/db/integration/IoTDBMultiSeriesIT.java | 471 ++++
.../db/integration/IoTDBMultiStatementsIT.java | 187 ++
.../iotdb/db/integration/IoTDBNestedQueryIT.java | 591 +++++
.../db/integration/IoTDBNewTsFileCompactionIT.java | 1067 ++++++++
.../iotdb/db/integration/IoTDBNumberPathIT.java | 483 ++++
.../db/integration/IoTDBOverlappedPageIT.java | 194 ++
.../db/integration/IoTDBPathNumOverLimitIT.java | 75 +
.../iotdb/db/integration/IoTDBQueryDemoIT.java | 685 +++++
.../db/integration/IoTDBQueryMemoryControlIT.java | 277 ++
.../iotdb/db/integration/IoTDBQueryTimeoutIT.java | 156 ++
.../iotdb/db/integration/IoTDBQuotedPathIT.java | 125 +
.../iotdb/db/integration/IoTDBRecoverIT.java | 438 ++++
.../db/integration/IoTDBRecoverUnclosedIT.java | 291 +++
.../db/integration/IoTDBRemovePartitionIT.java | 333 +++
.../iotdb/db/integration/IoTDBRestartIT.java | 462 ++++
.../iotdb/db/integration/IoTDBResultSetIT.java | 134 +
.../db/integration/IoTDBRpcCompressionIT.java | 140 ++
.../IoTDBSameMeasurementsDifferentTypesIT.java | 182 ++
.../db/integration/IoTDBSchemaTemplateIT.java | 180 ++
.../iotdb/db/integration/IoTDBSelectIntoIT.java | 673 +++++
.../iotdb/db/integration/IoTDBSensorUpdateIT.java | 87 +
.../db/integration/IoTDBSequenceDataQueryIT.java | 329 +++
.../iotdb/db/integration/IoTDBSeriesReaderIT.java | 453 ++++
.../db/integration/IoTDBSessionTimeoutIT.java | 85 +
.../IoTDBSetSystemReadOnlyWritableIT.java | 256 ++
.../apache/iotdb/db/integration/IoTDBSettleIT.java | 97 +
.../iotdb/db/integration/IoTDBSimpleQueryIT.java | 1286 ++++++++++
.../integration/IoTDBSizeTieredCompactionIT.java | 1344 ++++++++++
.../integration/IoTDBSortedShowTimeseriesIT.java | 326 +++
.../iotdb/db/integration/IoTDBTagAlterIT.java | 624 +++++
.../apache/iotdb/db/integration/IoTDBTagIT.java | 1114 ++++++++
.../iotdb/db/integration/IoTDBTimePartitionIT.java | 92 +
.../iotdb/db/integration/IoTDBTimeZoneIT.java | 158 ++
.../iotdb/db/integration/IoTDBTracingIT.java | 84 +
.../db/integration/IoTDBTriggerExecutionIT.java | 618 +++++
.../db/integration/IoTDBTriggerManagementIT.java | 503 ++++
.../apache/iotdb/db/integration/IoTDBTtlIT.java | 221 ++
.../iotdb/db/integration/IoTDBUDFManagementIT.java | 396 +++
.../db/integration/IoTDBUDFWindowQueryIT.java | 632 +++++
.../integration/IoTDBUDTFAlignByTimeQueryIT.java | 823 ++++++
.../db/integration/IoTDBUDTFBuiltinFunctionIT.java | 356 +++
.../db/integration/IoTDBUDTFHybridQueryIT.java | 162 ++
.../db/integration/IoTDBUDTFNonAlignQueryIT.java | 341 +++
.../iotdb/db/integration/IoTDBVersionIT.java | 68 +
.../db/integration/IoTDBWithoutAllNullIT.java | 257 ++
.../db/integration/IoTDBWithoutAnyNullIT.java | 216 ++
.../aggregation/IoTDBAggregationByLevelIT.java | 537 ++++
.../aggregation/IoTDBAggregationDeleteIT.java | 94 +
.../aggregation/IoTDBAggregationIT.java | 1020 ++++++++
.../aggregation/IoTDBAggregationLargeDataIT.java | 1037 ++++++++
.../aggregation/IoTDBAggregationSmallDataIT.java | 808 ++++++
.../db/integration/aligned/AlignedWriteUtil.java | 142 ++
.../IoTDBAggregationWithoutValueFilter2IT.java | 66 +
.../IoTDBAggregationWithoutValueFilterIT.java | 447 ++++
...gregationWithoutValueFilterWithDeletion2IT.java | 83 +
...ggregationWithoutValueFilterWithDeletionIT.java | 447 ++++
.../aligned/IoTDBDeleteTimeseriesIT.java | 218 ++
.../db/integration/aligned/IoTDBDeletionIT.java | 522 ++++
.../db/integration/aligned/IoTDBLastQuery2IT.java | 66 +
.../db/integration/aligned/IoTDBLastQueryIT.java | 377 +++
.../aligned/IoTDBLastQueryWithDeletion2IT.java | 81 +
.../aligned/IoTDBLastQueryWithDeletionIT.java | 380 +++
.../aligned/IoTDBLastQueryWithoutLastCache2IT.java | 69 +
.../aligned/IoTDBLastQueryWithoutLastCacheIT.java | 382 +++
...DBLastQueryWithoutLastCacheWithDeletion2IT.java | 86 +
...TDBLastQueryWithoutLastCacheWithDeletionIT.java | 384 +++
.../aligned/IoTDBRawQueryWithValueFilter2IT.java | 66 +
.../aligned/IoTDBRawQueryWithValueFilterIT.java | 764 ++++++
...oTDBRawQueryWithValueFilterWithDeletion2IT.java | 83 +
...IoTDBRawQueryWithValueFilterWithDeletionIT.java | 779 ++++++
.../IoTDBRawQueryWithoutValueFilter2IT.java | 67 +
.../aligned/IoTDBRawQueryWithoutValueFilterIT.java | 634 +++++
...BRawQueryWithoutValueFilterWithDeletion2IT.java | 84 +
...DBRawQueryWithoutValueFilterWithDeletionIT.java | 612 +++++
.../db/integration/auth/IoTDBAuthorizationIT.java | 1181 +++++++++
.../iotdb/db/integration/env/StandaloneEnv.java | 80 +
.../db/integration/env/StandaloneEnvConfig.java | 109 +
.../iotdb/db/query/udf/example/Accumulator.java | 110 +
.../apache/iotdb/db/query/udf/example/Adder.java | 96 +
.../apache/iotdb/db/query/udf/example/Counter.java | 0
.../org/apache/iotdb/db/query/udf/example/Max.java | 0
.../iotdb/db/query/udf/example/Multiplier.java | 0
.../SlidingSizeWindowConstructorTester0.java | 0
.../SlidingSizeWindowConstructorTester1.java | 0
.../SlidingTimeWindowConstructionTester.java | 0
.../db/query/udf/example/TerminateTester.java | 0
.../iotdb/db/query/udf/example/ValidateTester.java | 0
.../iotdb/session/IoTDBSessionComplexIT.java | 930 +++++++
.../iotdb/session/IoTDBSessionIteratorIT.java | 354 +++
.../apache/iotdb/session/IoTDBSessionSimpleIT.java | 1487 +++++++++++
.../src/test/resources/iotdb-engine.properties | 20 +
integration/src/test/resources/logback.xml | 58 +
jdbc/pom.xml | 5 +
.../iotdb/jdbc/AbstractIoTDBJDBCResultSet.java | 4 +-
.../org/apache/iotdb/jdbc/IoTDBConnection.java | 10 +-
.../apache/iotdb/jdbc/IoTDBDatabaseMetadata.java | 20 +-
.../org/apache/iotdb/jdbc/IoTDBResultMetadata.java | 58 +-
.../java/org/apache/iotdb/jdbc/StringUtils.java | 19 +-
metrics/ReadMe.md | 151 ++
metrics/dropwizard-metrics/pom.xml | 54 +
.../dropwizard/DropwizardMetricManager.java | 410 +++
.../iotdb/metrics/dropwizard/MetricName.java | 134 +
.../dropwizard/reporter/DropwizardJmxReporter.java | 75 +
.../reporter/DropwizardPrometheusReporter.java | 89 +
.../prometheus/DropwizardMetricsExporter.java | 197 ++
.../dropwizard/reporter/prometheus/MetricType.java | 38 +
.../reporter/prometheus/PrometheusReporter.java | 233 ++
.../reporter/prometheus/PrometheusSender.java | 63 +
.../reporter/prometheus/PrometheusTextWriter.java | 79 +
.../reporter/prometheus/PushGateway.java | 150 ++
.../dropwizard/reporter/prometheus/TextFormat.java | 27 +
.../metrics/dropwizard/type/DropwizardCounter.java | 45 +
.../metrics/dropwizard/type/DropwizardGauge.java | 62 +
.../dropwizard/type/DropwizardHistogram.java | 47 +
.../type/DropwizardHistogramSnapshot.java | 73 +
.../metrics/dropwizard/type/DropwizardRate.java | 94 +
.../metrics/dropwizard/type/DropwizardTimer.java | 49 +
.../org.apache.iotdb.metrics.MetricManager | 18 +
.../services/org.apache.iotdb.metrics.Reporter | 19 +
.../dropwizard/DropwizardMetricManagerTest.java | 272 ++
.../metrics/dropwizard/DropwizardMetricTest.java | 181 ++
.../dropwizard/DropwizardMetricTestPlan.java | 62 +
.../metrics/dropwizard/PrometheusRunTest.java | 42 +
.../src/test/resources/iotdb-metric.yml | 42 +
metrics/interface/pom.xml | 73 +
metrics/interface/src/main/assembly/metric.xml | 40 +
.../main/assembly/resources/conf/iotdb-metric.yml | 42 +
.../apache/iotdb/metrics/CompositeReporter.java | 81 +
.../org/apache/iotdb/metrics/MetricManager.java | 172 ++
.../org/apache/iotdb/metrics/MetricService.java | 156 ++
.../java/org/apache/iotdb/metrics/Reporter.java | 36 +
.../apache/iotdb/metrics/config/MetricConfig.java | 106 +
.../metrics/config/MetricConfigDescriptor.java | 88 +
.../iotdb/metrics/config/MetricConstant.java | 29 +
.../iotdb/metrics/impl/DoNothingCounter.java | 39 +
.../apache/iotdb/metrics/impl/DoNothingGauge.java | 34 +
.../iotdb/metrics/impl/DoNothingHistogram.java | 41 +
.../metrics/impl/DoNothingHistogramSnapshot.java | 66 +
.../iotdb/metrics/impl/DoNothingMetricManager.java | 178 ++
.../apache/iotdb/metrics/impl/DoNothingRate.java | 59 +
.../apache/iotdb/metrics/impl/DoNothingTimer.java | 43 +
.../org/apache/iotdb/metrics/type/Counter.java | 31 +
.../java/org/apache/iotdb/metrics/type/Gauge.java | 28 +
.../org/apache/iotdb/metrics/type/Histogram.java | 31 +
.../iotdb/metrics/type/HistogramSnapshot.java | 54 +
.../org/apache/iotdb/metrics/type/IMetric.java | 22 +
.../java/org/apache/iotdb/metrics/type/Rate.java | 43 +
.../java/org/apache/iotdb/metrics/type/Timer.java | 53 +
.../apache/iotdb/metrics/utils/MonitorType.java | 55 +
.../iotdb/metrics/utils/PredefinedMetric.java | 24 +
.../apache/iotdb/metrics/utils/ReporterType.java | 33 +
.../iotdb/metrics/config/MetricConfigTest.java | 57 +
.../src/main/test/resources/iotdb-metric.yml | 43 +
metrics/micrometer-metrics/pom.xml | 57 +
.../iotdb/metrics/micrometer/MeterIdUtils.java | 32 +
.../micrometer/MicrometerMetricManager.java | 492 ++++
.../micrometer/reporter/MicrometerJmxReporter.java | 82 +
.../reporter/MicrometerPrometheusReporter.java | 102 +
.../metrics/micrometer/type/MicrometerCounter.java | 45 +
.../metrics/micrometer/type/MicrometerGauge.java | 47 +
.../micrometer/type/MicrometerHistogram.java | 47 +
.../type/MicrometerHistogramSnapshot.java | 90 +
.../metrics/micrometer/type/MicrometerRate.java | 81 +
.../metrics/micrometer/type/MicrometerTimer.java | 54 +
.../org.apache.iotdb.metrics.MetricManager | 18 +
.../services/org.apache.iotdb.metrics.Reporter | 19 +
.../micrometer/MicrometerMetricManagerTest.java | 52 +
.../metrics/micrometer/MicrometerMetricTest.java | 181 ++
.../micrometer/MicrometerMetricTestPlan.java | 62 +
.../src/test/resources/iotdb-metric.yml | 42 +
metrics/pom.xml | 40 +
openapi/pom.xml | 124 +
openapi/src/main/openapi3/iotdb-rest.yaml | 167 ++
pom.xml | 49 +-
server/pom.xml | 11 +
.../resources/conf/iotdb-engine.properties | 13 +-
server/src/assembly/resources/conf/iotdb-env.bat | 28 +-
server/src/assembly/resources/conf/iotdb-env.sh | 11 +-
.../assembly/resources/conf/iotdb-rest.properties | 55 +
server/src/assembly/server.xml | 4 +
.../org/apache/iotdb/db/auth/AuthorityChecker.java | 7 +-
.../iotdb/db/auth/authorizer/OpenIdAuthorizer.java | 2 +-
.../db/concurrent/IoTDBDaemonThreadFactory.java | 37 +
.../db/concurrent/IoTDBThreadPoolFactory.java | 186 +-
.../org/apache/iotdb/db/concurrent/ThreadName.java | 13 +-
.../db/concurrent/threadpool/IThreadPoolMBean.java | 45 +
.../WrappedScheduledExecutorService.java | 193 ++
.../WrappedScheduledExecutorServiceMBean.java | 22 +
.../WrappedSingleThreadExecutorService.java | 119 +
.../WrappedSingleThreadExecutorServiceMBean.java | 22 +
.../WrappedSingleThreadScheduledExecutor.java | 141 ++
.../WrappedSingleThreadScheduledExecutorMBean.java | 22 +
.../threadpool/WrappedThreadPoolExecutor.java | 82 +
.../threadpool/WrappedThreadPoolExecutorMBean.java | 22 +
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 39 +-
.../org/apache/iotdb/db/conf/IoTDBConfigCheck.java | 37 +-
.../org/apache/iotdb/db/conf/IoTDBConstant.java | 6 +-
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 23 +-
.../iotdb/db/conf/rest/IoTDBRestServiceCheck.java | 65 +
.../iotdb/db/conf/rest/IoTDBRestServiceConfig.java | 143 ++
.../db/conf/rest/IoTDBRestServiceDescriptor.java | 162 ++
.../org/apache/iotdb/db/constant/TestConstant.java | 143 ++
.../apache/iotdb/db/cq/ContinuousQueryService.java | 4 +-
.../apache/iotdb/db/cq/ContinuousQueryTask.java | 2 +-
.../org/apache/iotdb/db/engine/StorageEngine.java | 34 +-
.../iotdb/db/engine/cache/AccountableString.java | 64 -
.../iotdb/db/engine/cache/BloomFilterCache.java | 188 ++
.../db/engine/cache/CacheHitRatioMonitor.java | 25 +
.../engine/cache/CacheHitRatioMonitorMXBean.java | 10 +
.../db/engine/cache/TimeSeriesMetadataCache.java | 203 +-
.../db/engine/compaction/CompactionScheduler.java | 3 +-
.../engine/compaction/CompactionTaskManager.java | 44 +-
.../db/engine/compaction/TsFileIdentifier.java | 184 ++
.../AbstractCrossSpaceCompactionSelector.java | 1 +
.../compaction/cross/CrossCompactionStrategy.java | 2 +-
.../cross/inplace/InplaceCompactionTask.java | 7 -
.../inplace/manage/CrossSpaceMergeContext.java | 2 +-
.../inplace/manage/CrossSpaceMergeResource.java | 7 +-
.../cross/inplace/manage/MergeManager.java | 4 +-
.../recover/InplaceCompactionLogAnalyzer.java | 353 +++
.../inplace/recover/InplaceCompactionLogger.java | 150 ++
.../cross/inplace/recover/LogAnalyzer.java | 328 ---
.../cross/inplace/recover/MergeLogger.java | 140 --
.../cross/inplace/selector/IMergePathSelector.java | 2 +-
.../cross/inplace/selector/NaivePathSelector.java | 2 +-
.../cross/inplace/task/CrossSpaceMergeTask.java | 25 +-
.../cross/inplace/task/MergeFileTask.java | 28 +-
.../cross/inplace/task/MergeMultiChunkTask.java | 30 +-
.../cross/inplace/task/RecoverCrossMergeTask.java | 25 +-
.../AbstractInnerSpaceCompactionSelector.java | 1 +
.../inner/AbstractInnerSpaceCompactionTask.java | 2 +
.../compaction/inner/InnerCompactionStrategy.java | 2 +-
.../SizeTieredCompactionRecoverTask.java | 85 +-
.../sizetiered/SizeTieredCompactionSelector.java | 2 +-
.../inner/sizetiered/SizeTieredCompactionTask.java | 121 +-
.../inner/utils/InnerSpaceCompactionUtils.java | 20 +-
.../utils/SizeTieredCompactionLogAnalyzer.java | 27 +-
.../inner/utils/SizeTieredCompactionLogger.java | 13 +-
.../compaction/task/AbstractCompactionTask.java | 10 +-
.../compaction/task/CompactionRecoverTask.java | 7 +-
.../apache/iotdb/db/engine/flush/FlushManager.java | 3 +-
.../iotdb/db/engine/flush/MemTableFlushTask.java | 155 +-
.../iotdb/db/engine/flush/NotifyFlushMemTable.java | 7 -
.../iotdb/db/engine/memtable/AbstractMemTable.java | 353 ++-
.../engine/memtable/AlignedWritableMemChunk.java | 363 +++
.../memtable/AlignedWritableMemChunkGroup.java | 108 +
.../apache/iotdb/db/engine/memtable/IMemTable.java | 27 +-
.../db/engine/memtable/IWritableMemChunk.java | 37 +-
.../db/engine/memtable/IWritableMemChunkGroup.java | 53 +
.../db/engine/memtable/PrimitiveMemTable.java | 18 +-
.../iotdb/db/engine/memtable/WritableMemChunk.java | 141 +-
.../db/engine/memtable/WritableMemChunkGroup.java | 137 +
.../iotdb/db/engine/modification/Deletion.java | 2 +-
.../iotdb/db/engine/modification/Modification.java | 2 +-
.../db/engine/modification/ModificationFile.java | 10 +-
.../io/LocalTextModificationAccessor.java | 35 +-
.../engine/modification/io/ModificationReader.java | 3 +-
.../engine/modification/io/ModificationWriter.java | 4 +-
.../modification/utils/TracedBufferedReader.java | 462 ++++
.../querycontext/AlignedReadOnlyMemChunk.java | 165 ++
.../db/engine/querycontext/ReadOnlyMemChunk.java | 147 +-
.../selectinto/InsertTabletPlanGenerator.java | 2 +-
.../selectinto/InsertTabletPlansIterator.java | 2 +-
.../engine/storagegroup/StorageGroupProcessor.java | 164 +-
.../db/engine/storagegroup/TsFileProcessor.java | 337 ++-
.../db/engine/storagegroup/TsFileResource.java | 127 +-
.../virtualSg/HashVirtualPartitioner.java | 2 +-
.../storagegroup/virtualSg/VirtualPartitioner.java | 2 +-
.../virtualSg/VirtualStorageGroupManager.java | 10 +-
.../service/TriggerRegistrationInformation.java | 2 +-
.../service/TriggerRegistrationService.java | 2 +-
.../sink/local/LocalIoTDBConfiguration.java | 2 +-
.../trigger/sink/local/LocalIoTDBHandler.java | 6 +-
.../trigger/sink/mqtt/MQTTConfiguration.java | 2 +-
.../iotdb/db/exception/ConfigurationException.java | 44 +
.../exception/StorageGroupNotReadyException.java | 27 +
.../metadata/TemplateImcompatibeException.java | 40 +
.../exception/query/PathNumOverLimitException.java | 6 +-
.../db/exception/query/QueryProcessException.java | 4 +
.../org/apache/iotdb/db/metadata/MManager.java | 623 ++---
.../org/apache/iotdb/db/metadata/PartialPath.java | 361 ---
.../iotdb/db/metadata/VectorPartialPath.java | 122 -
.../db/metadata/lastCache/LastCacheManager.java | 136 +-
.../lastCache/container/ILastCacheContainer.java | 13 -
.../lastCache/container/LastCacheContainer.java | 52 +-
.../lastCache/container/value/ILastCacheValue.java | 12 -
.../lastCache/container/value/LastCacheValue.java | 55 +
.../container/value/UnaryLastCacheValue.java | 106 -
.../container/value/VectorLastCacheValue.java | 86 -
.../iotdb/db/metadata/logfile/MLogTxtWriter.java | 80 +-
.../iotdb/db/metadata/logfile/MLogUpgrader.java | 2 +-
.../iotdb/db/metadata/logfile/MLogWriter.java | 28 +-
.../db/metadata/logfile/MetadataOperationType.java | 2 +
.../iotdb/db/metadata/mnode/EntityMNode.java | 10 +-
.../iotdb/db/metadata/mnode/IEntityMNode.java | 5 +
.../org/apache/iotdb/db/metadata/mnode/IMNode.java | 4 +-
.../iotdb/db/metadata/mnode/IMeasurementMNode.java | 13 +-
.../iotdb/db/metadata/mnode/InternalMNode.java | 13 +
.../org/apache/iotdb/db/metadata/mnode/MNode.java | 2 +-
.../iotdb/db/metadata/mnode/MeasurementMNode.java | 72 +-
.../db/metadata/mnode/MultiMeasurementMNode.java | 65 -
.../db/metadata/mnode/UnaryMeasurementMNode.java | 63 -
.../org/apache/iotdb/db/metadata/mtree/MTree.java | 595 +++--
.../mtree/traverser/PathGrouperByStorageGroup.java | 103 -
.../db/metadata/mtree/traverser/Traverser.java | 117 +-
.../collector/BelongedEntityPathCollector.java | 83 -
.../traverser/collector/CollectorTraverser.java | 8 +-
.../mtree/traverser/collector/EntityCollector.java | 62 +
.../traverser/collector/EntityPathCollector.java | 66 -
.../collector/FlatMeasurementCollector.java | 138 -
.../collector/FlatMeasurementPathCollector.java | 60 -
.../collector/FlatMeasurementSchemaCollector.java | 117 -
.../mtree/traverser/collector/MNodeCollector.java | 2 +-
.../traverser/collector/MeasurementCollector.java | 52 +-
.../traverser/collector/StorageGroupCollector.java | 60 +
.../collector/StorageGroupPathCollector.java | 65 -
.../mtree/traverser/counter/CounterTraverser.java | 2 +-
.../mtree/traverser/counter/EntityCounter.java | 2 +-
.../traverser/counter/FlatMeasurementCounter.java | 78 -
.../mtree/traverser/counter/MNodeLevelCounter.java | 2 +-
.../traverser/counter/MeasurementCounter.java | 2 +-
.../traverser/counter/StorageGroupCounter.java | 2 +-
.../apache/iotdb/db/metadata/path/AlignedPath.java | 470 ++++
.../iotdb/db/metadata/path/MeasurementPath.java | 329 +++
.../apache/iotdb/db/metadata/path/PartialPath.java | 454 ++++
.../apache/iotdb/db/metadata/tag/TagManager.java | 2 +-
.../iotdb/db/metadata/template/Template.java | 583 ++++-
.../db/metadata/template/TemplateManager.java | 79 +-
.../db/metadata/template/TemplateQueryType.java | 27 +
.../iotdb/db/metadata/utils/MetaFormatUtils.java | 2 +-
.../apache/iotdb/db/metadata/utils/MetaUtils.java | 36 +-
.../iotdb/db/metrics/server/ServerArgument.java | 6 +-
.../org/apache/iotdb/db/monitor/StatMonitor.java | 32 +-
.../org/apache/iotdb/db/mqtt/PublishHandler.java | 86 +-
.../apache/iotdb/db/qp/constant/SQLConstant.java | 12 +-
.../apache/iotdb/db/qp/executor/IPlanExecutor.java | 2 +-
.../apache/iotdb/db/qp/executor/PlanExecutor.java | 101 +-
.../org/apache/iotdb/db/qp/logical/Operator.java | 8 +-
.../qp/logical/crud/AggregationQueryOperator.java | 2 +-
.../db/qp/logical/crud/BasicFunctionOperator.java | 6 +-
.../db/qp/logical/crud/DeleteDataOperator.java | 2 +-
.../db/qp/logical/crud/FillQueryOperator.java | 17 +-
.../iotdb/db/qp/logical/crud/FilterOperator.java | 7 +-
.../iotdb/db/qp/logical/crud/FromComponent.java | 2 +-
.../iotdb/db/qp/logical/crud/FunctionOperator.java | 3 +-
.../qp/logical/crud/GroupByFillQueryOperator.java | 13 -
.../iotdb/db/qp/logical/crud/InOperator.java | 10 +-
.../iotdb/db/qp/logical/crud/InsertOperator.java | 23 +-
.../iotdb/db/qp/logical/crud/LikeOperator.java | 17 +-
.../iotdb/db/qp/logical/crud/QueryOperator.java | 91 +-
.../iotdb/db/qp/logical/crud/RegexpOperator.java | 17 +-
.../iotdb/db/qp/logical/crud/SelectComponent.java | 2 +-
.../db/qp/logical/crud/SelectIntoOperator.java | 2 +-
.../qp/logical/sys/ActivateTemplateOperator.java | 51 +
.../db/qp/logical/sys/AlterTimeSeriesOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/AuthorOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/CountOperator.java | 2 +-
.../sys/CreateAlignedTimeSeriesOperator.java | 131 +
.../logical/sys/CreateContinuousQueryOperator.java | 2 +-
.../db/qp/logical/sys/CreateIndexOperator.java | 2 +-
.../db/qp/logical/sys/CreateTemplateOperator.java | 122 +
.../qp/logical/sys/CreateTimeSeriesOperator.java | 2 +-
.../db/qp/logical/sys/CreateTriggerOperator.java | 2 +-
.../db/qp/logical/sys/DeletePartitionOperator.java | 2 +-
.../qp/logical/sys/DeleteStorageGroupOperator.java | 2 +-
.../qp/logical/sys/DeleteTimeSeriesOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/DropIndexOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/FlushOperator.java | 2 +-
.../db/qp/logical/sys/SetStorageGroupOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/SetTTLOperator.java | 2 +-
.../db/qp/logical/sys/SetTemplateOperator.java | 60 +
.../iotdb/db/qp/logical/sys/SettleOperator.java | 2 +-
.../db/qp/logical/sys/ShowChildNodesOperator.java | 2 +-
.../db/qp/logical/sys/ShowChildPathsOperator.java | 2 +-
.../db/qp/logical/sys/ShowDevicesOperator.java | 2 +-
.../db/qp/logical/sys/ShowLockInfoOperator.java | 2 +-
.../qp/logical/sys/ShowStorageGroupOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/ShowTTLOperator.java | 2 +-
.../db/qp/logical/sys/ShowTimeSeriesOperator.java | 2 +-
.../iotdb/db/qp/logical/sys/UnSetTTLOperator.java | 2 +-
.../db/qp/logical/sys/UnsetTemplateOperator.java | 60 +
.../org/apache/iotdb/db/qp/physical/BatchPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/PhysicalPlan.java | 82 +-
.../iotdb/db/qp/physical/crud/AggregationPlan.java | 6 +-
.../db/qp/physical/crud/AlignByDevicePlan.java | 13 +-
.../db/qp/physical/crud/CreateTemplatePlan.java | 270 --
.../db/qp/physical/crud/DeletePartitionPlan.java | 2 +-
.../iotdb/db/qp/physical/crud/DeletePlan.java | 4 +-
.../db/qp/physical/crud/InsertMultiTabletPlan.java | 10 +-
.../iotdb/db/qp/physical/crud/InsertPlan.java | 55 +-
.../iotdb/db/qp/physical/crud/InsertRowPlan.java | 55 +-
.../physical/crud/InsertRowsOfOneDevicePlan.java | 23 +-
.../iotdb/db/qp/physical/crud/InsertRowsPlan.java | 9 +-
.../db/qp/physical/crud/InsertTabletPlan.java | 32 +-
.../iotdb/db/qp/physical/crud/LastQueryPlan.java | 1 -
.../iotdb/db/qp/physical/crud/QueryPlan.java | 32 +-
.../db/qp/physical/crud/RawDataQueryPlan.java | 59 +-
.../iotdb/db/qp/physical/crud/SelectIntoPlan.java | 7 +-
.../db/qp/physical/crud/SetSchemaTemplatePlan.java | 94 -
.../apache/iotdb/db/qp/physical/crud/UDTFPlan.java | 31 +-
.../qp/physical/crud/UnsetSchemaTemplatePlan.java | 96 -
.../db/qp/physical/sys/ActivateTemplatePlan.java | 83 +
.../db/qp/physical/sys/AlterTimeSeriesPlan.java | 2 +-
.../db/qp/physical/sys/AppendTemplatePlan.java | 218 ++
.../iotdb/db/qp/physical/sys/AuthorPlan.java | 4 +-
.../qp/physical/sys/AutoCreateDeviceMNodePlan.java | 4 +-
.../iotdb/db/qp/physical/sys/ChangeAliasPlan.java | 4 +-
.../db/qp/physical/sys/ChangeTagOffsetPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/ClearCachePlan.java | 4 +-
.../apache/iotdb/db/qp/physical/sys/CountPlan.java | 2 +-
.../physical/sys/CreateAlignedTimeSeriesPlan.java | 39 +-
.../qp/physical/sys/CreateContinuousQueryPlan.java | 4 +-
.../db/qp/physical/sys/CreateFunctionPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/CreateIndexPlan.java | 4 +-
.../qp/physical/sys/CreateMultiTimeSeriesPlan.java | 5 +-
.../db/qp/physical/sys/CreateSnapshotPlan.java | 4 +-
.../db/qp/physical/sys/CreateTemplatePlan.java | 515 ++++
.../db/qp/physical/sys/CreateTimeSeriesPlan.java | 4 +-
.../db/qp/physical/sys/CreateTriggerPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/DataAuthPlan.java | 4 +-
.../db/qp/physical/sys/DeleteStorageGroupPlan.java | 4 +-
.../db/qp/physical/sys/DeleteTimeSeriesPlan.java | 4 +-
.../qp/physical/sys/DropContinuousQueryPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/DropFunctionPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/DropIndexPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/DropTriggerPlan.java | 4 +-
.../apache/iotdb/db/qp/physical/sys/DummyPlan.java | 5 +-
.../apache/iotdb/db/qp/physical/sys/FlushPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/KillQueryPlan.java | 2 +-
.../db/qp/physical/sys/LoadConfigurationPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/LoadDataPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/LogPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/MNodePlan.java | 4 +-
.../db/qp/physical/sys/MeasurementMNodePlan.java | 4 +-
.../apache/iotdb/db/qp/physical/sys/MergePlan.java | 4 +-
.../iotdb/db/qp/physical/sys/OperateFilePlan.java | 2 +-
.../db/qp/physical/sys/PruneTemplatePlan.java | 107 +
.../db/qp/physical/sys/SetStorageGroupPlan.java | 4 +-
.../db/qp/physical/sys/SetSystemModePlan.java | 4 +-
.../iotdb/db/qp/physical/sys/SetTTLPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/SetTemplatePlan.java | 94 +
.../physical/sys/SetUsingSchemaTemplatePlan.java | 83 -
.../iotdb/db/qp/physical/sys/SettlePlan.java | 2 +-
.../db/qp/physical/sys/ShowChildNodesPlan.java | 2 +-
.../db/qp/physical/sys/ShowChildPathsPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/ShowDevicesPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/ShowLockInfoPlan.java | 2 +-
.../apache/iotdb/db/qp/physical/sys/ShowPlan.java | 2 +-
.../db/qp/physical/sys/ShowStorageGroupPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/ShowTTLPlan.java | 2 +-
.../db/qp/physical/sys/ShowTimeSeriesPlan.java | 2 +-
.../iotdb/db/qp/physical/sys/StartTriggerPlan.java | 4 +-
.../iotdb/db/qp/physical/sys/StopTriggerPlan.java | 4 +-
.../db/qp/physical/sys/StorageGroupMNodePlan.java | 4 +-
.../iotdb/db/qp/physical/sys/TracingPlan.java | 2 +-
.../db/qp/physical/sys/UnsetTemplatePlan.java | 96 +
.../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java | 376 ++-
.../iotdb/db/qp/strategy/LogicalGenerator.java | 2 +-
.../iotdb/db/qp/strategy/PhysicalGenerator.java | 12 +-
.../qp/strategy/optimizer/ConcatPathOptimizer.java | 21 +-
.../optimizer/MergeSingleFilterOptimizer.java | 2 +-
.../qp/strategy/optimizer/RemoveNotOptimizer.java | 2 +-
.../apache/iotdb/db/qp/utils/DatetimeUtils.java | 12 +-
.../iotdb/db/qp/utils/EmptyOutputStream.java | 35 +
.../iotdb/db/qp/utils/GroupByLevelController.java | 4 +-
.../apache/iotdb/db/qp/utils/WildcardsRemover.java | 27 +-
.../db/query/aggregation/AggregateResult.java | 14 +-
.../db/query/aggregation/impl/AvgAggrResult.java | 9 +-
.../db/query/aggregation/impl/CountAggrResult.java | 10 +-
.../query/aggregation/impl/ExtremeAggrResult.java | 7 +-
.../aggregation/impl/FirstValueAggrResult.java | 19 +-
.../aggregation/impl/FirstValueDescAggrResult.java | 12 +-
.../aggregation/impl/LastValueAggrResult.java | 7 +-
.../aggregation/impl/LastValueDescAggrResult.java | 12 +-
.../query/aggregation/impl/MaxTimeAggrResult.java | 5 +-
.../aggregation/impl/MaxTimeDescAggrResult.java | 10 +-
.../query/aggregation/impl/MaxValueAggrResult.java | 10 +-
.../query/aggregation/impl/MinTimeAggrResult.java | 10 +-
.../aggregation/impl/MinTimeDescAggrResult.java | 10 +-
.../query/aggregation/impl/MinValueAggrResult.java | 10 +-
.../db/query/aggregation/impl/SumAggrResult.java | 9 +-
.../iotdb/db/query/context/QueryContext.java | 21 +-
.../iotdb/db/query/control/FileReaderManager.java | 110 +-
.../iotdb/db/query/control/QueryFileManager.java | 38 +-
.../db/query/control/QueryResourceManager.java | 11 +-
.../iotdb/db/query/control/SessionManager.java | 2 +-
.../db/query/control/SessionTimeoutManager.java | 17 +-
.../db/query/dataset/AlignByDeviceDataSet.java | 71 +-
.../apache/iotdb/db/query/dataset/ListDataSet.java | 2 +-
.../db/query/dataset/NonAlignEngineDataSet.java | 2 +-
.../dataset/RawQueryDataSetWithValueFilter.java | 19 +-
.../dataset/RawQueryDataSetWithoutValueFilter.java | 42 +-
.../query/dataset/ShowContinuousQueriesResult.java | 2 +-
.../iotdb/db/query/dataset/ShowDevicesDataSet.java | 2 +-
.../db/query/dataset/ShowTimeseriesDataSet.java | 2 +-
.../iotdb/db/query/dataset/SingleDataSet.java | 6 +-
.../db/query/dataset/UDTFAlignByTimeDataSet.java | 2 +
.../apache/iotdb/db/query/dataset/UDTFDataSet.java | 2 +-
.../dataset/groupby/GroupByEngineDataSet.java | 159 +-
.../query/dataset/groupby/GroupByFillDataSet.java | 220 --
.../dataset/groupby/GroupByFillEngineDataSet.java | 412 +++
.../groupby/GroupByFillWithValueFilterDataSet.java | 438 ++++
.../GroupByFillWithoutValueFilterDataSet.java | 258 ++
.../query/dataset/groupby/GroupByLevelDataSet.java | 6 +-
.../groupby/GroupByWithValueFilterDataSet.java | 16 +-
.../groupby/GroupByWithoutValueFilterDataSet.java | 11 +-
.../dataset/groupby/LocalGroupByExecutor.java | 2 +-
.../db/query/executor/AggregationExecutor.java | 155 +-
.../iotdb/db/query/executor/FillQueryExecutor.java | 5 +-
.../iotdb/db/query/executor/LastQueryExecutor.java | 61 +-
.../iotdb/db/query/executor/QueryRouter.java | 82 +-
.../db/query/executor/RawDataQueryExecutor.java | 8 +-
.../executor/fill/AlignedLastPointReader.java | 58 +
.../apache/iotdb/db/query/executor/fill/IFill.java | 88 +-
.../db/query/executor/fill/LastPointReader.java | 56 +-
.../iotdb/db/query/executor/fill/LinearFill.java | 83 +-
.../iotdb/db/query/executor/fill/PreviousFill.java | 45 +-
.../iotdb/db/query/executor/fill/ValueFill.java | 6 +-
.../iotdb/db/query/expression/Expression.java | 50 +-
.../iotdb/db/query/expression/ResultColumn.java | 15 +-
.../query/expression/binary/BinaryExpression.java | 30 +-
.../db/query/expression/unary/ConstantOperand.java | 111 +
.../query/expression/unary/FunctionExpression.java | 14 +-
.../query/expression/unary/NegationExpression.java | 14 +-
.../query/expression/unary/TimeSeriesOperand.java | 14 +-
.../iotdb/db/query/pool/QueryTaskPoolManager.java | 10 +-
.../query/reader/chunk/DiskAlignedChunkLoader.java | 67 +
.../db/query/reader/chunk/DiskChunkLoader.java | 12 +
.../query/reader/chunk/MemAlignedChunkLoader.java | 52 +
.../query/reader/chunk/MemAlignedChunkReader.java | 110 +
.../query/reader/chunk/MemAlignedPageReader.java | 109 +
.../db/query/reader/chunk/MemChunkLoader.java | 8 +-
.../iotdb/db/query/reader/chunk/MemPageReader.java | 10 +-
.../metadata/DiskAlignedChunkMetadataLoader.java | 109 +
.../chunk/metadata/DiskChunkMetadataLoader.java | 68 +-
.../metadata/MemAlignedChunkMetadataLoader.java | 89 +
.../chunk/metadata/MemChunkMetadataLoader.java | 31 +-
.../series/AlignedSeriesAggregateReader.java | 201 ++
.../query/reader/series/AlignedSeriesReader.java | 109 +
.../query/reader/series/SeriesAggregateReader.java | 5 +-
.../reader/series/SeriesRawDataBatchReader.java | 8 +-
.../iotdb/db/query/reader/series/SeriesReader.java | 118 +-
.../reader/series/SeriesReaderByTimestamp.java | 23 +-
.../reader/series/VectorSeriesAggregateReader.java | 177 --
.../universal/AlignedDescPriorityMergeReader.java | 39 +
.../universal/AlignedPriorityMergeReader.java | 51 +
.../reader/universal/PriorityMergeReader.java | 20 +-
.../query/timegenerator/ServerTimeGenerator.java | 29 +-
.../api/customizer/parameter/UDFParameters.java | 2 +-
.../db/query/udf/builtin/BuiltinFunction.java | 1 +
.../iotdb/db/query/udf/builtin/UDTFCast.java | 259 ++
.../db/query/udf/core/executor/UDTFExecutor.java | 6 +
.../udf/core/layer/ConstantIntermediateLayer.java | 66 +
.../layer/MultiInputColumnIntermediateLayer.java | 8 +-
.../query/udf/core/layer/RawQueryInputLayer.java | 7 +-
...InputColumnMultiReferenceIntermediateLayer.java | 5 +
...nputColumnSingleReferenceIntermediateLayer.java | 4 +
.../udf/core/reader/ConstantLayerPointReader.java | 132 +
.../db/query/udf/core/reader/LayerPointReader.java | 2 +
.../transformer/ArithmeticBinaryTransformer.java | 17 +
.../transformer/ArithmeticNegationTransformer.java | 5 +
.../udf/core/transformer/UDFQueryTransformer.java | 5 +
.../tv/ElasticSerializableTVList.java | 5 +
.../iotdb/db/rescon/AbstractPoolManager.java | 11 +
.../apache/iotdb/db/rescon/TVListAllocator.java | 19 +-
.../java/org/apache/iotdb/db/rest/RestService.java | 156 ++
.../iotdb/db/rest/filter/ApiOriginFilter.java | 45 +
.../iotdb/db/rest/filter/AuthorizationFilter.java | 125 +
.../iotdb/db/rest/filter/BasicSecurityContext.java | 56 +
.../java/org/apache/iotdb/db/rest/filter/User.java | 38 +
.../org/apache/iotdb/db/rest/filter/UserCache.java | 56 +
.../db/rest/handler/AuthorizationHandler.java | 56 +
.../iotdb/db/rest/handler/ExceptionHandler.java | 69 +
.../handler/PhysicalPlanConstructionHandler.java | 156 ++
.../iotdb/db/rest/handler/QueryDataSetHandler.java | 95 +
.../db/rest/handler/RequestValidationHandler.java | 39 +
.../iotdb/db/rest/impl/PingApiServiceImpl.java | 37 +
.../iotdb/db/rest/impl/RestApiServiceImpl.java | 149 ++
.../java/org/apache/iotdb/db/service/IoTDB.java | 17 +-
.../apache/iotdb/db/service/MetricsService.java | 4 +-
.../org/apache/iotdb/db/service/RPCService.java | 14 +-
.../iotdb/db/service/RPCServiceThriftHandler.java | 2 +-
.../org/apache/iotdb/db/service/ServiceType.java | 11 +-
.../org/apache/iotdb/db/service/SettleService.java | 2 +-
.../org/apache/iotdb/db/service/TSServiceImpl.java | 564 ++---
.../org/apache/iotdb/db/service/UpgradeSevice.java | 9 +-
.../db/service/basic/BasicOpenSessionResp.java | 34 +
.../db/service/basic/BasicServiceProvider.java | 263 ++
.../db/service/basic/QueryFrequencyRecorder.java | 54 +
.../iotdb/db/service/thrift/ThriftService.java | 22 +-
.../db/service/thrift/ThriftServiceThread.java | 213 +-
.../iotdb/db/sync/receiver/SyncServerManager.java | 6 +
.../db/sync/receiver/transfer/SyncServiceImpl.java | 14 +-
.../iotdb/db/sync/sender/transfer/SyncClient.java | 23 +-
.../apache/iotdb/db/tools/IoTDBDataDirViewer.java | 4 +-
.../apache/iotdb/db/tools/TsFileRewriteTool.java | 14 +-
.../org/apache/iotdb/db/tools/mlog/MLogParser.java | 25 +-
.../db/tools/settle/TsFileAndModSettleTool.java | 6 +-
.../db/tools/virtualsg/DeviceMappingViewer.java | 2 +-
.../iotdb/db/tools/vis/TsFileExtractVisdata.java | 2 +-
.../db/tools/watermark/WatermarkDetector.java | 4 +-
.../iotdb/db/utils/AlignedValueIterator.java | 58 +
.../apache/iotdb/db/utils/EnvironmentUtils.java | 347 +++
.../apache/iotdb/db/utils/ErrorHandlingUtils.java | 152 ++
.../org/apache/iotdb/db/utils/FileLoaderUtils.java | 157 +-
.../java/org/apache/iotdb/db/utils/MemUtils.java | 72 +-
.../java/org/apache/iotdb/db/utils/MergeUtils.java | 37 +-
.../apache/iotdb/db/utils/QueryDataSetUtils.java | 3 +-
.../java/org/apache/iotdb/db/utils/QueryUtils.java | 72 +-
.../org/apache/iotdb/db/utils/SchemaTestUtils.java | 39 +
.../org/apache/iotdb/db/utils/SchemaUtils.java | 16 +-
.../org/apache/iotdb/db/utils/SerializeUtils.java | 77 +-
.../org/apache/iotdb/db/utils/ValueIterator.java | 56 +
.../db/utils/datastructure/AlignedTVList.java | 989 ++++++++
.../iotdb/db/utils/datastructure/TVList.java | 82 +-
.../iotdb/db/utils/datastructure/VectorTVList.java | 718 ------
.../writelog/manager/MultiFileLogNodeManager.java | 5 +-
.../db/writelog/node/ExclusiveWriteLogNode.java | 21 +-
.../iotdb/db/writelog/recover/LogReplayer.java | 50 +-
.../apache/iotdb/db/auth/AuthorityCheckerTest.java | 2 +-
.../org/apache/iotdb/db/constant/TestConstant.java | 140 --
.../iotdb/db/engine/MetadataManagerHelper.java | 2 +-
.../db/engine/cache/BloomFilterCacheTest.java | 208 ++
.../iotdb/db/engine/cache/ChunkCacheTest.java | 12 +-
.../engine/compaction/CompactionSchedulerTest.java | 20 +-
.../compaction/CompactionTaskManagerTest.java | 252 ++
.../db/engine/compaction/TsFileIdentifierUT.java | 194 ++
.../compaction/cross/CrossSpaceCompactionTest.java | 2 +-
.../engine/compaction/cross/MergeOverLapTest.java | 12 +-
.../db/engine/compaction/cross/MergeTaskTest.java | 40 +-
.../db/engine/compaction/cross/MergeTest.java | 6 +-
.../engine/compaction/cross/MergeUpgradeTest.java | 3 +-
.../compaction/inner/InnerCompactionCacheTest.java | 148 --
.../compaction/inner/InnerCompactionChunkTest.java | 4 +-
.../compaction/inner/InnerCompactionLogTest.java | 4 +-
.../inner/InnerCompactionMoreDataTest.java | 16 +-
.../inner/InnerCompactionSchedulerTest.java | 4 +-
.../compaction/inner/InnerCompactionTest.java | 14 +-
.../compaction/inner/InnerSeqCompactionTest.java | 23 +-
.../inner/InnerSpaceCompactionUtilsTest.java | 21 +-
.../compaction/inner/InnerUnseqCompactionTest.java | 9 +-
.../SizeTieredCompactionRecoverTest.java | 376 ++-
.../inner/sizetiered/SizeTieredCompactionTest.java | 3 +-
.../recover/SizeTieredCompactionRecoverTest.java | 732 ++++++
.../task/FakedInnerSpaceCompactionTask.java | 44 +-
.../compaction/utils/CompactionCheckerUtils.java | 2 +-
.../compaction/utils/CompactionClearUtils.java | 1 -
.../utils/CompactionFileGeneratorUtils.java | 11 +-
.../db/engine/memtable/MemTableFlushTaskTest.java | 22 +-
.../db/engine/memtable/MemTableTestUtils.java | 24 +-
.../db/engine/memtable/MemtableBenchmark.java | 7 +-
.../db/engine/memtable/PrimitiveMemTableTest.java | 291 ++-
.../engine/modification/DeletionFileNodeTest.java | 17 +-
.../db/engine/modification/DeletionQueryTest.java | 101 +-
.../engine/modification/ModificationFileTest.java | 2 +-
.../io/LocalTextModificationAccessorTest.java | 51 +-
.../engine/storagegroup/FakedTsFileResource.java | 11 +
.../storagegroup/FileNodeManagerBenchmark.java | 2 +-
.../storagegroup/StorageGroupProcessorTest.java | 29 +-
.../iotdb/db/engine/storagegroup/TTLTest.java | 18 +-
.../engine/storagegroup/TsFileProcessorTest.java | 123 +-
.../virtualSg/HashVirtualPartitionerTest.java | 2 +-
.../iotdb/db/integration/IOTDBGroupByIT.java | 1007 --------
.../integration/IOTDBGroupByInnerIntervalIT.java | 341 ---
.../db/integration/IOTDBInsertAlignedValuesIT.java | 219 --
.../apache/iotdb/db/integration/IOTDBInsertIT.java | 126 -
.../apache/iotdb/db/integration/IoTDBAliasIT.java | 338 ---
.../iotdb/db/integration/IoTDBAlignByDeviceIT.java | 1307 ----------
.../iotdb/db/integration/IoTDBArithmeticIT.java | 284 ---
.../org/apache/iotdb/db/integration/IoTDBAsIT.java | 610 -----
.../db/integration/IoTDBAutoCreateSchemaIT.java | 206 --
.../iotdb/db/integration/IoTDBCheckConfigIT.java | 161 --
.../iotdb/db/integration/IoTDBClearCacheIT.java | 175 --
.../apache/iotdb/db/integration/IoTDBCloseIT.java | 197 --
.../iotdb/db/integration/IoTDBCompleteIT.java | 488 ----
.../iotdb/db/integration/IoTDBCompressTypeIT.java | 104 -
.../db/integration/IoTDBContinuousQueryIT.java | 413 ---
.../db/integration/IoTDBCreateSnapshotIT.java | 187 --
.../db/integration/IoTDBCreateStorageGroupIT.java | 130 -
.../db/integration/IoTDBCreateTimeseriesIT.java | 167 --
.../apache/iotdb/db/integration/IoTDBDaemonIT.java | 470 ----
.../db/integration/IoTDBDeleteStorageGroupIT.java | 169 --
.../db/integration/IoTDBDeleteTimeseriesIT.java | 221 --
.../iotdb/db/integration/IoTDBDeletionIT.java | 516 ----
.../iotdb/db/integration/IoTDBDisableAlignIT.java | 414 ---
.../iotdb/db/integration/IoTDBEncodingIT.java | 347 ---
.../db/integration/IoTDBEngineTimeGeneratorIT.java | 283 ---
.../iotdb/db/integration/IoTDBExecuteBatchIT.java | 197 --
.../iotdb/db/integration/IoTDBFilePathUtilsIT.java | 112 -
.../apache/iotdb/db/integration/IoTDBFillIT.java | 940 -------
.../db/integration/IoTDBFloatPrecisionIT.java | 174 --
.../db/integration/IoTDBFlushQueryMergeIT.java | 216 --
.../iotdb/db/integration/IoTDBFuzzyQueryIT.java | 292 ---
.../iotdb/db/integration/IoTDBGroupByFillIT.java | 825 ------
.../integration/IoTDBGroupByFillWithRangeIT.java | 182 --
.../iotdb/db/integration/IoTDBGroupByMonthIT.java | 279 ---
.../iotdb/db/integration/IoTDBGroupByUnseqIT.java | 185 --
.../org/apache/iotdb/db/integration/IoTDBInIT.java | 255 --
.../db/integration/IoTDBInsertMultiRowIT.java | 125 -
.../iotdb/db/integration/IoTDBInsertNaNIT.java | 203 --
.../db/integration/IoTDBInsertWithQueryIT.java | 532 ----
.../db/integration/IoTDBInsertWithoutTimeIT.java | 129 -
.../iotdb/db/integration/IoTDBKillQueryIT.java | 81 -
.../iotdb/db/integration/IoTDBLargeDataIT.java | 388 ---
.../apache/iotdb/db/integration/IoTDBLastIT.java | 584 -----
.../iotdb/db/integration/IoTDBLimitSlimitIT.java | 208 --
...IoTDBLoadExternalTsFileWithTimePartitionIT.java | 327 ---
.../db/integration/IoTDBLoadExternalTsfileIT.java | 822 ------
.../integration/IoTDBManageTsFileResourceIT.java | 292 ---
.../apache/iotdb/db/integration/IoTDBMergeIT.java | 339 ---
.../iotdb/db/integration/IoTDBMetadataFetchIT.java | 631 -----
.../iotdb/db/integration/IoTDBMultiDeviceIT.java | 299 ---
.../IoTDBMultiOverlappedChunkInUnseqIT.java | 115 -
.../db/integration/IoTDBMultiOverlappedPageIT.java | 173 --
.../iotdb/db/integration/IoTDBMultiSeriesIT.java | 504 ----
.../db/integration/IoTDBMultiStatementsIT.java | 194 --
.../iotdb/db/integration/IoTDBNestedQueryIT.java | 410 ---
.../db/integration/IoTDBNewTsFileCompactionIT.java | 1064 --------
.../iotdb/db/integration/IoTDBNumberPathIT.java | 484 ----
.../db/integration/IoTDBOverlappedPageIT.java | 203 --
.../iotdb/db/integration/IoTDBQueryDemoIT.java | 707 ------
.../db/integration/IoTDBQueryMemoryControlIT.java | 294 ---
.../iotdb/db/integration/IoTDBQueryTimeoutIT.java | 153 --
.../iotdb/db/integration/IoTDBQuotedPathIT.java | 146 --
.../iotdb/db/integration/IoTDBRecoverIT.java | 435 ----
.../db/integration/IoTDBRecoverUnclosedIT.java | 288 ---
.../db/integration/IoTDBRemovePartitionIT.java | 330 ---
.../iotdb/db/integration/IoTDBRestartIT.java | 459 ----
.../iotdb/db/integration/IoTDBResultSetIT.java | 126 -
.../db/integration/IoTDBRpcCompressionIT.java | 151 --
.../IoTDBSameMeasurementsDifferentTypesIT.java | 186 --
.../iotdb/db/integration/IoTDBSelectIntoIT.java | 670 -----
.../iotdb/db/integration/IoTDBSensorUpdateIT.java | 85 -
.../db/integration/IoTDBSequenceDataQueryIT.java | 335 ---
.../iotdb/db/integration/IoTDBSeriesReaderIT.java | 457 ----
.../db/integration/IoTDBSessionTimeoutIT.java | 82 -
.../IoTDBSetSystemReadOnlyWritableIT.java | 266 --
.../apache/iotdb/db/integration/IoTDBSettleIT.java | 94 -
.../iotdb/db/integration/IoTDBSimpleQueryIT.java | 1361 ----------
.../integration/IoTDBSizeTieredCompactionIT.java | 1386 ----------
.../integration/IoTDBSortedShowTimeseriesIT.java | 335 ---
.../iotdb/db/integration/IoTDBTagAlterIT.java | 640 -----
.../apache/iotdb/db/integration/IoTDBTagIT.java | 1166 ---------
.../iotdb/db/integration/IoTDBTimePartitionIT.java | 92 -
.../iotdb/db/integration/IoTDBTimeZoneIT.java | 163 --
.../iotdb/db/integration/IoTDBTracingIT.java | 88 -
.../db/integration/IoTDBTriggerExecutionIT.java | 614 -----
.../db/integration/IoTDBTriggerManagementIT.java | 500 ----
.../apache/iotdb/db/integration/IoTDBTtlIT.java | 230 --
.../iotdb/db/integration/IoTDBUDFManagementIT.java | 393 ---
.../db/integration/IoTDBUDFWindowQueryIT.java | 562 -----
.../integration/IoTDBUDTFAlignByTimeQueryIT.java | 867 -------
.../db/integration/IoTDBUDTFBuiltinFunctionIT.java | 367 ---
.../db/integration/IoTDBUDTFHybridQueryIT.java | 184 --
.../db/integration/IoTDBUDTFNonAlignQueryIT.java | 374 ---
.../iotdb/db/integration/IoTDBVersionIT.java | 70 -
.../db/integration/IoTDBWithoutAllNullIT.java | 264 --
.../db/integration/IoTDBWithoutAnyNullIT.java | 221 --
.../aggregation/IoTDBAggregationByLevelIT.java | 534 ----
.../aggregation/IoTDBAggregationDeleteIT.java | 91 -
.../aggregation/IoTDBAggregationIT.java | 1083 --------
.../aggregation/IoTDBAggregationLargeDataIT.java | 1048 --------
.../aggregation/IoTDBAggregationSmallDataIT.java | 855 -------
.../db/integration/auth/IoTDBAuthorizationIT.java | 1151 ---------
.../iotdb/db/metadata/MManagerAdvancedTest.java | 30 +-
.../iotdb/db/metadata/MManagerBasicTest.java | 504 ++--
.../iotdb/db/metadata/MManagerImproveTest.java | 1 +
.../org/apache/iotdb/db/metadata/MTreeTest.java | 24 +-
.../apache/iotdb/db/metadata/MetaUtilsTest.java | 31 +
.../apache/iotdb/db/metadata/PartialPathTest.java | 1 +
.../org/apache/iotdb/db/metadata/TemplateTest.java | 252 ++
.../iotdb/db/metadata/mlog/MLogUpgraderTest.java | 74 +-
.../apache/iotdb/db/mqtt/PublishHandlerTest.java | 75 +-
.../java/org/apache/iotdb/db/qp/PlannerTest.java | 4 +-
.../iotdb/db/qp/logical/LogicalPlanSmallTest.java | 2 +-
.../iotdb/db/qp/other/TSPlanContextAuthorTest.java | 2 +-
.../iotdb/db/qp/physical/ConcatOptimizerTest.java | 2 +-
.../iotdb/db/qp/physical/InsertRowPlanTest.java | 200 +-
.../qp/physical/InsertRowsOfOneDevicePlanTest.java | 2 +-
.../db/qp/physical/InsertTabletMultiPlanTest.java | 2 +-
.../iotdb/db/qp/physical/InsertTabletPlanTest.java | 228 +-
.../db/qp/physical/PhysicalPlanSerializeTest.java | 4 +-
.../iotdb/db/qp/physical/PhysicalPlanTest.java | 150 +-
.../iotdb/db/qp/physical/SerializationTest.java | 2 +-
.../query/aggregation/DescAggregateResultTest.java | 63 +
.../db/query/control/FileReaderManagerTest.java | 19 +-
.../query/dataset/UDTFAlignByTimeDataSetTest.java | 2 +-
.../dataset/groupby/GroupByFillDataSetTest.java | 2 +-
.../reader/series/SeriesAggregateReaderTest.java | 9 +-
.../reader/series/SeriesReaderByTimestampTest.java | 7 +-
.../db/query/reader/series/SeriesReaderTest.java | 2 +-
.../query/reader/series/SeriesReaderTestUtil.java | 8 +-
.../universal/AlignedPriorityMergeReaderTest.java | 91 +
.../iotdb/db/query/udf/example/Accumulator.java | 103 -
.../iotdb/db/rescon/ResourceManagerTest.java | 6 +-
.../apache/iotdb/db/rest/IoTDBRestServiceIT.java | 280 +++
.../org/apache/iotdb/db/sink/MQTTSinkTest.java | 2 +-
.../db/sync/receiver/load/FileLoaderTest.java | 2 +-
.../recover/SyncReceiverLogAnalyzerTest.java | 2 +-
.../db/sync/sender/manage/SyncFileManagerTest.java | 2 +-
.../sender/recover/SyncSenderLogAnalyzerTest.java | 2 +-
.../org/apache/iotdb/db/tools/MLogParserTest.java | 33 +-
.../iotdb/db/tools/TsFileAndModSettleToolTest.java | 4 +-
.../iotdb/db/tools/TsFileSketchToolTest.java | 17 +-
.../org/apache/iotdb/db/tools/WalCheckerTest.java | 2 +-
.../apache/iotdb/db/utils/EnvironmentUtils.java | 345 ---
.../org/apache/iotdb/db/utils/MemUtilsTest.java | 12 +-
.../org/apache/iotdb/db/utils/SchemaUtilsTest.java | 2 +-
.../apache/iotdb/db/utils/SerializeUtilsTest.java | 743 ++++++
.../iotdb/db/utils/TsFileRewriteToolTest.java | 15 +-
.../db/utils/datastructure/VectorTVListTest.java | 65 +-
.../apache/iotdb/db/writelog/PerformanceTest.java | 2 +-
.../iotdb/db/writelog/WriteLogNodeManagerTest.java | 2 +-
.../apache/iotdb/db/writelog/WriteLogNodeTest.java | 103 +-
.../iotdb/db/writelog/io/LogWriterReaderTest.java | 2 +-
.../db/writelog/io/MultiFileLogReaderTest.java | 2 +-
.../db/writelog/recover/DeviceStringTest.java | 8 +-
.../iotdb/db/writelog/recover/LogReplayerTest.java | 27 +-
.../recover/RecoverResourceFromReaderTest.java | 10 +-
.../db/writelog/recover/SeqTsFileRecoverTest.java | 32 +-
.../writelog/recover/UnseqTsFileRecoverTest.java | 10 +-
server/src/test/resources/iotdb-rest.properties | 55 +
.../org/apache/iotdb/rpc/RpcTransportFactory.java | 36 +-
.../main/java/org/apache/iotdb/rpc/RpcUtils.java | 7 +-
.../java/org/apache/iotdb/rpc/TSStatusCode.java | 6 +-
.../java/org/apache/iotdb/session/Session.java | 366 ++-
.../apache/iotdb/session/SessionConnection.java | 72 +-
.../org/apache/iotdb/session/SessionDataSet.java | 7 +-
.../org/apache/iotdb/session/pool/SessionPool.java | 301 ++-
.../iotdb/session/template/InternalNode.java | 59 +
.../iotdb/session/template/MeasurementNode.java | 67 +
.../apache/iotdb/session/template/Template.java | 126 +
.../iotdb/session/template/TemplateNode.java | 55 +
.../iotdb/session/template/TemplateQueryType.java | 27 +
.../iotdb/session/IoTDBSessionComplexIT.java | 927 -------
.../session/IoTDBSessionDisableMemControlIT.java | 205 ++
.../iotdb/session/IoTDBSessionIteratorIT.java | 351 ---
.../apache/iotdb/session/IoTDBSessionSimpleIT.java | 1149 ---------
.../session/IoTDBSessionVectorABDeviceIT.java | 78 +-
.../session/IoTDBSessionVectorAggregationIT.java | 15 +-
.../IoTDBSessionVectorAggregationWithUnSeqIT.java | 4 +-
.../iotdb/session/IoTDBSessionVectorInsertIT.java | 93 +-
.../java/org/apache/iotdb/session/SessionTest.java | 229 +-
.../apache/iotdb/session/template/TemplateUT.java | 103 +
session/src/test/resources/iotdb-rest.properties | 55 +
site/pom.xml | 158 +-
site/src/main/.vuepress/config.js | 6 +-
.../apache/iotdb/spark/db/EnvironmentUtils.java | 2 +
.../org/apache/iotdb/spark/tsfile/qp/Executor.java | 4 +-
.../apache/iotdb/spark/tsfile/DefaultSource.scala | 6 +-
.../iotdb/spark/tsfile/NarrowConverter.scala | 2 +-
.../apache/iotdb/spark/tsfile/WideConverter.scala | 2 +-
.../org/apache/iotdb/spark/tool/TsFileExample.java | 29 +-
.../apache/iotdb/spark/tool/TsFileWriteTool.java | 87 +-
.../test/java/org/apache/iotdb/db/sql/Cases.java | 76 +-
testcontainer/src/tool/README.md | 33 +
testcontainer/src/tool/parser.py | 79 +
thrift-cluster/src/main/thrift/cluster.thrift | 15 +-
thrift/rpc-changelist.md | 16 +-
thrift/src/main/thrift/rpc.thrift | 43 +-
tsfile/pom.xml | 6 +-
.../iotdb/tsfile/common/cache/Accountable.java | 26 -
.../apache/iotdb/tsfile/compress/ICompressor.java | 58 +-
.../compress/GZIPCompressOverflowException.java | 26 +
.../iotdb/tsfile/file/header/PageHeader.java | 12 +
.../tsfile/file/metadata/AlignedChunkMetadata.java | 198 ++
.../file/metadata/AlignedTimeSeriesMetadata.java | 142 ++
.../iotdb/tsfile/file/metadata/ChunkMetadata.java | 42 +-
.../iotdb/tsfile/file/metadata/IChunkMetadata.java | 4 -
.../tsfile/file/metadata/ITimeSeriesMetadata.java | 3 +-
.../file/metadata/MetadataIndexConstructor.java | 6 +-
.../tsfile/file/metadata/TimeseriesMetadata.java | 24 +-
.../tsfile/file/metadata/VectorChunkMetadata.java | 208 --
.../file/metadata/VectorTimeSeriesMetadata.java | 131 -
.../fileOutputFactory/LocalFSOutputFactory.java | 7 +-
.../apache/iotdb/tsfile/read/ReadOnlyTsFile.java | 60 -
.../org/apache/iotdb/tsfile/read/TsFileReader.java | 60 +
.../iotdb/tsfile/read/TsFileSequenceReader.java | 222 +-
.../apache/iotdb/tsfile/read/common/BatchData.java | 123 +-
.../org/apache/iotdb/tsfile/read/common/Chunk.java | 13 +-
.../tsfile/read/common/DescReadWriteBatchData.java | 89 +
.../tsfile/read/common/ExceptionBatchData.java | 10 +-
.../org/apache/iotdb/tsfile/read/common/Field.java | 26 +
.../org/apache/iotdb/tsfile/read/common/Path.java | 7 +-
.../apache/iotdb/tsfile/read/common/RowRecord.java | 6 +-
.../read/controller/CachedChunkLoaderImpl.java | 18 +
.../iotdb/tsfile/read/controller/IChunkLoader.java | 5 +
.../read/controller/IChunkMetadataLoader.java | 4 +-
.../read/controller/MetadataQuerierByFileImpl.java | 87 +-
.../iotdb/tsfile/read/filter/GroupByFilter.java | 20 +-
.../tsfile/read/filter/GroupByMonthFilter.java | 114 +-
.../iotdb/tsfile/read/filter/TimeFilter.java | 11 +
.../tsfile/read/filter/basic/BinaryFilter.java | 8 +
.../tsfile/read/filter/factory/FilterFactory.java | 8 +
.../read/filter/factory/FilterSerializeId.java | 1 +
.../iotdb/tsfile/read/filter/operator/In.java | 15 +-
.../iotdb/tsfile/read/filter/operator/Like.java | 12 +-
.../query/dataset/DataSetWithTimeGenerator.java | 15 +-
.../query/dataset/DataSetWithoutTimeGenerator.java | 24 +-
.../tsfile/read/query/dataset/QueryDataSet.java | 12 +
.../tsfile/read/reader/IAlignedPageReader.java | 28 +
.../iotdb/tsfile/read/reader/LocalTsFileInput.java | 5 +
.../iotdb/tsfile/read/reader/TsFileInput.java | 2 +
.../read/reader/chunk/AlignedChunkReader.java | 309 +++
.../chunk/AlignedChunkReaderByTimestamp.java | 47 +
.../read/reader/chunk/VectorChunkReader.java | 278 --
.../tsfile/read/reader/page/AlignedPageReader.java | 152 ++
.../iotdb/tsfile/read/reader/page/PageReader.java | 1 -
.../tsfile/read/reader/page/TimePageReader.java | 17 +
.../tsfile/read/reader/page/ValuePageReader.java | 3 +
.../tsfile/read/reader/page/VectorPageReader.java | 133 -
.../reader/series/AbstractFileSeriesReader.java | 4 +-
.../read/reader/series/FileSeriesReader.java | 18 +-
.../reader/series/FileSeriesReaderByTimestamp.java | 28 +-
.../org/apache/iotdb/tsfile/utils/BloomFilter.java | 39 +
.../apache/iotdb/tsfile/utils/FilePathUtils.java | 41 +-
.../iotdb/tsfile/utils/MeasurementGroup.java | 65 +
.../iotdb/tsfile/utils/ReadWriteIOUtils.java | 15 +-
.../apache/iotdb/tsfile/utils/StringContainer.java | 8 +-
.../tsfile/v2/read/TsFileSequenceReaderForV2.java | 21 +-
.../apache/iotdb/tsfile/write/TsFileWriter.java | 415 ++-
.../write/chunk/AlignedChunkGroupWriterImpl.java | 301 +++
.../tsfile/write/chunk/AlignedChunkWriterImpl.java | 189 ++
.../tsfile/write/chunk/ChunkGroupWriterImpl.java | 241 --
.../iotdb/tsfile/write/chunk/ChunkWriterImpl.java | 41 +-
.../tsfile/write/chunk/IChunkGroupWriter.java | 17 +-
.../iotdb/tsfile/write/chunk/IChunkWriter.java | 45 -
.../chunk/NonAlignedChunkGroupWriterImpl.java | 188 ++
.../iotdb/tsfile/write/chunk/TimeChunkWriter.java | 4 +
.../iotdb/tsfile/write/chunk/ValueChunkWriter.java | 67 +-
.../tsfile/write/chunk/VectorChunkWriterImpl.java | 204 --
.../apache/iotdb/tsfile/write/page/PageWriter.java | 4 +
.../iotdb/tsfile/write/page/TimePageWriter.java | 4 +
.../iotdb/tsfile/write/page/ValuePageWriter.java | 8 +
.../apache/iotdb/tsfile/write/record/Tablet.java | 55 +-
.../write/record/datapoint/BooleanDataPoint.java | 6 +-
.../tsfile/write/record/datapoint/DataPoint.java | 9 +-
.../write/record/datapoint/DoubleDataPoint.java | 6 +-
.../write/record/datapoint/FloatDataPoint.java | 6 +-
.../write/record/datapoint/IntDataPoint.java | 6 +-
.../write/record/datapoint/LongDataPoint.java | 6 +-
.../write/record/datapoint/StringDataPoint.java | 6 +-
.../tsfile/write/schema/IMeasurementSchema.java | 2 +
.../apache/iotdb/tsfile/write/schema/Schema.java | 69 +-
.../write/schema/UnaryMeasurementSchema.java | 5 +
.../write/schema/VectorMeasurementSchema.java | 92 +-
.../write/writer/RestorableTsFileIOWriter.java | 6 +-
.../iotdb/tsfile/write/writer/TsFileIOWriter.java | 77 +-
.../org/apache/iotdb/tsfile/compress/GZIPTest.java | 17 +-
.../org/apache/iotdb/tsfile/compress/LZ4Test.java | 17 +-
.../apache/iotdb/tsfile/compress/SnappyTest.java | 17 +-
.../file/metadata/TimeSeriesMetadataTest.java | 110 -
.../file/metadata/TimeseriesMetadataTest.java | 110 +
.../iotdb/tsfile/read/ReadInPartitionTest.java | 4 +-
.../iotdb/tsfile/read/ReadOnlyTsFileTest.java | 241 --
.../org/apache/iotdb/tsfile/read/ReadTest.java | 4 +-
.../iotdb/tsfile/read/TimePlainEncodeReadTest.java | 4 +-
.../tsfile/read/TimeSeriesMetadataReadTest.java | 7 +-
.../apache/iotdb/tsfile/read/TsFileReaderTest.java | 477 ++++
.../tsfile/read/TsFileSequenceReaderTest.java | 4 +-
.../tsfile/read/filter/FilterSerializeTest.java | 25 +-
.../read/query/timegenerator/ReadWriteTest.java | 6 +-
.../timegenerator/TimeGeneratorReadEmptyTest.java | 6 +-
.../timegenerator/TimeGeneratorReadWriteTest.java | 6 +-
.../TsFileGeneratorForSeriesReaderByTimestamp.java | 23 +-
.../apache/iotdb/tsfile/utils/FileGenerator.java | 45 +-
.../iotdb/tsfile/utils/ReadWriteIOUtilsTest.java | 30 +-
.../org/apache/iotdb/tsfile/utils/RecordUtils.java | 17 +-
.../apache/iotdb/tsfile/utils/RecordUtilsTest.java | 13 +-
.../iotdb/tsfile/utils/TsFileGeneratorForTest.java | 147 +-
.../tsfile/write/DefaultSchemaTemplateTest.java | 8 +-
.../tsfile/write/MetadataIndexConstructorTest.java | 73 +-
.../org/apache/iotdb/tsfile/write/PerfTest.java | 16 +-
.../iotdb/tsfile/write/ReadPageInMemTest.java | 16 +-
...SameMeasurementsWithDifferentDataTypesTest.java | 6 +-
.../iotdb/tsfile/write/TsFileIOWriterTest.java | 91 +-
.../iotdb/tsfile/write/TsFileReadWriteTest.java | 13 +-
.../iotdb/tsfile/write/TsFileWriteApiTest.java | 331 +++
.../iotdb/tsfile/write/TsFileWriterTest.java | 111 +-
.../org/apache/iotdb/tsfile/write/WriteTest.java | 10 +-
.../write/schema/converter/SchemaBuilderTest.java | 45 +-
.../write/writer/AlignedChunkWriterImplTest.java | 182 ++
.../write/writer/ForceAppendTsFileWriterTest.java | 16 +-
.../write/writer/RestorableTsFileIOWriterTest.java | 63 +-
.../write/writer/VectorChunkWriterImplTest.java | 180 --
.../write/writer/VectorMeasurementSchemaStub.java | 6 +-
.../zeppelin/iotdb/IoTDBInterpreterTest.java | 9 +-
1405 files changed, 102248 insertions(+), 66757 deletions(-)
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/expr/SWRaftMember.java
index 0000000,0000000..52a99b9
new file mode 100644
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/expr/SWRaftMember.java
@@@ -1,0 -1,0 +1,206 @@@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one
++ * or more contributor license agreements. See the NOTICE file
++ * distributed with this work for additional information
++ * regarding copyright ownership. The ASF licenses this file
++ * to you under the Apache License, Version 2.0 (the
++ * "License"); you may not use this file except in compliance
++ * with the License. You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing,
++ * software distributed under the License is distributed on an
++ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++ * KIND, either express or implied. See the License for the
++ * specific language governing permissions and limitations
++ * under the License.
++ */
++
++package org.apache.iotdb.cluster.expr;
++
++import org.apache.iotdb.cluster.client.ClientManager;
++import org.apache.iotdb.cluster.config.ClusterDescriptor;
++import org.apache.iotdb.cluster.log.Log;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
++import org.apache.iotdb.cluster.server.Response;
++import org.apache.iotdb.cluster.server.member.RaftMember;
++import org.apache.iotdb.cluster.server.monitor.Timer;
++import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
++
++import java.util.Arrays;
++import java.util.List;
++
++public abstract class SWRaftMember extends RaftMember {
++
++ private int windowCapacity =
++ ClusterDescriptor.getInstance().getConfig().getMaxNumOfLogsInMem() * 2;
++ private int windowLength = 0;
++ private Log[] logWindow = new Log[windowCapacity];
++ private long firstPosPrevIndex;
++ private long[] prevTerms = new long[windowCapacity];
++
++ public SWRaftMember(String name, ClientManager clientManager) {
++ super(name, clientManager);
++ }
++
++ @Override
++ public void start() {
++ super.start();
++ this.firstPosPrevIndex = logManager.getLastLogIndex();
++ this.prevTerms[0] = logManager.getLastLogTerm();
++ }
++
++ /**
++ * After insert an entry into the window, check if its previous and latter entries should be
++ * removed if it mismatches.
++ *
++ * @param pos
++ */
++ private void checkLog(int pos) {
++ checkLogPrev(pos);
++ checkLogNext(pos);
++ }
++
++ private void checkLogPrev(int pos) {
++ // check the previous entry
++ long prevLogTerm = prevTerms[pos];
++ if (pos > 0) {
++ Log prev = logWindow[pos - 1];
++ if (prev != null && prev.getCurrLogTerm() != prevLogTerm) {
++ logWindow[pos - 1] = null;
++ }
++ }
++ }
++
++ private void checkLogNext(int pos) {
++ // check the next entry
++ Log log = logWindow[pos];
++ boolean nextMismatch = false;
++ if (pos < windowCapacity - 1) {
++ long nextPrevTerm = prevTerms[pos + 1];
++ if (nextPrevTerm != log.getCurrLogTerm()) {
++ nextMismatch = true;
++ }
++ }
++ if (nextMismatch) {
++ for (int i = pos + 1; i < windowCapacity; i++) {
++ if (logWindow[i] != null) {
++ logWindow[i] = null;
++ if (i == windowLength - 1) {
++ windowLength = pos + 1;
++ }
++ } else {
++ break;
++ }
++ }
++ }
++ }
++
++ /**
++ * Flush window range [0, flushPos) into the LogManager, where flushPos is the first null position
++ * in the window.
++ *
++ * @param result
++ * @param leaderCommit
++ * @return
++ */
++ private long flushWindow(AppendEntryResult result, long leaderCommit) {
++ long windowPrevLogIndex = firstPosPrevIndex;
++ long windowPrevLogTerm = prevTerms[0];
++
++ int flushPos = 0;
++ for (; flushPos < windowCapacity; flushPos++) {
++ if (logWindow[flushPos] == null) {
++ break;
++ }
++ }
++
++ // flush [0, flushPos)
++ List<Log> logs = Arrays.asList(logWindow).subList(0, flushPos);
++ long success =
++ logManager.maybeAppend(windowPrevLogIndex, windowPrevLogTerm, leaderCommit, logs);
++ if (success != -1) {
++ System.arraycopy(logWindow, flushPos, logWindow, 0, windowCapacity - flushPos);
++ System.arraycopy(prevTerms, flushPos, prevTerms, 0, windowCapacity - flushPos);
++ for (int i = 1; i <= flushPos; i++) {
++ logWindow[windowCapacity - i] = null;
++ }
++ }
++ firstPosPrevIndex = logManager.getLastLogIndex();
++ result.status = Response.RESPONSE_STRONG_ACCEPT;
++ result.setLastLogIndex(firstPosPrevIndex);
++ result.setLastLogTerm(logManager.getLastLogTerm());
++ return success;
++ }
++
++ @Override
++ protected AppendEntryResult appendEntries(
++ long prevLogIndex, long prevLogTerm, long leaderCommit, List<Log> logs) {
++ if (logs.isEmpty()) {
++ return new AppendEntryResult(Response.RESPONSE_AGREE).setHeader(getHeader());
++ }
++
++ AppendEntryResult result = null;
++ for (Log log : logs) {
++ result = appendEntry(prevLogIndex, prevLogTerm, leaderCommit, log);
++
++ if (result.status != Response.RESPONSE_AGREE
++ && result.status != Response.RESPONSE_STRONG_ACCEPT
++ && result.status != Response.RESPONSE_WEAK_ACCEPT) {
++ return result;
++ }
++ prevLogIndex = log.getCurrLogIndex();
++ prevLogTerm = log.getCurrLogTerm();
++ }
++
++ return result;
++ }
++
++ @Override
++ protected AppendEntryResult appendEntry(
++ long prevLogIndex, long prevLogTerm, long leaderCommit, Log log) {
++
++ long startTime = Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.getOperationStartTime();
++ long appendedPos = 0;
++
++ AppendEntryResult result = new AppendEntryResult();
++ synchronized (logManager) {
++ int windowPos = (int) (log.getCurrLogIndex() - logManager.getLastLogIndex() - 1);
++ if (windowPos < 0) {
++ // the new entry may replace an appended entry
++ appendedPos = logManager.maybeAppend(prevLogIndex, prevLogTerm, leaderCommit, log);
++ result.status = Response.RESPONSE_STRONG_ACCEPT;
++ result.setLastLogIndex(logManager.getLastLogIndex());
++ result.setLastLogTerm(logManager.getLastLogTerm());
++ } else if (windowPos < windowCapacity) {
++ // the new entry falls into the window
++ logWindow[windowPos] = log;
++ prevTerms[windowPos] = prevLogTerm;
++ if (windowLength < windowPos + 1) {
++ windowLength = windowPos + 1;
++ }
++ checkLog(windowPos);
++ if (windowPos == 0) {
++ appendedPos = flushWindow(result, leaderCommit);
++ } else {
++ result.status = Response.RESPONSE_WEAK_ACCEPT;
++ }
++
++ Statistic.RAFT_WINDOW_LENGTH.add(windowLength);
++ } else {
++ Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.calOperationCostTimeFromStart(startTime);
++ result.setStatus(Response.RESPONSE_OUT_OF_WINDOW);
++ result.setHeader(getHeader());
++ return result;
++ }
++ }
++
++ Timer.Statistic.RAFT_RECEIVER_APPEND_ENTRY.calOperationCostTimeFromStart(startTime);
++ if (appendedPos == -1) {
++ // the incoming log points to an illegal position, reject it
++ result.status = Response.RESPONSE_LOG_MISMATCH;
++ }
++ return result;
++ }
++}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
index beaaa77,226593a..bfb2295
--- a/cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/LogDispatcher.java
@@@ -32,15 -29,12 +32,14 @@@ import org.apache.iotdb.cluster.server.
import org.apache.iotdb.cluster.server.member.RaftMember;
import org.apache.iotdb.cluster.server.monitor.Peer;
import org.apache.iotdb.cluster.server.monitor.Timer;
+import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
import org.apache.iotdb.cluster.utils.ClientUtils;
+import org.apache.iotdb.cluster.utils.ClusterUtils;
+ import org.apache.iotdb.db.concurrent.IoTDBThreadPoolFactory;
import org.apache.iotdb.db.conf.IoTDBConstant;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
- import org.apache.iotdb.db.utils.CommonUtils;
import org.apache.iotdb.db.utils.TestOnly;
- import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.slf4j.Logger;
@@@ -68,28 -62,25 +66,29 @@@ import java.util.concurrent.atomic.Atom
public class LogDispatcher {
private static final Logger logger = LoggerFactory.getLogger(LogDispatcher.class);
- private RaftMember member;
- private boolean useBatchInLogCatchUp =
- ClusterDescriptor.getInstance().getConfig().isUseBatchInLogCatchUp();
- // each follower has a queue and a dispatch thread is attached in executorService.
- private List<BlockingQueue<SendLogRequest>> nodeLogQueues = new ArrayList<>();
- private ExecutorService executorService;
-
- // TODO we have no way to close this pool.
- private static final ExecutorService serializationService =
+ RaftMember member;
+ private ClusterConfig clusterConfig = ClusterDescriptor.getInstance().getConfig();
+ private boolean useBatchInLogCatchUp = clusterConfig.isUseBatchInLogCatchUp();
+ List<BlockingQueue<SendLogRequest>> nodesLogQueues = new ArrayList<>();
+ ExecutorService executorService;
+ private static ExecutorService serializationService =
- Executors.newFixedThreadPool(
- CommonUtils.getCpuCores() * 2,
- new ThreadFactoryBuilder().setDaemon(true).setNameFormat("DispatcherEncoder-%d").build());
+ IoTDBThreadPoolFactory.newFixedThreadPoolWithDaemonThread(
+ Runtime.getRuntime().availableProcessors(), "DispatcherEncoder");
+
+ public static int bindingThreadNum = 1;
+ public static int maxBatchSize = 1;
+
public LogDispatcher(RaftMember member) {
this.member = member;
- executorService = Executors.newCachedThreadPool();
+ executorService =
+ IoTDBThreadPoolFactory.newCachedThreadPool("LogDispatcher-" + member.getName());
+ createQueueAndBindingThreads();
+ }
+
+ void createQueueAndBindingThreads() {
for (Node node : member.getAllNodes()) {
- if (!node.equals(member.getThisNode())) {
- nodeLogQueues.add(createQueueAndBindingThread(node));
+ if (!ClusterUtils.isNodeEquals(node, member.getThisNode())) {
+ nodesLogQueues.add(createQueueAndBindingThread(node));
}
}
}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/log/VotingLogList.java
index 0000000,0000000..80878eb
new file mode 100644
--- /dev/null
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/log/VotingLogList.java
@@@ -1,0 -1,0 +1,104 @@@
++/*
++ * Licensed to the Apache Software Foundation (ASF) under one
++ * or more contributor license agreements. See the NOTICE file
++ * distributed with this work for additional information
++ * regarding copyright ownership. The ASF licenses this file
++ * to you under the Apache License, Version 2.0 (the
++ * "License"); you may not use this file except in compliance
++ * with the License. You may obtain a copy of the License at
++ *
++ * http://www.apache.org/licenses/LICENSE-2.0
++ *
++ * Unless required by applicable law or agreed to in writing,
++ * software distributed under the License is distributed on an
++ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++ * KIND, either express or implied. See the License for the
++ * specific language governing permissions and limitations
++ * under the License.
++ */
++
++package org.apache.iotdb.cluster.log;
++
++import java.util.ArrayList;
++import java.util.List;
++
++public class VotingLogList {
++
++ private List<VotingLog> logList = new ArrayList<>();
++ private volatile long currTerm = -1;
++ private int quorumSize;
++
++ public VotingLogList(int quorumSize) {
++ this.quorumSize = quorumSize;
++ }
++
++ /**
++ * Insert a voting entry into the list. Notice the logs must be inserted in order of index, as
++ * they are inserted as soon as created
++ *
++ * @param log
++ */
++ public synchronized void insert(VotingLog log) {
++ if (log.getLog().getCurrLogTerm() != currTerm) {
++ logList.clear();
++ currTerm = log.getLog().getCurrLogTerm();
++ }
++ logList.add(log);
++ }
++
++ /**
++ * When an entry of index-term is strongly accepted by a node of acceptingNodeId, record the id in
++ * all entries whose index <= the accepted entry. If any entry is accepted by a quorum, remove it
++ * from the list.
++ *
++ * @param index
++ * @param term
++ * @param acceptingNodeId
++ * @return the lastly removed entry if any.
++ */
++ public void onStronglyAccept(long index, long term, int acceptingNodeId) {
++ int lastEntryIndexToCommit = -1;
++
++ List<VotingLog> acceptedLogs;
++ synchronized (this) {
++ for (int i = 0, logListSize = logList.size(); i < logListSize; i++) {
++ VotingLog votingLog = logList.get(i);
++ if (votingLog.getLog().getCurrLogIndex() <= index
++ && votingLog.getLog().getCurrLogTerm() == term) {
++ votingLog.getStronglyAcceptedNodeIds().add(acceptingNodeId);
++ if (votingLog.getStronglyAcceptedNodeIds().size() >= quorumSize) {
++ lastEntryIndexToCommit = i;
++ }
++ if (votingLog.getStronglyAcceptedNodeIds().size()
++ + votingLog.getWeaklyAcceptedNodeIds().size()
++ >= quorumSize) {
++ votingLog.acceptedTime = System.nanoTime();
++ }
++ } else if (votingLog.getLog().getCurrLogIndex() > index) {
++ break;
++ }
++ }
++
++ List<VotingLog> tmpAcceptedLogs = logList.subList(0, lastEntryIndexToCommit + 1);
++ acceptedLogs = new ArrayList<>(tmpAcceptedLogs);
++ tmpAcceptedLogs.clear();
++ }
++
++ if (lastEntryIndexToCommit != -1) {
++ for (VotingLog acceptedLog : acceptedLogs) {
++ synchronized (acceptedLog) {
++ acceptedLog.acceptedTime = System.nanoTime();
++ acceptedLog.notifyAll();
++ }
++ }
++ }
++ }
++
++ public synchronized void clear() {
++ logList.clear();
++ }
++
++ public int size() {
++ return logList.size();
++ }
++}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
index fcb70cb,ea77244..233a90a
--- a/cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/partition/slot/SlotPartitionTable.java
@@@ -211,13 -213,13 +213,13 @@@ public class SlotPartitionTable impleme
return ret;
}
- public PartitionGroup getHeaderGroup(RaftNode raftNode, List<Node> nodeRing) {
- PartitionGroup ret = new PartitionGroup(raftNode.getRaftId());
+ public PartitionGroup getPartitionGroup(RaftNode header, List<Node> nodeRing) {
+ PartitionGroup ret = new PartitionGroup(header.getRaftId());
// assuming the nodes are [1,2,3,4,5]
- int nodeIndex = findNodeIndex(raftNode.getNode());
- int nodeIndex = nodeRing.indexOf(header.getNode());
++ int nodeIndex = findNodeIndex(header.getNode());
if (nodeIndex == -1) {
- logger.warn("Node {} is not in the cluster", raftNode.getNode());
+ logger.warn("Node {} is not in the cluster", header.getNode());
return null;
}
int endIndex = nodeIndex + replicationNum;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
index b6c0df2,2945726..c243bca
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/handlers/caller/AppendNodeEntryHandler.java
@@@ -84,59 -83,50 +84,60 @@@ public class AppendNodeEntryHandler imp
// someone has rejected this log because the leadership is stale
return;
}
- long resp = response;
- synchronized (voteCounter) {
- if (resp == RESPONSE_AGREE) {
- int remaining = voteCounter.decrementAndGet();
- logger.debug(
- "{}: Received an agreement from {} for {}, remaining votes to succeed: {}",
- member.getName(),
- receiver,
- log,
- remaining);
- if (remaining == 0) {
- logger.debug(
- "{}: Log [{}] {} is accepted by the quorum",
- member.getName(),
- log.getCurrLogIndex(),
- log);
- voteCounter.notifyAll();
+
+ long resp = response.status;
+
+ if (resp == RESPONSE_STRONG_ACCEPT) {
+ synchronized (log) {
+ if (log.getWeaklyAcceptedNodeIds().size() + log.getStronglyAcceptedNodeIds().size()
+ >= quorumSize) {
+ log.acceptedTime = System.nanoTime();
}
- peer.setMatchIndex(Math.max(log.getCurrLogIndex(), peer.getMatchIndex()));
- } else if (resp > 0) {
- // a response > 0 is the follower's term
- // the leader ship is stale, wait for the new leader's heartbeat
- long prevReceiverTerm = receiverTerm.get();
- logger.debug(
- "{}: Received a rejection from {} because term is stale: {}/{} for log {}",
- member.getName(),
- receiver,
- prevReceiverTerm,
- resp,
- log);
- if (resp > prevReceiverTerm) {
- receiverTerm.set(resp);
+ log.getStronglyAcceptedNodeIds().add(receiver.nodeIdentifier);
+ log.notifyAll();
+ }
+ member
+ .getVotingLogList()
+ .onStronglyAccept(
+ log.getLog().getCurrLogIndex(),
+ log.getLog().getCurrLogTerm(),
+ receiver.nodeIdentifier);
+ peer.setMatchIndex(Math.max(log.getLog().getCurrLogIndex(), peer.getMatchIndex()));
+ } else if (resp > 0) {
+ // a response > 0 is the follower's term
+ // the leader ship is stale, wait for the new leader's heartbeat
+ long prevReceiverTerm = receiverTerm.get();
+ logger.debug(
- "{}: Received a rejection from {} because term is stale: {}/{}",
++ "{}: Received a rejection from {} because term is stale: {}/{}, log: {}",
+ member.getName(),
+ receiver,
+ prevReceiverTerm,
- resp);
++ resp,
++ log);
+ if (resp > prevReceiverTerm) {
+ receiverTerm.set(resp);
+ }
+ leaderShipStale.set(true);
+ synchronized (log) {
+ log.notifyAll();
+ }
+ } else if (resp == RESPONSE_WEAK_ACCEPT) {
+ synchronized (log) {
+ if (log.getWeaklyAcceptedNodeIds().size() + log.getStronglyAcceptedNodeIds().size()
+ >= quorumSize) {
+ log.acceptedTime = System.nanoTime();
}
- leaderShipStale.set(true);
- voteCounter.notifyAll();
- } else {
- // e.g., Response.RESPONSE_LOG_MISMATCH
- logger.debug(
- "{}: The log {} is rejected by {} because: {}", member.getName(), log, receiver, resp);
- onFail();
+ log.getWeaklyAcceptedNodeIds().add(receiver.nodeIdentifier);
+ log.notifyAll();
}
- // rejected because the receiver's logs are stale or the receiver has no cluster info, just
- // wait for the heartbeat to handle
+ } else {
+ // e.g., Response.RESPONSE_LOG_MISMATCH
+ logger.debug(
+ "{}: The log {} is rejected by {} because: {}", member.getName(), log, receiver, resp);
+ onFail();
}
+ // rejected because the receiver's logs are stale or the receiver has no cluster info, just
+ // wait for the heartbeat to handle
}
@Override
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
index 2ccc37f,38a314d..c503296
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/HeartbeatThread.java
@@@ -31,9 -32,6 +32,7 @@@ import org.apache.iotdb.cluster.server.
import org.apache.iotdb.cluster.server.handlers.caller.ElectionHandler;
import org.apache.iotdb.cluster.server.handlers.caller.HeartbeatHandler;
import org.apache.iotdb.cluster.server.member.RaftMember;
- import org.apache.iotdb.cluster.utils.ClientUtils;
+import org.apache.iotdb.cluster.utils.ClusterUtils;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
index cb28a64,f8ce0b8..23a0724
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/heartbeat/MetaHeartbeatThread.java
@@@ -94,13 -87,10 +96,16 @@@ public class MetaHeartbeatThread extend
// operation can be carried out in time.
localMetaMember
.getAppendLogThreadPool()
- .submit(() -> localMetaMember.processEmptyContentLog());
+ .submit(
+ () -> {
- while (localMetaMember.getPartitionTable() == null) {
++ while (!localMetaMember.isReady()) {
+ // wait until partition table is ready
+ }
+ localMetaMember.processPlanLocally(new DummyPlan());
+ });
+ // this is a risk that (1) put a task into a pool
+ // and (2) the task puts more sub-tasks into the same pool, especially the task can only
+ // terminal when all sub-tasks finish.
}
}
}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
index 292dafe,690a826..6472835
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/DataGroupMember.java
@@@ -180,27 -193,28 +194,28 @@@ public class DataGroupMember extends Ra
lastAppliedPartitionTableVersion = new LastAppliedPatitionTableVersion(getMemberDir());
}
- DataGroupMember(
- TProtocolFactory factory,
- PartitionGroup nodes,
- Node thisNode,
- MetaGroupMember metaGroupMember) {
+ DataGroupMember(TProtocolFactory factory, PartitionGroup nodes, MetaGroupMember metaGroupMember) {
+ // The name is used in JMX, so we have to avoid to use "(" "," "=" ")"
super(
- "Data("
+ "Data-"
+ nodes.getHeader().getNode().getInternalIp()
- + ":"
- + nodes.getHeader().getNode().getMetaPort()
- + ", raftId="
- + nodes.getId()
- + ")",
- new AsyncClientPool(new AsyncDataClient.FactoryAsync(factory)),
- new SyncClientPool(new SyncDataClient.FactorySync(factory)),
- new AsyncClientPool(new AsyncDataHeartbeatClient.FactoryAsync(factory)),
- new SyncClientPool(new SyncDataHeartbeatClient.FactorySync(factory)),
- new AsyncClientPool(new SingleManagerFactory(factory)));
- this.thisNode = thisNode;
+ + "-"
+ + nodes.getHeader().getNode().getDataPort()
+ + "-raftId-"
+ + nodes.getRaftId()
+ + "",
+ new ClientManager(
+ ClusterDescriptor.getInstance().getConfig().isUseAsyncServer(),
+ ClientManager.Type.DataGroupClient));
this.metaGroupMember = metaGroupMember;
- allNodes = nodes;
+ setAllNodes(nodes);
+ mbeanName =
+ String.format(
+ "%s:%s=%s%d",
+ "org.apache.iotdb.cluster.service",
+ IoTDBConstant.JMX_TYPE,
+ "DataMember",
+ getRaftGroupId());
setQueryManager(new ClusterQueryManager());
slotManager = new SlotManager(ClusterConstant.SLOT_NUM, getMemberDir(), getName());
dataLogApplier = new DataLogApplier(metaGroupMember, this);
@@@ -899,9 -925,10 +929,10 @@@
logger.debug("{}: start to pre remove node {}", name, removedNode);
}
synchronized (allNodes) {
- if (allNodes.contains(removedNode) && allNodes.size() == config.getReplicationNum()) {
+ if (containsNode(removedNode) && allNodes.size() == config.getReplicationNum()) {
// update the group if the deleted node was in it
- PartitionGroup newGroup = metaGroupMember.getPartitionTable().getHeaderGroup(getHeader());
+ PartitionGroup newGroup =
+ metaGroupMember.getPartitionTable().getPartitionGroup(getHeader());
if (newGroup == null) {
return;
}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
index ad0f55c,f057131..aba662c
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/MetaGroupMember.java
@@@ -272,12 -229,7 +229,8 @@@ public class MetaGroupMember extends Ra
// load the identifier from the disk or generate a new one
loadIdentifier();
allNodes.add(thisNode);
+ idNodeMap.put(thisNode.nodeIdentifier, thisNode);
- Factory dataMemberFactory = new Factory(factory, this);
- dataClusterServer = new DataClusterServer(thisNode, dataMemberFactory, this);
- dataHeartbeatServer = new DataHeartbeatServer(thisNode, dataClusterServer);
- clientServer = new ClientServer(this);
startUpStatus = getNewStartUpStatus();
// try loading the partition table if there was a previous cluster
@@@ -725,35 -648,8 +649,21 @@@
if (response.isSetFollowerIdentifier()) {
// register the follower, the response.getFollower() contains the node information of the
// receiver.
- registerNodeIdentifier(response.getFollower(), response.getFollowerIdentifier());
+ Node localNode = null;
+ for (Node node : allNodes) {
+ if (node.getInternalIp().equals(response.getFollower().internalIp)
+ && node.getMetaPort() == response.getFollower().getMetaPort()) {
+ localNode = node;
+ }
+ }
+ if (localNode == null) {
+ logger.warn(
+ "Received a heartbeat response from a node that is not in the node list: {}",
+ response.getFollower());
+ return;
+ }
+ registerNodeIdentifier(localNode, response.getFollowerIdentifier());
- // if all nodes' ids are known, we can build the partition table
- if (allNodesIdKnown()) {
- // When the meta raft group is established, the follower reports its node information to the
- // leader through the first heartbeat. After the leader knows the node information of all
- // nodes, it can replace the incomplete node information previously saved locally, and build
- // partitionTable to send it to other followers.
- setAllNodes(new PartitionGroup(idNodeMap.values()));
- if (partitionTable == null) {
- partitionTable = new SlotPartitionTable(allNodes, thisNode);
- logger.info("Partition table is set up");
- }
- router = new ClusterPlanRouter(partitionTable);
- this.coordinator.setRouter(router);
- startSubServers();
- }
+ buildMetaEngineServiceIfNotReady();
}
// record the requirement of partition table of the follower
if (response.isRequirePartitionTable()) {
@@@ -761,6 -657,29 +671,29 @@@
}
}
+ public void buildMetaEngineServiceIfNotReady() {
+ // if all nodes' ids are known, we can build the partition table
+ if (!ready && allNodesIdKnown()) {
+ // Notice that this should only be called once.
+
+ // When the meta raft group is established, the follower reports its node information to the
+ // leader through the first heartbeat. After the leader knows the node information of all
+ // nodes, it can replace the incomplete node information previously saved locally, and build
+ // partitionTable to send it to other followers.
- allNodes = new PartitionGroup(idNodeMap.values());
++ setAllNodes(new PartitionGroup(idNodeMap.values()));
+ if (partitionTable == null) {
+ partitionTable = new SlotPartitionTable(allNodes, thisNode);
+ logger.info("Partition table is set up");
+ }
+
+ router = new ClusterPlanRouter(partitionTable);
+ this.coordinator.setRouter(router);
+ rebuildDataGroups();
+ logger.info("The Meta Engine is ready");
+ this.ready = true;
+ }
+ }
+
/**
* When a node requires a partition table in its heartbeat response, add it into blindNodes so in
* the next heartbeat the partition table will be sent to the node.
@@@ -1201,13 -1172,12 +1152,13 @@@
return null;
}
try {
+ logger.debug("calling rpc");
return client.checkStatus(getStartUpStatus());
} catch (TException e) {
- client.getInputProtocol().getTransport().close();
+ client.close();
logger.warn("Error occurs when check status on node : {}", seedNode);
} finally {
- ClientUtils.putBackSyncClient(client);
+ client.returnSelf();
}
}
return null;
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
index cd54aa6,ad356fb..4c6bd8a
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/member/RaftMember.java
@@@ -37,7 -38,6 +39,8 @@@ import org.apache.iotdb.cluster.log.Log
import org.apache.iotdb.cluster.log.LogDispatcher;
import org.apache.iotdb.cluster.log.LogDispatcher.SendLogRequest;
import org.apache.iotdb.cluster.log.LogParser;
+import org.apache.iotdb.cluster.log.VotingLog;
++import org.apache.iotdb.cluster.log.VotingLogList;
import org.apache.iotdb.cluster.log.catchup.CatchUpTask;
import org.apache.iotdb.cluster.log.logtypes.PhysicalPlanLog;
import org.apache.iotdb.cluster.log.manage.RaftLogManager;
@@@ -62,8 -57,7 +65,8 @@@ import org.apache.iotdb.cluster.server.
import org.apache.iotdb.cluster.server.Response;
import org.apache.iotdb.cluster.server.handlers.caller.AppendNodeEntryHandler;
import org.apache.iotdb.cluster.server.handlers.caller.GenericHandler;
+import org.apache.iotdb.cluster.server.handlers.forwarder.IndirectAppendHandler;
+ import org.apache.iotdb.cluster.server.monitor.NodeStatusManager;
import org.apache.iotdb.cluster.server.monitor.Peer;
import org.apache.iotdb.cluster.server.monitor.Timer;
import org.apache.iotdb.cluster.server.monitor.Timer.Statistic;
@@@ -88,9 -84,7 +94,8 @@@ import org.apache.iotdb.db.utils.TestOn
import org.apache.iotdb.rpc.RpcUtils;
import org.apache.iotdb.rpc.TSStatusCode;
import org.apache.iotdb.service.rpc.thrift.TSStatus;
+import org.apache.iotdb.tsfile.utils.Pair;
- import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.thrift.TException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@@ -111,12 -104,11 +116,10 @@@ import java.util.Random
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
@@@ -126,18 -118,9 +129,17 @@@ import static org.apache.iotdb.cluster.
* RaftMember process the common raft logic like leader election, log appending, catch-up and so on.
*/
@SuppressWarnings("java:S3077") // reference volatile is enough
- public abstract class RaftMember {
-
+ public abstract class RaftMember implements RaftMemberMBean {
private static final Logger logger = LoggerFactory.getLogger(RaftMember.class);
- public static final boolean USE_LOG_DISPATCHER = false;
+ public static boolean USE_LOG_DISPATCHER = false;
+ public static boolean USE_INDIRECT_LOG_DISPATCHER = false;
+ public static boolean ENABLE_WEAK_ACCEPTANCE = true;
+ public static boolean ENABLE_COMMIT_RETURN = false;
+
+ protected static final LogSequencerFactory SEQUENCER_FACTORY =
+ ClusterDescriptor.getInstance().getConfig().isUseAsyncSequencing()
+ ? new Factory()
+ : new SynchronousSequencer.Factory();
private static final String MSG_FORWARD_TIMEOUT = "{}: Forward {} to {} time out";
private static final String MSG_FORWARD_ERROR =
@@@ -193,12 -176,10 +195,12 @@@
* offline.
*/
volatile long lastHeartbeatReceivedTime;
+
/** the raft logs are all stored and maintained in the log manager */
- RaftLogManager logManager;
+ protected RaftLogManager logManager;
+
/**
- * s the single thread pool that runs the heartbeat thread, which send heartbeats to the follower
+ * the single thread pool that runs the heartbeat thread, which send heartbeats to the follower
* when this node is a leader, or start elections when this node is an elector.
*/
ExecutorService heartBeatService;
@@@ -266,43 -242,11 +263,19 @@@
*/
protected PlanExecutor localExecutor;
+ /** (logIndex, logTerm) -> append handler */
+ protected Map<Pair<Long, Long>, AppendNodeEntryHandler> sentLogHandlers =
+ new ConcurrentHashMap<>();
+
+ protected VotingLogList votingLogList;
+
- protected RaftMember() {}
-
+ protected LogSequencer logSequencer;
+
- protected RaftMember(
- String name,
- AsyncClientPool asyncPool,
- SyncClientPool syncPool,
- AsyncClientPool asyncHeartbeatPool,
- SyncClientPool syncHeartbeatPool) {
- this.name = name;
- this.asyncClientPool = asyncPool;
- this.syncClientPool = syncPool;
- this.asyncHeartbeatClientPool = asyncHeartbeatPool;
- this.syncHeartbeatClientPool = syncHeartbeatPool;
- this.asyncSendLogClientPool = asyncClientPool;
- }
-
- protected RaftMember(
- String name,
- AsyncClientPool asyncPool,
- SyncClientPool syncPool,
- AsyncClientPool asyncHeartbeatPool,
- SyncClientPool syncHeartbeatPool,
- AsyncClientPool asyncSendLogClientPool) {
+ protected RaftMember() {}
+
+ protected RaftMember(String name, ClientManager clientManager) {
this.name = name;
- this.asyncClientPool = asyncPool;
- this.syncClientPool = syncPool;
- this.asyncHeartbeatClientPool = asyncHeartbeatPool;
- this.syncHeartbeatClientPool = syncHeartbeatPool;
- this.asyncSendLogClientPool = asyncSendLogClientPool;
+ this.clientManager = clientManager;
}
/**
@@@ -698,26 -569,9 +664,8 @@@
return localExecutor;
}
- /**
- * Get an asynchronous heartbeat thrift client to the given node.
- *
- * @return an asynchronous thrift client or null if the caller tries to connect the local node.
- */
- public AsyncClient getAsyncHeartbeatClient(Node node) {
- return getAsyncClient(node, asyncHeartbeatClientPool, false);
- }
-
- /**
- * NOTICE: client.putBack() must be called after use.
- *
- * @return the heartbeat client for the node
- */
- public Client getSyncHeartbeatClient(Node node) {
- return getSyncClient(syncHeartbeatClientPool, node, false);
- }
-
public void sendLogAsync(
- Log log,
- AtomicInteger voteCounter,
+ VotingLog log,
Node node,
AtomicBoolean leaderShipStale,
AtomicLong newLeaderTerm,
@@@ -888,8 -718,10 +832,10 @@@
* @param plan a non-query plan.
* @return A TSStatus indicating the execution result.
*/
- abstract TSStatus executeNonQueryPlan(PhysicalPlan plan);
+ protected abstract TSStatus executeNonQueryPlan(PhysicalPlan plan);
+ abstract ClientCategory getClientCategory();
+
/**
* according to the consistency configuration, decide whether to execute syncLeader or not and
* throws exception when failed. Note that the write request will always try to sync leader
@@@ -1130,39 -967,34 +1081,39 @@@
long startTime = Timer.Statistic.RAFT_SENDER_APPEND_LOG.getOperationStartTime();
Log log;
+ if (plan instanceof LogPlan) {
+ try {
+ log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
+ } catch (UnknownLogTypeException e) {
+ logger.error("Can not parse LogPlan {}", plan, e);
+ return StatusUtils.PARSE_LOG_ERROR;
+ }
+ } else {
+ log = new PhysicalPlanLog();
+ ((PhysicalPlanLog) log).setPlan(plan);
+ plan.setIndex(logManager.getLastLogIndex() + 1);
+ }
+ // if a single log exceeds the threshold
+ // we need to return error code to the client as in server mode
- // if (log.serialize().capacity() + Integer.BYTES
- // >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
- // logger.error(
- // "Log cannot fit into buffer, please increase raft_log_buffer_size;"
- // + "or reduce the size of requests you send.");
- // return StatusUtils.INTERNAL_ERROR;
- // }
++ if (log.serialize().capacity() + Integer.BYTES
++ >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
++ logger.error(
++ "Log cannot fit into buffer, please increase raft_log_buffer_size;"
++ + "or reduce the size of requests you send.");
++ return StatusUtils.INTERNAL_ERROR;
++ }
+
// assign term and index to the new log and append it
+ VotingLog votingLog;
synchronized (logManager) {
- if (plan instanceof LogPlan) {
- try {
- log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
- } catch (UnknownLogTypeException e) {
- logger.error("Can not parse LogPlan {}", plan, e);
- return StatusUtils.PARSE_LOG_ERROR;
- }
- } else {
- log = new PhysicalPlanLog();
- ((PhysicalPlanLog) log).setPlan(plan);
- plan.setIndex(logManager.getLastLogIndex() + 1);
- }
log.setCurrLogTerm(getTerm().get());
log.setCurrLogIndex(logManager.getLastLogIndex() + 1);
-
- // if a single log exceeds the threshold
- // we need to return error code to the client as in server mode
- if (log.serialize().capacity() + Integer.BYTES
- >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
- logger.error(
- "Log cannot fit into buffer, please increase raft_log_buffer_size;"
- + "or reduce the size of requests you send.");
- return StatusUtils.INTERNAL_ERROR;
- }
logManager.append(log);
+ votingLog = buildVotingLog(log);
+ votingLogList.insert(votingLog);
}
+ log.setCreateTime(System.nanoTime());
+
Timer.Statistic.RAFT_SENDER_APPEND_LOG.calOperationCostTimeFromStart(startTime);
try {
@@@ -1181,32 -1012,54 +1132,32 @@@
if (readOnly) {
return StatusUtils.NODE_READ_ONLY;
}
- // assign term and index to the new log and append it
- SendLogRequest sendLogRequest;
- long startTime =
- Statistic.RAFT_SENDER_COMPETE_LOG_MANAGER_BEFORE_APPEND_V2.getOperationStartTime();
Log log;
- synchronized (logManager) {
- Statistic.RAFT_SENDER_COMPETE_LOG_MANAGER_BEFORE_APPEND_V2.calOperationCostTimeFromStart(
- startTime);
-
- if (plan instanceof LogPlan) {
- try {
- log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
- } catch (UnknownLogTypeException e) {
- logger.error("Can not parse LogPlan {}", plan, e);
- return StatusUtils.PARSE_LOG_ERROR;
- }
- } else {
- log = new PhysicalPlanLog();
- ((PhysicalPlanLog) log).setPlan(plan);
- plan.setIndex(logManager.getLastLogIndex() + 1);
- }
- log.setCurrLogTerm(getTerm().get());
- log.setCurrLogIndex(logManager.getLastLogIndex() + 1);
-
- startTime = Timer.Statistic.RAFT_SENDER_APPEND_LOG_V2.getOperationStartTime();
- // just like processPlanLocally,we need to check the size of log
- if (log.serialize().capacity() + Integer.BYTES
- >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
- logger.error(
- "Log cannot fit into buffer, please increase raft_log_buffer_size;"
- + "or reduce the size of requests you send.");
- return StatusUtils.INTERNAL_ERROR;
+ if (plan instanceof LogPlan) {
+ try {
+ log = LogParser.getINSTANCE().parse(((LogPlan) plan).getLog());
+ } catch (UnknownLogTypeException e) {
+ logger.error("Can not parse LogPlan {}", plan, e);
+ return StatusUtils.PARSE_LOG_ERROR;
}
- // logDispatcher will serialize log, and set log size, and we will use the size after it
- logManager.append(log);
- Timer.Statistic.RAFT_SENDER_APPEND_LOG_V2.calOperationCostTimeFromStart(startTime);
-
- startTime = Statistic.RAFT_SENDER_BUILD_LOG_REQUEST.getOperationStartTime();
- sendLogRequest = buildSendLogRequest(log);
- Statistic.RAFT_SENDER_BUILD_LOG_REQUEST.calOperationCostTimeFromStart(startTime);
+ } else {
+ log = new PhysicalPlanLog();
+ ((PhysicalPlanLog) log).setPlan(plan);
+ }
- startTime = Statistic.RAFT_SENDER_OFFER_LOG.getOperationStartTime();
- log.setCreateTime(System.nanoTime());
- getLogDispatcher().offer(sendLogRequest);
- Statistic.RAFT_SENDER_OFFER_LOG.calOperationCostTimeFromStart(startTime);
+ // just like processPlanLocally,we need to check the size of log
- // if (log.serialize().capacity() + Integer.BYTES
- // >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
- // logger.error(
- // "Log cannot fit into buffer, please increase raft_log_buffer_size;"
- // + "or reduce the size of requests you send.");
- // return StatusUtils.INTERNAL_ERROR;
- // }
++ if (log.serialize().capacity() + Integer.BYTES
++ >= ClusterDescriptor.getInstance().getConfig().getRaftLogBufferSize()) {
++ logger.error(
++ "Log cannot fit into buffer, please increase raft_log_buffer_size;"
++ + "or reduce the size of requests you send.");
++ return StatusUtils.INTERNAL_ERROR;
+ }
+ // assign term and index to the new log and append it
+ SendLogRequest sendLogRequest = logSequencer.sequence(log);
+
try {
AppendLogResult appendLogResult =
waitAppendResult(
@@@ -1618,28 -1502,18 +1621,27 @@@
* one follower tells the node that it is no longer a valid leader, or a timeout is triggered.
*/
@SuppressWarnings({"java:S2445"}) // safe synchronized
- private AppendLogResult waitAppendResult(
- AtomicInteger voteCounter, AtomicBoolean leaderShipStale, AtomicLong newLeaderTerm) {
+ protected AppendLogResult waitAppendResult(
+ VotingLog log, AtomicBoolean leaderShipStale, AtomicLong newLeaderTerm, int quorumSize) {
// wait for the followers to vote
long startTime = Timer.Statistic.RAFT_SENDER_VOTE_COUNTER.getOperationStartTime();
- synchronized (voteCounter) {
+ long nextTimeToPrint = 15000;
+
+ int stronglyAcceptedNodeNum = log.getStronglyAcceptedNodeIds().size();
+ int weaklyAcceptedNodeNum = log.getWeaklyAcceptedNodeIds().size();
+ int totalAccepted = stronglyAcceptedNodeNum + weaklyAcceptedNodeNum;
+
+ synchronized (log) {
long waitStart = System.currentTimeMillis();
long alreadyWait = 0;
- while (voteCounter.get() > 0
+ while (stronglyAcceptedNodeNum < quorumSize
+ && (!ENABLE_WEAK_ACCEPTANCE
+ || (totalAccepted < allNodes.size() - 1)
+ || votingLogList.size() > config.getMaxNumOfLogsInMem())
- && alreadyWait < RaftServer.getWriteOperationTimeoutMS()
+ && alreadyWait < ClusterConstant.getWriteOperationTimeoutMS()
- && voteCounter.get() != Integer.MAX_VALUE) {
+ && !log.getStronglyAcceptedNodeIds().contains(Integer.MAX_VALUE)) {
try {
- voteCounter.wait(ClusterConstant.getWriteOperationTimeoutMS());
+ log.wait(0);
- logger.debug("{} ends waiting", log);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
logger.warn("Unexpected interruption when sending a log", e);
@@@ -2168,8 -1964,8 +2170,9 @@@
long alreadyWait = 0;
Object logUpdateCondition = logManager.getLogUpdateCondition(prevLogIndex);
long lastLogIndex = logManager.getLastLogIndex();
+ Timer.Statistic.RAFT_RECEIVER_INDEX_DIFF.add(prevLogIndex - lastLogIndex);
- while (lastLogIndex < prevLogIndex && alreadyWait <= RaftServer.getWriteOperationTimeoutMS()) {
+ while (lastLogIndex < prevLogIndex
+ && alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS()) {
try {
// each time new logs are appended, this will be notified
synchronized (logUpdateCondition) {
@@@ -2186,10 -1982,10 +2189,10 @@@
alreadyWait = System.currentTimeMillis() - waitStart;
}
- return alreadyWait <= RaftServer.getWriteOperationTimeoutMS();
+ return alreadyWait <= ClusterConstant.getWriteOperationTimeoutMS();
}
- private long checkPrevLogIndex(long prevLogIndex) {
+ protected long checkPrevLogIndex(long prevLogIndex) {
long lastLogIndex = logManager.getLastLogIndex();
long startTime = Timer.Statistic.RAFT_RECEIVER_WAIT_FOR_PREV_LOG.getOperationStartTime();
if (lastLogIndex < prevLogIndex && !waitForPrevLog(prevLogIndex)) {
@@@ -2281,40 -2075,13 +2284,40 @@@
}
public int getRaftGroupId() {
- return allNodes.getId();
+ return allNodes.getRaftId();
}
- enum AppendLogResult {
+ protected enum AppendLogResult {
OK,
TIME_OUT,
- LEADERSHIP_STALE
+ LEADERSHIP_STALE,
+ WEAK_ACCEPT
+ }
+
+ /**
+ * Process the result from an indirect receiver of an entry.
+ *
+ * @param ack acknowledgement from an indirect receiver.
+ */
+ public void acknowledgeAppendLog(AppendEntryResult ack) {
+ AppendNodeEntryHandler appendNodeEntryHandler =
+ sentLogHandlers.get(new Pair<>(ack.lastLogIndex, ack.lastLogTerm));
+ if (appendNodeEntryHandler != null) {
+ appendNodeEntryHandler.onComplete(ack);
+ }
+ }
+
+ public void registerAppendLogHandler(
+ Pair<Long, Long> indexTerm, AppendNodeEntryHandler appendNodeEntryHandler) {
+ sentLogHandlers.put(indexTerm, appendNodeEntryHandler);
+ }
+
+ public void removeAppendLogHandler(Pair<Long, Long> indexTerm) {
+ sentLogHandlers.remove(indexTerm);
+ }
+
+ public VotingLogList getVotingLogList() {
+ return votingLogList;
}
public Object getHeartBeatWaitObject() {
@@@ -2329,13 -2096,32 +2332,42 @@@
this.skipElection = skipElection;
}
+ protected boolean containsNode(Node node) {
+ for (Node localNode : allNodes) {
+ if ((localNode.getInternalIp().equals(node.getInternalIp())
+ && localNode.getMetaPort() == node.getMetaPort())) {
+ return true;
+ }
+ }
+ return false;
+ }
++
+ public long getLastReportedLogIndex() {
+ return lastReportedLogIndex;
+ }
+
+ @Override
+ public String getAllNodesAsString() {
+ return allNodes.toString();
+ }
+
+ @Override
+ public String getPeerMapAsString() {
+ return peerMap.toString();
+ }
+
+ @Override
+ public String getLeaderAsString() {
+ return leader.get().toString();
+ }
+
+ @Override
+ public String getLogManagerObject() {
+ return getLogManager().toString();
+ }
+
+ @Override
+ public String getLastCatchUpResponseTimeAsString() {
+ return lastCatchUpResponseTime.toString();
+ }
}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
index 0000000,2fec073..ddec446
mode 000000,100644..100644
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/DataGroupServiceImpls.java
@@@ -1,0 -1,743 +1,776 @@@
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ package org.apache.iotdb.cluster.server.service;
+
+ import org.apache.iotdb.cluster.rpc.thrift.AppendEntriesRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
+ import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
+ import org.apache.iotdb.cluster.rpc.thrift.GetAggrResultRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.GetAllPathsResult;
+ import org.apache.iotdb.cluster.rpc.thrift.GroupByRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.HeartBeatResponse;
+ import org.apache.iotdb.cluster.rpc.thrift.LastQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.MultSeriesQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.Node;
+ import org.apache.iotdb.cluster.rpc.thrift.PreviousFillRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSchemaRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSchemaResp;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSnapshotRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.PullSnapshotResp;
+ import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
+ import org.apache.iotdb.cluster.rpc.thrift.RequestCommitIndexResponse;
+ import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.SingleSeriesQueryRequest;
+ import org.apache.iotdb.cluster.rpc.thrift.TSDataService;
+ import org.apache.iotdb.cluster.utils.IOUtils;
+ import org.apache.iotdb.service.rpc.thrift.TSStatus;
+
+ import org.apache.thrift.TException;
+ import org.apache.thrift.async.AsyncMethodCallback;
+
+ import java.io.File;
+ import java.io.IOException;
+ import java.nio.ByteBuffer;
+ import java.nio.file.Files;
+ import java.util.List;
+ import java.util.Map;
+ import java.util.Set;
+
+ public class DataGroupServiceImpls implements TSDataService.AsyncIface, TSDataService.Iface {
+
+ @Override
+ public void sendHeartbeat(
+ HeartBeatRequest request, AsyncMethodCallback<HeartBeatResponse> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.sendHeartbeat(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void startElection(ElectionRequest request, AsyncMethodCallback<Long> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.startElection(request, resultHandler);
+ }
+ }
+
+ @Override
- public void appendEntries(AppendEntriesRequest request, AsyncMethodCallback<Long> resultHandler) {
++ public void appendEntries(
++ AppendEntriesRequest request, AsyncMethodCallback<AppendEntryResult> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.appendEntries(request, resultHandler);
+ }
+ }
+
+ @Override
- public void appendEntry(AppendEntryRequest request, AsyncMethodCallback<Long> resultHandler) {
++ public void appendEntry(
++ AppendEntryRequest request, AsyncMethodCallback<AppendEntryResult> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.appendEntry(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void sendSnapshot(SendSnapshotRequest request, AsyncMethodCallback<Void> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.sendSnapshot(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void pullSnapshot(
+ PullSnapshotRequest request, AsyncMethodCallback<PullSnapshotResp> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.pullSnapshot(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void executeNonQueryPlan(
+ ExecutNonQueryReq request, AsyncMethodCallback<TSStatus> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.executeNonQueryPlan(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void requestCommitIndex(
+ RaftNode header, AsyncMethodCallback<RequestCommitIndexResponse> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Request commit index");
+ if (service != null) {
+ service.requestCommitIndex(header, resultHandler);
+ }
+ }
+
+ @Override
+ public void readFile(
+ String filePath, long offset, int length, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ try {
+ resultHandler.onComplete(IOUtils.readFile(filePath, offset, length));
+ } catch (IOException e) {
+ resultHandler.onError(e);
+ }
+ }
+
+ @Override
+ public void querySingleSeries(
+ SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(
+ request.getHeader(), resultHandler, "Query series:" + request.getPath());
+ if (service != null) {
+ service.querySingleSeries(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void queryMultSeries(
+ MultSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) throws TException {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(
+ request.getHeader(), resultHandler, "Query series:" + request.getPath());
+ if (service != null) {
+ service.queryMultSeries(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void fetchSingleSeries(
+ RaftNode header, long readerId, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Fetch reader:" + readerId);
+ if (service != null) {
+ service.fetchSingleSeries(header, readerId, resultHandler);
+ }
+ }
+
+ @Override
+ public void fetchMultSeries(
+ RaftNode header,
+ long readerId,
+ List<String> paths,
+ AsyncMethodCallback<Map<String, ByteBuffer>> resultHandler)
+ throws TException {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Fetch reader:" + readerId);
+ if (service != null) {
+ service.fetchMultSeries(header, readerId, paths, resultHandler);
+ }
+ }
+
+ @Override
+ public void getAllPaths(
+ RaftNode header,
+ List<String> paths,
+ boolean withAlias,
+ AsyncMethodCallback<GetAllPathsResult> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Find path:" + paths);
+ if (service != null) {
+ service.getAllPaths(header, paths, withAlias, resultHandler);
+ }
+ }
+
+ @Override
+ public void endQuery(
+ RaftNode header, Node thisNode, long queryId, AsyncMethodCallback<Void> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "End query");
+ if (service != null) {
+ service.endQuery(header, thisNode, queryId, resultHandler);
+ }
+ }
+
+ @Override
+ public void querySingleSeriesByTimestamp(
+ SingleSeriesQueryRequest request, AsyncMethodCallback<Long> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(
+ request.getHeader(),
+ resultHandler,
+ "Query by timestamp:"
+ + request.getQueryId()
+ + "#"
+ + request.getPath()
+ + " of "
+ + request.getRequester());
+ if (service != null) {
+ service.querySingleSeriesByTimestamp(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void fetchSingleSeriesByTimestamps(
+ RaftNode header,
+ long readerId,
+ List<Long> timestamps,
+ AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Fetch by timestamp:" + readerId);
+ if (service != null) {
+ service.fetchSingleSeriesByTimestamps(header, readerId, timestamps, resultHandler);
+ }
+ }
+
+ @Override
+ public void pullTimeSeriesSchema(
+ PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.pullTimeSeriesSchema(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void pullMeasurementSchema(
+ PullSchemaRequest request, AsyncMethodCallback<PullSchemaResp> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, "Pull measurement schema");
+ if (service != null) {
+ service.pullMeasurementSchema(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void getAllDevices(
+ RaftNode header, List<String> paths, AsyncMethodCallback<Set<String>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Get all devices");
+ if (service != null) {
+ service.getAllDevices(header, paths, resultHandler);
+ }
+ }
+
+ @Override
+ public void getDevices(
- RaftNode header, ByteBuffer planBinary, AsyncMethodCallback<ByteBuffer> resultHandler)
- throws TException {
++ RaftNode header, ByteBuffer planBinary, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "get devices");
+ if (service != null) {
+ service.getDevices(header, planBinary, resultHandler);
+ }
+ }
+
+ @Override
+ public void getNodeList(
+ RaftNode header,
+ String path,
+ int nodeLevel,
+ AsyncMethodCallback<List<String>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Get node list");
+ if (service != null) {
+ service.getNodeList(header, path, nodeLevel, resultHandler);
+ }
+ }
+
+ @Override
+ public void getChildNodeInNextLevel(
+ RaftNode header, String path, AsyncMethodCallback<Set<String>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Get child node in next level");
+ if (service != null) {
+ service.getChildNodeInNextLevel(header, path, resultHandler);
+ }
+ }
+
+ @Override
+ public void getChildNodePathInNextLevel(
+ RaftNode header, String path, AsyncMethodCallback<Set<String>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Get child node path in next level");
+ if (service != null) {
+ service.getChildNodePathInNextLevel(header, path, resultHandler);
+ }
+ }
+
+ @Override
+ public void getAllMeasurementSchema(
+ RaftNode header, ByteBuffer planBytes, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Get all measurement schema");
+ if (service != null) {
+ service.getAllMeasurementSchema(header, planBytes, resultHandler);
+ }
+ }
+
+ @Override
+ public void getAggrResult(
+ GetAggrResultRequest request, AsyncMethodCallback<List<ByteBuffer>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.getAggrResult(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void getUnregisteredTimeseries(
+ RaftNode header,
+ List<String> timeseriesList,
+ AsyncMethodCallback<List<String>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Check if measurements are registered");
+ if (service != null) {
+ service.getUnregisteredTimeseries(header, timeseriesList, resultHandler);
+ }
+ }
+
+ @Override
+ public void getGroupByExecutor(GroupByRequest request, AsyncMethodCallback<Long> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.getGroupByExecutor(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void getGroupByResult(
+ RaftNode header,
+ long executorId,
+ long startTime,
+ long endTime,
+ AsyncMethodCallback<List<ByteBuffer>> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Fetch group by");
+ if (service != null) {
+ service.getGroupByResult(header, executorId, startTime, endTime, resultHandler);
+ }
+ }
+
+ @Override
+ public void previousFill(
+ PreviousFillRequest request, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, request);
+ if (service != null) {
+ service.previousFill(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void matchTerm(
+ long index, long term, RaftNode header, AsyncMethodCallback<Boolean> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "Match term");
+ if (service != null) {
+ service.matchTerm(index, term, header, resultHandler);
+ }
+ }
+
+ @Override
+ public void last(LastQueryRequest request, AsyncMethodCallback<ByteBuffer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(request.getHeader(), resultHandler, "last");
+ if (service != null) {
+ service.last(request, resultHandler);
+ }
+ }
+
+ @Override
+ public void getPathCount(
+ RaftNode header,
+ List<String> pathsToQuery,
+ int level,
+ AsyncMethodCallback<Integer> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "count path");
+ if (service != null) {
+ service.getPathCount(header, pathsToQuery, level, resultHandler);
+ }
+ }
+
+ @Override
+ public void getDeviceCount(
+ RaftNode header, List<String> pathsToQuery, AsyncMethodCallback<Integer> resultHandler)
+ throws TException {
+ DataAsyncService service =
+ DataGroupEngine.getInstance().getDataAsyncService(header, resultHandler, "count device");
+ if (service != null) {
+ service.getDeviceCount(header, pathsToQuery, resultHandler);
+ }
+ }
+
+ @Override
+ public void onSnapshotApplied(
+ RaftNode header, List<Integer> slots, AsyncMethodCallback<Boolean> resultHandler) {
+ DataAsyncService service =
+ DataGroupEngine.getInstance()
+ .getDataAsyncService(header, resultHandler, "Snapshot applied");
+ if (service != null) {
+ service.onSnapshotApplied(header, slots, resultHandler);
+ }
+ }
+
+ @Override
+ public long querySingleSeries(SingleSeriesQueryRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .querySingleSeries(request);
+ }
+
+ @Override
+ public long queryMultSeries(MultSeriesQueryRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .queryMultSeries(request);
+ }
+
+ @Override
+ public ByteBuffer fetchSingleSeries(RaftNode header, long readerId) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .fetchSingleSeries(header, readerId);
+ }
+
+ @Override
+ public Map<String, ByteBuffer> fetchMultSeries(RaftNode header, long readerId, List<String> paths)
+ throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .fetchMultSeries(header, readerId, paths);
+ }
+
+ @Override
+ public long querySingleSeriesByTimestamp(SingleSeriesQueryRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .querySingleSeriesByTimestamp(request);
+ }
+
+ @Override
+ public ByteBuffer fetchSingleSeriesByTimestamps(
+ RaftNode header, long readerId, List<Long> timestamps) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .fetchSingleSeriesByTimestamps(header, readerId, timestamps);
+ }
+
+ @Override
+ public void endQuery(RaftNode header, Node thisNode, long queryId) throws TException {
+ DataGroupEngine.getInstance().getDataSyncService(header).endQuery(header, thisNode, queryId);
+ }
+
+ @Override
+ public GetAllPathsResult getAllPaths(RaftNode header, List<String> path, boolean withAlias)
+ throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getAllPaths(header, path, withAlias);
+ }
+
+ @Override
+ public Set<String> getAllDevices(RaftNode header, List<String> path) throws TException {
+ return DataGroupEngine.getInstance().getDataSyncService(header).getAllDevices(header, path);
+ }
+
+ @Override
+ public List<String> getNodeList(RaftNode header, String path, int nodeLevel) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getNodeList(header, path, nodeLevel);
+ }
+
+ @Override
+ public Set<String> getChildNodeInNextLevel(RaftNode header, String path) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getChildNodeInNextLevel(header, path);
+ }
+
+ @Override
+ public Set<String> getChildNodePathInNextLevel(RaftNode header, String path) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getChildNodePathInNextLevel(header, path);
+ }
+
+ @Override
+ public ByteBuffer getAllMeasurementSchema(RaftNode header, ByteBuffer planBinary)
+ throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getAllMeasurementSchema(header, planBinary);
+ }
+
+ @Override
+ public ByteBuffer getDevices(RaftNode header, ByteBuffer planBinary) throws TException {
+ return DataGroupEngine.getInstance().getDataSyncService(header).getDevices(header, planBinary);
+ }
+
+ @Override
+ public List<ByteBuffer> getAggrResult(GetAggrResultRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .getAggrResult(request);
+ }
+
+ @Override
+ public List<String> getUnregisteredTimeseries(RaftNode header, List<String> timeseriesList)
+ throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getUnregisteredTimeseries(header, timeseriesList);
+ }
+
+ @Override
+ public PullSnapshotResp pullSnapshot(PullSnapshotRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .pullSnapshot(request);
+ }
+
+ @Override
+ public long getGroupByExecutor(GroupByRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .getGroupByExecutor(request);
+ }
+
+ @Override
+ public List<ByteBuffer> getGroupByResult(
+ RaftNode header, long executorId, long startTime, long endTime) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getGroupByResult(header, executorId, startTime, endTime);
+ }
+
+ @Override
+ public PullSchemaResp pullTimeSeriesSchema(PullSchemaRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .pullTimeSeriesSchema(request);
+ }
+
+ @Override
+ public PullSchemaResp pullMeasurementSchema(PullSchemaRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .pullMeasurementSchema(request);
+ }
+
+ @Override
+ public ByteBuffer previousFill(PreviousFillRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .previousFill(request);
+ }
+
+ @Override
+ public ByteBuffer last(LastQueryRequest request) throws TException {
+ return DataGroupEngine.getInstance().getDataSyncService(request.getHeader()).last(request);
+ }
+
+ @Override
+ public int getPathCount(RaftNode header, List<String> pathsToQuery, int level) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getPathCount(header, pathsToQuery, level);
+ }
+
+ @Override
+ public boolean onSnapshotApplied(RaftNode header, List<Integer> slots) {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .onSnapshotApplied(header, slots);
+ }
+
+ @Override
+ public int getDeviceCount(RaftNode header, List<String> pathsToQuery) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .getDeviceCount(header, pathsToQuery);
+ }
+
+ @Override
+ public HeartBeatResponse sendHeartbeat(HeartBeatRequest request) {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .sendHeartbeat(request);
+ }
+
+ @Override
+ public long startElection(ElectionRequest request) {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .startElection(request);
+ }
+
+ @Override
- public long appendEntries(AppendEntriesRequest request) throws TException {
++ public AppendEntryResult appendEntries(AppendEntriesRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .appendEntries(request);
+ }
+
+ @Override
- public long appendEntry(AppendEntryRequest request) throws TException {
++ public AppendEntryResult appendEntry(AppendEntryRequest request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .appendEntry(request);
+ }
+
+ @Override
+ public void sendSnapshot(SendSnapshotRequest request) throws TException {
+ DataGroupEngine.getInstance().getDataSyncService(request.getHeader()).sendSnapshot(request);
+ }
+
+ @Override
+ public TSStatus executeNonQueryPlan(ExecutNonQueryReq request) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(request.getHeader())
+ .executeNonQueryPlan(request);
+ }
+
+ @Override
+ public RequestCommitIndexResponse requestCommitIndex(RaftNode header) throws TException {
+ return DataGroupEngine.getInstance().getDataSyncService(header).requestCommitIndex(header);
+ }
+
+ @Override
+ public ByteBuffer readFile(String filePath, long offset, int length) throws TException {
+ try {
+ return IOUtils.readFile(filePath, offset, length);
+ } catch (IOException e) {
+ throw new TException(e);
+ }
+ }
+
+ @Override
+ public boolean matchTerm(long index, long term, RaftNode header) {
+ return DataGroupEngine.getInstance().getDataSyncService(header).matchTerm(index, term, header);
+ }
+
+ @Override
+ public ByteBuffer peekNextNotNullValue(
+ RaftNode header, long executorId, long startTime, long endTime) throws TException {
+ return DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .peekNextNotNullValue(header, executorId, startTime, endTime);
+ }
+
+ @Override
+ public void peekNextNotNullValue(
+ RaftNode header,
+ long executorId,
+ long startTime,
+ long endTime,
+ AsyncMethodCallback<ByteBuffer> resultHandler)
+ throws TException {
+ resultHandler.onComplete(
+ DataGroupEngine.getInstance()
+ .getDataSyncService(header)
+ .peekNextNotNullValue(header, executorId, startTime, endTime));
+ }
+
+ @Override
+ public void removeHardLink(String hardLinkPath) throws TException {
+ try {
+ Files.deleteIfExists(new File(hardLinkPath).toPath());
+ } catch (IOException e) {
+ throw new TException(e);
+ }
+ }
+
+ @Override
+ public void removeHardLink(String hardLinkPath, AsyncMethodCallback<Void> resultHandler) {
+ try {
+ Files.deleteIfExists(new File(hardLinkPath).toPath());
+ resultHandler.onComplete(null);
+ } catch (IOException e) {
+ resultHandler.onError(e);
+ }
+ }
++
++ @Override
++ public AppendEntryResult appendEntryIndirect(AppendEntryRequest request, List<Node> subReceivers)
++ throws TException {
++ return DataGroupEngine.getInstance()
++ .getDataSyncService(request.getHeader())
++ .appendEntryIndirect(request, subReceivers);
++ }
++
++ @Override
++ public void acknowledgeAppendEntry(AppendEntryResult ack) {
++ DataGroupEngine.getInstance().getDataSyncService(ack.getHeader()).acknowledgeAppendEntry(ack);
++ }
++
++ @Override
++ public void appendEntryIndirect(
++ AppendEntryRequest request,
++ List<Node> subReceivers,
++ AsyncMethodCallback<AppendEntryResult> resultHandler) {
++ DataGroupEngine.getInstance()
++ .getDataAsyncService(request.getHeader(), resultHandler, request)
++ .appendEntryIndirect(request, subReceivers, resultHandler);
++ }
++
++ @Override
++ public void acknowledgeAppendEntry(
++ AppendEntryResult ack, AsyncMethodCallback<Void> resultHandler) {
++ DataGroupEngine.getInstance()
++ .getDataAsyncService(ack.getHeader(), resultHandler, ack)
++ .acknowledgeAppendEntry(ack, resultHandler);
++ }
+ }
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
index 4f547a3,659f953..878528b
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaAsyncService.java
@@@ -25,9 -25,9 +25,11 @@@ import org.apache.iotdb.cluster.excepti
import org.apache.iotdb.cluster.exception.LeaderUnknownException;
import org.apache.iotdb.cluster.exception.LogExecutionException;
import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
++import org.apache.iotdb.cluster.exception.UnknownLogTypeException;
import org.apache.iotdb.cluster.log.logtypes.RemoveNodeLog;
import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
++import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
import org.apache.iotdb.cluster.rpc.thrift.CheckStatusResponse;
import org.apache.iotdb.cluster.rpc.thrift.Node;
import org.apache.iotdb.cluster.rpc.thrift.SendSnapshotRequest;
@@@ -45,9 -45,9 +47,10 @@@ import org.slf4j.Logger
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
++import java.util.List;
public class MetaAsyncService extends BaseAsyncService implements TSMetaService.AsyncIface {
-
+ private static final String ERROR_MSG_META_NOT_READY = "The metadata not is not ready.";
private static final Logger logger = LoggerFactory.getLogger(MetaAsyncService.class);
private MetaGroupMember metaGroupMember;
@@@ -236,4 -252,4 +255,23 @@@
metaGroupMember.handleHandshake(sender);
resultHandler.onComplete(null);
}
++
++ @Override
++ public void appendEntryIndirect(
++ AppendEntryRequest request,
++ List<Node> subReceivers,
++ AsyncMethodCallback<AppendEntryResult> resultHandler) {
++ try {
++ resultHandler.onComplete(metaGroupMember.appendEntryIndirect(request, subReceivers));
++ } catch (UnknownLogTypeException e) {
++ resultHandler.onError(e);
++ }
++ }
++
++ @Override
++ public void acknowledgeAppendEntry(
++ AppendEntryResult ack, AsyncMethodCallback<Void> resultHandler) {
++ metaGroupMember.acknowledgeAppendLog(ack);
++ resultHandler.onComplete(null);
++ }
}
diff --cc cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
index 204c45a,f52b7c8..93a0ba6
--- a/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
+++ b/cluster/src/main/java/org/apache/iotdb/cluster/server/service/MetaSyncService.java
@@@ -26,6 -26,6 +26,7 @@@ import org.apache.iotdb.cluster.excepti
import org.apache.iotdb.cluster.exception.LeaderUnknownException;
import org.apache.iotdb.cluster.exception.LogExecutionException;
import org.apache.iotdb.cluster.exception.PartitionTableUnavailableException;
++import org.apache.iotdb.cluster.exception.UnknownLogTypeException;
import org.apache.iotdb.cluster.log.logtypes.RemoveNodeLog;
import org.apache.iotdb.cluster.rpc.thrift.AddNodeResponse;
import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
@@@ -47,6 -46,6 +48,7 @@@ import org.slf4j.Logger
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
++import java.util.List;
public class MetaSyncService extends BaseSyncService implements TSMetaService.Iface {
@@@ -59,12 -58,23 +61,23 @@@
this.metaGroupMember = metaGroupMember;
}
+ // behavior of followers
@Override
- public long appendEntry(AppendEntryRequest request) throws TException {
+ public AppendEntryResult appendEntry(AppendEntryRequest request) throws TException {
- if (metaGroupMember.getPartitionTable() == null) {
- // this node lacks information of the cluster and refuse to work
- logger.debug("This node is blind to the cluster and cannot accept logs");
- return new AppendEntryResult(Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE);
+ // if the metaGroupMember is not ready (e.g., as a follower the PartitionTable is loaded
+ // locally, but the partition table is not verified), we do not handle the RPC requests.
+ if (!metaGroupMember.isReady()) {
+ // the only special case is that the leader will send an empty entry for letting followers
+ // submit previous log
+ // at this time, the partitionTable has been loaded but is not verified. So the PRC is not
+ // ready.
+ if (metaGroupMember.getPartitionTable() == null) {
+ // this node lacks information of the cluster and refuse to work
+ logger.debug("This node is blind to the cluster and cannot accept logs, {}", request);
- return Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE;
++ return new AppendEntryResult(Response.RESPONSE_PARTITION_TABLE_UNAVAILABLE);
+ } else {
+ // do nothing because we consider if the partitionTable is loaded, then it is corrected.
+ }
}
return super.appendEntry(request);
@@@ -226,4 -250,4 +253,19 @@@
public void handshake(Node sender) {
metaGroupMember.handleHandshake(sender);
}
++
++ @Override
++ public AppendEntryResult appendEntryIndirect(AppendEntryRequest request, List<Node> subReceivers)
++ throws TException {
++ try {
++ return metaGroupMember.appendEntryIndirect(request, subReceivers);
++ } catch (UnknownLogTypeException e) {
++ throw new TException(e);
++ }
++ }
++
++ @Override
++ public void acknowledgeAppendEntry(AppendEntryResult ack) {
++ metaGroupMember.acknowledgeAppendLog(ack);
++ }
}
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
index b6762aa,1303df1..9d65020
--- a/cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/common/TestAsyncDataClient.java
@@@ -19,9 -19,9 +19,10 @@@
package org.apache.iotdb.cluster.common;
+ import org.apache.iotdb.cluster.client.ClientCategory;
import org.apache.iotdb.cluster.client.async.AsyncDataClient;
import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
+import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
import org.apache.iotdb.cluster.rpc.thrift.ElectionRequest;
import org.apache.iotdb.cluster.rpc.thrift.ExecutNonQueryReq;
import org.apache.iotdb.cluster.rpc.thrift.GetAggrResultRequest;
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
index b5a984b,e468560..14eac19
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/handlers/caller/AppendGroupEntryHandlerTest.java
@@@ -25,9 -25,9 +25,10 @@@ import org.apache.iotdb.cluster.common.
import org.apache.iotdb.cluster.common.TestUtils;
import org.apache.iotdb.cluster.config.ClusterDescriptor;
import org.apache.iotdb.cluster.log.Log;
+import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
import org.apache.iotdb.cluster.server.Response;
import org.apache.iotdb.cluster.server.member.RaftMember;
+ import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.utils.EnvironmentUtils;
import org.junit.After;
diff --cc cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
index 406113b,d6ad1b7..9b5b6b8
--- a/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
+++ b/cluster/src/test/java/org/apache/iotdb/cluster/server/member/BaseMember.java
@@@ -40,9 -43,9 +43,10 @@@ import org.apache.iotdb.cluster.partiti
import org.apache.iotdb.cluster.partition.PartitionTable;
import org.apache.iotdb.cluster.partition.slot.SlotPartitionTable;
import org.apache.iotdb.cluster.rpc.thrift.AppendEntryRequest;
+import org.apache.iotdb.cluster.rpc.thrift.AppendEntryResult;
import org.apache.iotdb.cluster.rpc.thrift.Node;
import org.apache.iotdb.cluster.rpc.thrift.RaftNode;
+ import org.apache.iotdb.cluster.rpc.thrift.RaftService;
import org.apache.iotdb.cluster.rpc.thrift.RaftService.AsyncClient;
import org.apache.iotdb.cluster.rpc.thrift.TNodeStatus;
import org.apache.iotdb.cluster.server.NodeCharacter;
diff --cc server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
index 8e03bae,86c7227..276ca36
--- a/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/logical/Operator.java
@@@ -173,9 -173,10 +173,11 @@@ public abstract class Operator
SHOW_CONTINUOUS_QUERIES,
SET_SYSTEM_MODE,
+ EMPTY,
SETTLE,
- UNSET_SCHEMA_TEMPLATE
+ UNSET_TEMPLATE,
+ PRUNE_TEMPLATE,
+ APPEND_TEMPLATE
}
}
diff --cc server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
index 464d9cf,f77021a..33f1ca7
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/PhysicalPlan.java
@@@ -488,9 -538,10 +542,11 @@@ public abstract class PhysicalPlan
CREATE_FUNCTION,
DROP_FUNCTION,
SELECT_INTO,
+ DUMMY,
SET_SYSTEM_MODE,
- UNSET_SCHEMA_TEMPLATE
+ UNSET_TEMPLATE,
+ APPEND_TEMPLATE,
+ PRUNE_TEMPLATE
}
public long getIndex() {
diff --cc server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
index 58010c9,0000000..67f7637
mode 100644,000000..100644
--- a/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
+++ b/server/src/main/java/org/apache/iotdb/db/qp/physical/sys/DummyPlan.java
@@@ -1,94 -1,0 +1,95 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.db.qp.physical.sys;
+
+import org.apache.iotdb.db.exception.metadata.IllegalPathException;
- import org.apache.iotdb.db.metadata.PartialPath;
++import org.apache.iotdb.db.metadata.path.PartialPath;
+import org.apache.iotdb.db.qp.logical.Operator.OperatorType;
+import org.apache.iotdb.db.qp.physical.PhysicalPlan;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.nio.ByteBuffer;
++import java.util.Collections;
+import java.util.List;
+
+public class DummyPlan extends PhysicalPlan {
+
+ private byte[] workload;
+ private boolean needForward;
+
+ public DummyPlan() {
+ super(false, OperatorType.EMPTY);
+ }
+
+ @Override
+ public List<PartialPath> getPaths() {
- return null;
++ return Collections.emptyList();
+ }
+
+ @Override
+ public void serialize(DataOutputStream stream) throws IOException {
+ stream.write((byte) PhysicalPlanType.DUMMY.ordinal());
+ stream.writeInt(workload == null ? 0 : workload.length);
+ if (workload != null) {
+ stream.write(workload);
+ }
+ stream.write(needForward ? 1 : 0);
+ }
+
+ @Override
+ public void serialize(ByteBuffer buffer) {
+ buffer.put((byte) PhysicalPlanType.DUMMY.ordinal());
+ buffer.putInt(workload == null ? 0 : workload.length);
+ if (workload != null) {
+ buffer.put(workload);
+ }
+ buffer.put(needForward ? (byte) 1 : 0);
+ }
+
+ @Override
+ public void deserialize(ByteBuffer buffer) throws IllegalPathException {
+ int size = buffer.getInt();
+ workload = new byte[size];
+ buffer.get(workload);
+ needForward = buffer.get() == 1;
+ }
+
+ public void setWorkload(byte[] workload) {
+ this.workload = workload;
+ }
+
+ public boolean isNeedForward() {
+ return needForward;
+ }
+
+ public void setNeedForward(boolean needForward) {
+ this.needForward = needForward;
+ }
+
+ public byte[] getWorkload() {
+ return workload;
+ }
+
+ @Override
+ public String toString() {
+ return "ExprPlan";
+ }
+}
diff --cc thrift-cluster/src/main/thrift/cluster.thrift
index 74f670c,1bbd9e3..64914ba
--- a/thrift-cluster/src/main/thrift/cluster.thrift
+++ b/thrift-cluster/src/main/thrift/cluster.thrift
@@@ -88,18 -88,8 +88,12 @@@ struct AppendEntryRequest
// because a data server may play many data groups members, this is used to identify which
// member should process the request or response. Only used in data group communication.
7: optional RaftNode header
+ // true if the request is sent from the leader, and the reiceiver just responds to the sender;
+ // otherwise, the reiceiver should also notify the leader
+ 8: optional bool isFromLeader
}
+
- struct AppendEntryAcknowledgement {
- 1: required long term
- 2: required long index
- 3: required long response
- }
-
// leader -> follower
struct AppendEntriesRequest {
1: required long term // leader's
@@@ -273,17 -263,11 +267,18 @@@ struct LastQueryRequest
}
struct GetAllPathsResult {
- 1: required list<list<string>> paths
- 2: optional list<string> aliasList
+ 1: required list<string> paths
+ 2: required list<byte> dataTypes
+ 3: optional list<string> aliasList
}
+struct AppendEntryResult {
+ 1: required i64 status;
+ 2: optional i64 lastLogTerm;
+ 3: optional i64 lastLogIndex;
+ 4: optional RaftNode header;
+}
+
service RaftService {
/**