Skip to content

Commit dcd0c6a

Browse files
CaideyipiJackieTien97
authored andcommitted
Fix pipe schema snapshot database creation (#17910)
* Fix pipe schema snapshot database creation * Fix legacy pipe receiver database conflict handling * Fix pipe enriched config statement execution
1 parent a1286fc commit dcd0c6a

3 files changed

Lines changed: 51 additions & 8 deletions

File tree

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/legacy/IoTDBLegacyPipeReceiverAgent.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,7 @@ private boolean registerDatabase(
172172
false,
173173
false);
174174
if (result.status.code != TSStatusCode.SUCCESS_STATUS.getStatusCode()
175-
&& result.status.code != TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()
176-
&& result.status.code != TSStatusCode.DATABASE_CONFLICT.getStatusCode()) {
175+
&& result.status.code != TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()) {
177176
LOGGER.error(
178177
DataNodePipeMessages.CREATE_DATABASE_ERROR_STATEMENT_RESULT_STATUS,
179178
statement,

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferFileSealReqV2;
4646
import org.apache.iotdb.commons.pipe.sink.payload.thrift.request.PipeTransferSliceReq;
4747
import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
48+
import org.apache.iotdb.commons.utils.PathUtils;
4849
import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema;
4950
import org.apache.iotdb.db.auth.AuthorityChecker;
5051
import org.apache.iotdb.db.conf.IoTDBConfig;
@@ -101,6 +102,7 @@
101102
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowsStatement;
102103
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement;
103104
import org.apache.iotdb.db.queryengine.plan.statement.crud.LoadTsFileStatement;
105+
import org.apache.iotdb.db.queryengine.plan.statement.metadata.DatabaseSchemaStatement;
104106
import org.apache.iotdb.db.queryengine.plan.statement.pipe.PipeEnrichedStatement;
105107
import org.apache.iotdb.db.schemaengine.table.DataNodeTableCache;
106108
import org.apache.iotdb.db.storageengine.load.active.ActiveLoadPathHelper;
@@ -625,8 +627,16 @@ static LoadTsFileStatement buildLoadTsFileStatementForSync(
625627
private TSStatus loadSchemaSnapShot(
626628
final Map<String, String> parameters, final List<String> fileAbsolutePaths)
627629
throws IllegalPathException, IOException {
628-
final PartialPath databasePath =
629-
PartialPath.getQualifiedDatabasePartialPath(parameters.get(ColumnHeaderConstant.DATABASE));
630+
final String databaseName = parameters.get(ColumnHeaderConstant.DATABASE);
631+
final PartialPath databasePath = PartialPath.getQualifiedDatabasePartialPath(databaseName);
632+
633+
if (!PathUtils.isTableModelDatabase(databaseName)) {
634+
final TSStatus createDatabaseStatus = createSchemaSnapshotDatabaseIfNecessary(databasePath);
635+
if (createDatabaseStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
636+
return createDatabaseStatus;
637+
}
638+
}
639+
630640
final SRStatementGenerator generator =
631641
SchemaRegionSnapshotParser.translate2Statements(
632642
Paths.get(fileAbsolutePaths.get(0)),
@@ -697,6 +707,33 @@ private TSStatus loadSchemaSnapShot(
697707
return PipeReceiverStatusHandler.getPriorStatus(results);
698708
}
699709

710+
private TSStatus createSchemaSnapshotDatabaseIfNecessary(final PartialPath databasePath) {
711+
final DatabaseSchemaStatement statement =
712+
new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE);
713+
statement.setDatabasePath(databasePath);
714+
715+
final TSStatus status = executeStatementAndClassifyExceptions(statement);
716+
if (status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
717+
return status;
718+
}
719+
720+
if (status.getCode() == TSStatusCode.DATABASE_ALREADY_EXISTS.getStatusCode()) {
721+
return Objects.equals(
722+
status.getMessage(),
723+
databasePath.getFullPath() + " has already been created as database")
724+
? RpcUtils.getStatus(TSStatusCode.SUCCESS_STATUS)
725+
: new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode())
726+
.setMessage(status.getMessage());
727+
}
728+
729+
if (status.getCode() == TSStatusCode.DATABASE_CONFLICT.getStatusCode()) {
730+
return new TSStatus(TSStatusCode.PIPE_RECEIVER_USER_CONFLICT_EXCEPTION.getStatusCode())
731+
.setMessage(status.getMessage());
732+
}
733+
734+
return status;
735+
}
736+
700737
private TPipeTransferResp handleTransferSchemaPlan(final PipeTransferPlanNodeReq req) {
701738
// We may be able to skip the alter logical view's exception parsing because
702739
// the "AlterLogicalViewNode" is itself idempotent

‎iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java‎

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewriteFactory;
154154
import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement;
155155
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
156+
import org.apache.iotdb.db.queryengine.plan.statement.pipe.PipeEnrichedStatement;
156157
import org.apache.iotdb.db.utils.SetThreadName;
157158

158159
import org.apache.thrift.TBase;
@@ -399,13 +400,19 @@ private IQueryExecution createQueryExecutionForTreeModel(
399400
long startTime) {
400401
queryContext.setTimeOut(timeOut);
401402
queryContext.setStartTime(startTime);
402-
if (statement instanceof IConfigStatement) {
403-
queryContext.setQueryType(((IConfigStatement) statement).getQueryType());
403+
final Statement configStatement =
404+
statement instanceof PipeEnrichedStatement
405+
&& ((PipeEnrichedStatement) statement).getInnerStatement()
406+
instanceof IConfigStatement
407+
? ((PipeEnrichedStatement) statement).getInnerStatement()
408+
: statement;
409+
if (configStatement instanceof IConfigStatement) {
410+
queryContext.setQueryType(((IConfigStatement) configStatement).getQueryType());
404411
return new ConfigExecution(
405412
queryContext,
406-
statement.getType(),
413+
configStatement.getType(),
407414
executor,
408-
statement.accept(new TreeConfigTaskVisitor(), queryContext));
415+
configStatement.accept(new TreeConfigTaskVisitor(), queryContext));
409416
}
410417
TreeModelPlanner treeModelPlanner =
411418
new TreeModelPlanner(

0 commit comments

Comments
 (0)