Skip to content

Commit 522c31c

Browse files
authored
Display data partition repair progress by providing a new SQL statement (#17637)
1 parent 3b7df25 commit 522c31c

30 files changed

Lines changed: 610 additions & 38 deletions

File tree

‎integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/DataPartitionTableIntegrityCheckProcedureIT.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package org.apache.iotdb.confignode.it.partition;
2121

22+
import org.apache.iotdb.commons.enums.RepairDataPartitionTableProgressState;
2223
import org.apache.iotdb.it.env.EnvFactory;
2324
import org.apache.iotdb.it.framework.IoTDBTestRunner;
2425
import org.apache.iotdb.itbase.category.ClusterIT;
@@ -34,6 +35,7 @@
3435
import org.slf4j.LoggerFactory;
3536

3637
import java.sql.Connection;
38+
import java.sql.ResultSet;
3739
import java.sql.SQLException;
3840
import java.sql.Statement;
3941
import java.util.ArrayList;
@@ -128,4 +130,38 @@ public void testConcurrentSubmitDataPartitionTableIntegrityCheckProcedure()
128130
Assert.assertEquals(
129131
"The other concurrent submissions should be rejected", threadCount - 1, failCount.get());
130132
}
133+
134+
@Test
135+
public void testShowRepairDataPartitionTableProgress() throws Exception {
136+
try (final Connection connection = EnvFactory.getEnv().getConnection();
137+
final Statement statement = connection.createStatement()) {
138+
assertRepairProgress(statement, RepairDataPartitionTableProgressState.IDLE.name(), 0.0, 0.0);
139+
140+
statement.execute("REPAIR DATA PARTITION TABLE");
141+
assertRepairProgress(statement, null, 0.0, 100.0);
142+
}
143+
}
144+
145+
private static void assertRepairProgress(
146+
final Statement statement,
147+
final String expectedStatus,
148+
final double minProgress,
149+
final double maxProgress)
150+
throws SQLException {
151+
try (final ResultSet resultSet =
152+
statement.executeQuery("SHOW REPAIR DATA PARTITION TABLE PROGRESS")) {
153+
Assert.assertTrue(resultSet.next());
154+
if (expectedStatus != null) {
155+
Assert.assertEquals(expectedStatus, resultSet.getString("Status"));
156+
} else {
157+
Assert.assertNotEquals(
158+
RepairDataPartitionTableProgressState.UNKNOWN.name(), resultSet.getString("Status"));
159+
}
160+
final double progress = resultSet.getDouble("Progress(%)");
161+
Assert.assertTrue(progress >= minProgress);
162+
Assert.assertTrue(progress <= maxProgress);
163+
Assert.assertNotNull(resultSet.getString("Message"));
164+
Assert.assertFalse(resultSet.next());
165+
}
166+
}
131167
}

‎iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ keyWords
189189
| PRIVILEGES
190190
| PRIVILEGE_VALUE
191191
| PROCESSLIST
192+
| PROGRESS
192193
| PROCESSOR
193194
| PROPERTY
194195
| PRUNE
@@ -298,4 +299,4 @@ keyWords
298299
| OPTION
299300
| INF
300301
| CURRENT_TIMESTAMP
301-
;
302+
;

‎iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4‎

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ utilityStatement
9696
| showQueries | showDiskUsage | showCurrentTimestamp | killQuery | grantWatermarkEmbedding
9797
| revokeWatermarkEmbedding | loadConfiguration | loadTimeseries | loadFile
9898
| removeFile | unloadFile | setSqlDialect | showCurrentSqlDialect | showCurrentUser
99-
| repairDataPartitionTable
99+
| repairDataPartitionTable | showRepairDataPartitionTableProgress
100100
;
101101

102102
/**
@@ -1283,6 +1283,11 @@ repairDataPartitionTable
12831283
: REPAIR DATA PARTITION TABLE
12841284
;
12851285

1286+
// Show Repair Data Partition Table Progress
1287+
showRepairDataPartitionTableProgress
1288+
: SHOW REPAIR DATA PARTITION TABLE PROGRESS
1289+
;
1290+
12861291
// Explain
12871292
explain
12881293
: EXPLAIN (ANALYZE VERBOSE?)? selectStatement?

‎iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,10 @@ REPAIR
12151215
: R E P A I R
12161216
;
12171217

1218+
PROGRESS
1219+
: P R O G R E S S
1220+
;
1221+
12181222
SCHEMA_REPLICATION_FACTOR
12191223
: S C H E M A '_' R E P L I C A T I O N '_' F A C T O R
12201224
;
@@ -1411,4 +1415,4 @@ fragment V: [vV];
14111415
fragment W: [wW];
14121416
fragment X: [xX];
14131417
fragment Y: [yY];
1414-
fragment Z: [zZ];
1418+
fragment Z: [zZ];

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public enum CnToDnSyncRequestType {
4141
COLLECT_EARLIEST_TIMESLOTS,
4242
GENERATE_DATA_PARTITION_TABLE,
4343
GENERATE_DATA_PARTITION_TABLE_HEART_BEAT,
44+
GET_DATA_PARTITION_TABLE_GENERATOR_PROGRESS,
4445

4546
// PartitionCache
4647
INVALIDATE_PARTITION_CACHE,

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ private void buildActionMap() {
151151
CnToDnSyncRequestType.GENERATE_DATA_PARTITION_TABLE_HEART_BEAT,
152152
(req, client) ->
153153
client.generateDataPartitionTableHeartbeat((TGenerateDataPartitionTableReq) req));
154+
actionMapBuilder.put(
155+
CnToDnSyncRequestType.GET_DATA_PARTITION_TABLE_GENERATOR_PROGRESS,
156+
(req, client) -> client.getDataPartitionTableGeneratorProgress());
154157
actionMap = actionMapBuilder.build();
155158
}
156159

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.apache.iotdb.commons.conf.ConfigurationFileUtils;
4848
import org.apache.iotdb.commons.conf.IoTDBConstant;
4949
import org.apache.iotdb.commons.conf.TrimProperties;
50+
import org.apache.iotdb.commons.enums.RepairDataPartitionTableProgressState;
5051
import org.apache.iotdb.commons.exception.IllegalPathException;
5152
import org.apache.iotdb.commons.exception.MetadataException;
5253
import org.apache.iotdb.commons.path.MeasurementPath;
@@ -238,6 +239,7 @@
238239
import org.apache.iotdb.confignode.rpc.thrift.TShowPipePluginReq;
239240
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeReq;
240241
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeResp;
242+
import org.apache.iotdb.confignode.rpc.thrift.TShowRepairDataPartitionTableProgressResp;
241243
import org.apache.iotdb.confignode.rpc.thrift.TShowSubscriptionReq;
242244
import org.apache.iotdb.confignode.rpc.thrift.TShowSubscriptionResp;
243245
import org.apache.iotdb.confignode.rpc.thrift.TShowTable4InformationSchemaResp;
@@ -1180,6 +1182,18 @@ public TSStatus dataPartitionTableIntegrityCheck() {
11801182
return partitionManager.dataPartitionTableIntegrityCheck();
11811183
}
11821184

1185+
@Override
1186+
public TShowRepairDataPartitionTableProgressResp showRepairDataPartitionTableProgress() {
1187+
TSStatus status = confirmLeader();
1188+
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
1189+
return new TShowRepairDataPartitionTableProgressResp(
1190+
status, RepairDataPartitionTableProgressState.UNKNOWN.name(), 0.0)
1191+
.setMessage(status.getMessage());
1192+
}
1193+
1194+
return partitionManager.showRepairDataPartitionTableProgress();
1195+
}
1196+
11831197
private void printNewCreatedDataPartition(
11841198
GetOrCreateDataPartitionPlan getOrCreateDataPartitionPlan, TDataPartitionTableResp resp) {
11851199
final String lineSeparator = System.lineSeparator();

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
import org.apache.iotdb.confignode.rpc.thrift.TShowPipePluginReq;
154154
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeReq;
155155
import org.apache.iotdb.confignode.rpc.thrift.TShowPipeResp;
156+
import org.apache.iotdb.confignode.rpc.thrift.TShowRepairDataPartitionTableProgressResp;
156157
import org.apache.iotdb.confignode.rpc.thrift.TShowSubscriptionReq;
157158
import org.apache.iotdb.confignode.rpc.thrift.TShowSubscriptionResp;
158159
import org.apache.iotdb.confignode.rpc.thrift.TShowTable4InformationSchemaResp;
@@ -480,6 +481,8 @@ TDataPartitionTableResp getOrCreateDataPartition(
480481

481482
TSStatus dataPartitionTableIntegrityCheck();
482483

484+
TShowRepairDataPartitionTableProgressResp showRepairDataPartitionTableProgress();
485+
483486
/**
484487
* Get AuditLogger.
485488
*

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ProcedureManager.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import org.apache.iotdb.confignode.procedure.impl.node.RemoveAINodeProcedure;
7171
import org.apache.iotdb.confignode.procedure.impl.node.RemoveConfigNodeProcedure;
7272
import org.apache.iotdb.confignode.procedure.impl.node.RemoveDataNodesProcedure;
73+
import org.apache.iotdb.confignode.procedure.impl.partition.DataPartitionTableIntegrityCheckProcedure;
7374
import org.apache.iotdb.confignode.procedure.impl.pipe.plugin.CreatePipePluginProcedure;
7475
import org.apache.iotdb.confignode.procedure.impl.pipe.plugin.DropPipePluginProcedure;
7576
import org.apache.iotdb.confignode.procedure.impl.pipe.runtime.PipeHandleLeaderChangeProcedure;
@@ -2539,6 +2540,18 @@ public boolean isExistUnfinishedProcedure(
25392540
return false;
25402541
}
25412542

2543+
public Optional<DataPartitionTableIntegrityCheckProcedure>
2544+
getUnfinishedDataPartitionTableIntegrityCheckProcedure() {
2545+
for (Procedure<ConfigNodeProcedureEnv> procedure : getExecutor().getProcedures().values()) {
2546+
if (!procedure.isFinished()
2547+
&& procedure instanceof DataPartitionTableIntegrityCheckProcedure) {
2548+
return Optional.of((DataPartitionTableIntegrityCheckProcedure) procedure);
2549+
}
2550+
}
2551+
2552+
return Optional.empty();
2553+
}
2554+
25422555
// ======================================================
25432556
/*
25442557
GET-SET Region

‎iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.iotdb.commons.concurrent.threadpool.ScheduledExecutorUtil;
3333
import org.apache.iotdb.commons.conf.CommonConfig;
3434
import org.apache.iotdb.commons.conf.CommonDescriptor;
35+
import org.apache.iotdb.commons.enums.RepairDataPartitionTableProgressState;
3536
import org.apache.iotdb.commons.partition.DataPartitionTable;
3637
import org.apache.iotdb.commons.partition.SchemaPartitionTable;
3738
import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor;
@@ -88,6 +89,7 @@
8889
import org.apache.iotdb.confignode.rpc.thrift.TGetRegionIdReq;
8990
import org.apache.iotdb.confignode.rpc.thrift.TGetSeriesSlotListReq;
9091
import org.apache.iotdb.confignode.rpc.thrift.TGetTimeSlotListReq;
92+
import org.apache.iotdb.confignode.rpc.thrift.TShowRepairDataPartitionTableProgressResp;
9193
import org.apache.iotdb.confignode.rpc.thrift.TTimeSlotList;
9294
import org.apache.iotdb.consensus.exception.ConsensusException;
9395
import org.apache.iotdb.mpp.rpc.thrift.TCreateDataRegionReq;
@@ -538,6 +540,20 @@ public void markDataPartitionTableIntegrityCheckProcedureFinished() {
538540
dataPartitionTableIntegrityCheckProcedureRunning.set(false);
539541
}
540542

543+
public TShowRepairDataPartitionTableProgressResp showRepairDataPartitionTableProgress() {
544+
return configManager
545+
.getProcedureManager()
546+
.getUnfinishedDataPartitionTableIntegrityCheckProcedure()
547+
.map(DataPartitionTableIntegrityCheckProcedure::getProgress)
548+
.orElseGet(
549+
() ->
550+
new TShowRepairDataPartitionTableProgressResp(
551+
RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS),
552+
RepairDataPartitionTableProgressState.IDLE.name(),
553+
0.0)
554+
.setMessage("No running DataPartitionTable integrity check procedure"));
555+
}
556+
541557
private TSStatus consensusWritePartitionResult(ConfigPhysicalPlan plan) {
542558
TSStatus status = getConsensusManager().confirmLeader();
543559
if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {

0 commit comments

Comments
 (0)