From 8dde163b6ccdd9a03bd4610d88b629e60ca27633 Mon Sep 17 00:00:00 2001 From: Caideyipi <87789683+Caideyipi@users.noreply.github.com> Date: Wed, 17 Jun 2026 10:18:52 +0800 Subject: [PATCH] Fix tree schema snapshot database creation on master --- .../thrift/IoTDBDataNodeReceiver.java | 37 +++++++++++++++---- .../thrift/IoTDBDataNodeReceiverTest.java | 10 +++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java index fb2eabb6c85c6..4f101e1796a21 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiver.java @@ -629,8 +629,16 @@ private TSStatus loadSchemaSnapShot( throws IllegalPathException, IOException { final String databaseName = parameters.get(ColumnHeaderConstant.DATABASE); final PartialPath databasePath = PartialPath.getQualifiedDatabasePartialPath(databaseName); + final boolean isTreeModelDataAllowedToBeCaptured = + PipeTransferFileSealReqV2.isTreeModelDataAllowedToBeCaptured(parameters); + final TreePattern treePattern = + parseTreePattern( + parameters.get(ColumnHeaderConstant.PATH_PATTERN), isTreeModelDataAllowedToBeCaptured); if (!PathUtils.isTableModelDatabase(databaseName)) { + if (!shouldLoadTreeSchemaSnapshotDatabase(treePattern, databaseName)) { + return new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()); + } final TSStatus createDatabaseStatus = createSchemaSnapshotDatabaseIfNecessary(databasePath); if (createDatabaseStatus.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { return createDatabaseStatus; @@ -650,13 +658,6 @@ private TSStatus loadSchemaSnapShot( final Set executionTypes = PipeSchemaRegionSnapshotEvent.getStatementTypeSet( parameters.get(ColumnHeaderConstant.TYPE)); - final boolean isTreeModelDataAllowedToBeCaptured = - PipeTransferFileSealReqV2.isTreeModelDataAllowedToBeCaptured(parameters); - final TreePattern treePattern = - TreePattern.parsePatternFromString( - parameters.get(ColumnHeaderConstant.PATH_PATTERN), - isTreeModelDataAllowedToBeCaptured, - p -> new IoTDBTreePattern(isTreeModelDataAllowedToBeCaptured, p)); final TablePattern tablePattern = new TablePattern( PipeTransferFileSealReqV2.isTableModelDataAllowedToBeCaptured(parameters), @@ -707,6 +708,28 @@ private TSStatus loadSchemaSnapShot( return PipeReceiverStatusHandler.getPriorStatus(results); } + static boolean shouldLoadTreeSchemaSnapshotDatabase( + final String pathPattern, + final boolean isTreeModelDataAllowedToBeCaptured, + final String databaseName) { + return shouldLoadTreeSchemaSnapshotDatabase( + parseTreePattern(pathPattern, isTreeModelDataAllowedToBeCaptured), databaseName); + } + + private static TreePattern parseTreePattern( + final String pathPattern, final boolean isTreeModelDataAllowedToBeCaptured) { + return TreePattern.parsePatternFromString( + pathPattern, + isTreeModelDataAllowedToBeCaptured, + p -> new IoTDBTreePattern(isTreeModelDataAllowedToBeCaptured, p)); + } + + private static boolean shouldLoadTreeSchemaSnapshotDatabase( + final TreePattern treePattern, final String databaseName) { + return treePattern.isTreeModelDataAllowedToBeCaptured() + && treePattern.mayOverlapWithDb(databaseName); + } + private TSStatus createSchemaSnapshotDatabaseIfNecessary(final PartialPath databasePath) { final DatabaseSchemaStatement statement = new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE); diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiverTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiverTest.java index 1e279a18febfb..7f9197dfa04e7 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiverTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/pipe/receiver/protocol/thrift/IoTDBDataNodeReceiverTest.java @@ -110,6 +110,16 @@ public void testRepeatedStatementExceptionLogIsReduced() throws Exception { } } + @Test + public void testTreeSchemaSnapshotDatabaseIsFilteredByPattern() { + Assert.assertTrue( + IoTDBDataNodeReceiver.shouldLoadTreeSchemaSnapshotDatabase("root.ln.**", true, "root.ln")); + Assert.assertFalse( + IoTDBDataNodeReceiver.shouldLoadTreeSchemaSnapshotDatabase("root.ln.**", true, "root.db")); + Assert.assertFalse( + IoTDBDataNodeReceiver.shouldLoadTreeSchemaSnapshotDatabase("root.ln.**", false, "root.ln")); + } + @Test public void testLoadTsFileSyncStatementVerifiesSchemaWhenConvertingType() throws Exception { final Path tsFile = Files.createTempFile("pipe-load-convert-verify-schema", ".tsfile");