Skip to content

Commit e9584ec

Browse files
authored
Pipe: Fixed the remaining correctness bug for PR 17661 && the replication configuration of IoTDBPipeReceiverAutoCreateDisabledIT (#17678)
* Update IoTDBPipeReceiverAutoCreateDisabledIT.java * Fix * Update IoTDBPipeReceiverAutoCreateDisabledIT.java * Update IoTDBDataNodeReceiver.java * Update IoTDBDataNodeReceiver.java * Fix
1 parent da7056f commit e9584ec

5 files changed

Lines changed: 52 additions & 21 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/basic/IoTDBPipeReceiverAutoCreateDisabledIT.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,17 @@ public void setUp() {
5757
@Override
5858
protected void setupConfig() {
5959
super.setupConfig();
60-
receiverEnv.getConfig().getCommonConfig().setAutoCreateSchemaEnabled(false);
60+
senderEnv
61+
.getConfig()
62+
.getCommonConfig()
63+
.setDataReplicationFactor(1)
64+
.setSchemaReplicationFactor(1);
65+
receiverEnv
66+
.getConfig()
67+
.getCommonConfig()
68+
.setAutoCreateSchemaEnabled(false)
69+
.setDataReplicationFactor(1)
70+
.setSchemaReplicationFactor(1);
6171
}
6272

6373
@Test
@@ -69,10 +79,12 @@ public void testReceiverAutoCreateSchemaDisabledWithSpecialTimeSeries() throws E
6979

7080
final String createPipeSql =
7181
String.format(
72-
"create pipe test with source ('inclusion'='all','source.realtime.mode'='stream','source.realtime.enable'='true') "
82+
"create pipe test with source ('inclusion'='all') "
7383
+ "with sink ('sink'='iotdb-thrift-sink', 'sink.node-urls'='%s');",
7484
receiverEnv.getDataNodeWrapper(0).getIpAndPortString());
7585
final String createDatabaseSql = "create database root.test.sg;";
86+
final String createSecondDatabaseSql =
87+
"create database root.test.ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz1;";
7688
final String createFirstTimeSeriesSql =
7789
"create timeseries root.test.sg.`1~!@#$%^&*()_+=:'\"/|[]{}`.`~!@#$%^&*()_+=:'\"/|[]{}` float;";
7890
final String insertFirstSql =
@@ -95,6 +107,7 @@ public void testReceiverAutoCreateSchemaDisabledWithSpecialTimeSeries() throws E
95107
statement.execute(createFirstTimeSeriesSql);
96108
statement.execute(insertFirstSql);
97109
final QueryResult firstQueryResult = queryForResult(statement, firstSelectSql);
110+
statement.execute(createSecondDatabaseSql);
98111
statement.execute(createSecondTimeSeriesSql);
99112
statement.execute(insertSecondSql);
100113
final QueryResult secondQueryResult = queryForResult(statement, secondSelectSql);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -871,9 +871,11 @@ private TSStatus executeStatementWithPermissionCheckAndRetryOnDataTypeMismatch(
871871
// Judge which model the statement belongs to
872872
final boolean isTableModelStatement;
873873
final String databaseName;
874-
if (statement instanceof LoadTsFileStatement
875-
&& ((LoadTsFileStatement) statement).getDatabase() != null) {
876-
isTableModelStatement = true;
874+
if (statement instanceof LoadTsFileStatement) {
875+
// Pipe receiver always constructs a tree-model LoadTsFileStatement. Its database field is
876+
// only an explicit database hint for table data or pipe-generated tree-model loads, so it
877+
// must not be used to route execution into the table-model pipeline.
878+
isTableModelStatement = false;
877879
databaseName = ((LoadTsFileStatement) statement).getDatabase();
878880
} else if (statement instanceof InsertBaseStatement
879881
&& ((InsertBaseStatement) statement).isWriteToTable()) {
@@ -925,18 +927,34 @@ private TSStatus executeStatementWithPermissionCheckAndRetryOnDataTypeMismatch(
925927

926928
// Try to convert data type if the statement is a tree model statement
927929
// and the status code is not success
928-
return shouldConvertDataTypeOnTypeMismatch
929-
&& ((statement instanceof InsertBaseStatement
930-
&& ((InsertBaseStatement) statement).hasFailedMeasurements())
931-
|| (status.getCode() != TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()
932-
&& status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()))
933-
? (isTableModelStatement
934-
? statement
935-
.accept(
936-
tableStatementDataTypeConvertExecutionVisitor, new Pair<>(status, databaseName))
937-
.orElse(status)
938-
: statement.accept(treeStatementDataTypeConvertExecutionVisitor, status).orElse(status))
939-
: status;
930+
if (!shouldConvertDataTypeOnTypeMismatch
931+
|| !((statement instanceof InsertBaseStatement
932+
&& ((InsertBaseStatement) statement).hasFailedMeasurements())
933+
|| (status.getCode() != TSStatusCode.REDIRECTION_RECOMMEND.getStatusCode()
934+
&& status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()))) {
935+
return status;
936+
}
937+
938+
if (statement instanceof LoadTsFileStatement
939+
&& shouldUseTableModelVisitorForLoadStatement((LoadTsFileStatement) statement)) {
940+
return statement
941+
.accept(tableStatementDataTypeConvertExecutionVisitor, new Pair<>(status, databaseName))
942+
.orElse(status);
943+
}
944+
945+
return isTableModelStatement
946+
? statement
947+
.accept(tableStatementDataTypeConvertExecutionVisitor, new Pair<>(status, databaseName))
948+
.orElse(status)
949+
: statement.accept(treeStatementDataTypeConvertExecutionVisitor, status).orElse(status);
950+
}
951+
952+
private boolean shouldUseTableModelVisitorForLoadStatement(
953+
final LoadTsFileStatement loadTsFileStatement) {
954+
final List<Boolean> isTableModel = loadTsFileStatement.getIsTableModel();
955+
return Objects.nonNull(isTableModel)
956+
&& !isTableModel.isEmpty()
957+
&& isTableModel.stream().allMatch(Boolean.TRUE::equals);
940958
}
941959

942960
@Override

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/airgap/IoTDBDataRegionAirGapSink.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ private void doTransfer(
341341
tsFile.length(),
342342
pipeTsFileInsertionEvent.isTableModelEvent()
343343
? pipeTsFileInsertionEvent.getTableModelDatabaseName()
344-
: null))) {
344+
: pipeTsFileInsertionEvent.getTreeModelDatabaseName()))) {
345345
receiverStatusHandler.handle(
346346
new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode())
347347
.setMessage(errorMessage),
@@ -362,7 +362,7 @@ private void doTransfer(
362362
tsFile.length(),
363363
pipeTsFileInsertionEvent.isTableModelEvent()
364364
? pipeTsFileInsertionEvent.getTableModelDatabaseName()
365-
: null))) {
365+
: pipeTsFileInsertionEvent.getTreeModelDatabaseName()))) {
366366
receiverStatusHandler.handle(
367367
new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode())
368368
.setMessage(errorMessage),

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/async/IoTDBDataRegionAsyncSink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ private boolean transferWithoutCheck(final TsFileInsertionEvent tsFileInsertionE
423423
&& clientManager.supportModsIfIsDataNodeReceiver(),
424424
pipeTsFileInsertionEvent.isTableModelEvent()
425425
? pipeTsFileInsertionEvent.getTableModelDatabaseName()
426-
: null);
426+
: pipeTsFileInsertionEvent.getTreeModelDatabaseName());
427427

428428
transfer(pipeTransferTsFileHandler);
429429
return true;

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/sink/protocol/thrift/sync/IoTDBDataRegionSyncSink.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@ private void doTransferWrapper(final PipeTsFileInsertionEvent pipeTsFileInsertio
499499
pipeTsFileInsertionEvent.isWithMod() ? pipeTsFileInsertionEvent.getModFile() : null,
500500
pipeTsFileInsertionEvent.isTableModelEvent()
501501
? pipeTsFileInsertionEvent.getTableModelDatabaseName()
502-
: null);
502+
: pipeTsFileInsertionEvent.getTreeModelDatabaseName());
503503
} finally {
504504
pipeTsFileInsertionEvent.decreaseReferenceCount(
505505
IoTDBDataRegionSyncSink.class.getName(), false);

0 commit comments

Comments
 (0)