From 867a151ca541a0207f2948ef326cbc5487e7538d Mon Sep 17 00:00:00 2001 From: libo Date: Thu, 18 Jun 2026 16:51:40 +0800 Subject: [PATCH 1/3] Supply the max_schema/data_region_group_num param to modify schema when create or alter database --- .../IoTDBDatabaseRegionControlIT.java | 18 +- .../manual/enhanced/IoTDBPipeMetaIT.java | 1 - .../auto/enhanced/IoTDBPipeIdempotentIT.java | 2 +- .../relational/it/schema/IoTDBDatabaseIT.java | 33 ++- .../IoTDBDatabaseMaxRegionGroupNumIT.java | 100 ++++++++ ...IoTDBDatabaseMixedRegionGroupPolicyIT.java | 77 ++++++ .../iotdb/db/qp/sql/IdentifierParser.g4 | 4 +- .../apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 4 +- .../org/apache/iotdb/db/qp/sql/SqlLexer.g4 | 8 +- .../manager/partition/PartitionManager.java | 10 +- .../manager/schema/ClusterSchemaManager.java | 238 ++++++++++++++---- .../persistence/schema/ClusterSchemaInfo.java | 14 ++ .../config/TableConfigTaskVisitor.java | 19 +- .../config/metadata/DatabaseSchemaTask.java | 9 +- .../relational/AbstractDatabaseTask.java | 4 +- .../queryengine/plan/parser/ASTVisitor.java | 12 +- .../metadata/DatabaseSchemaStatement.java | 28 +-- .../reporter/iotdb/IoTDBSessionReporter.java | 4 +- 18 files changed, 474 insertions(+), 111 deletions(-) create mode 100644 integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java create mode 100644 integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java index b66fadeb35f9a..bcee965cbcda0 100644 --- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/database/IoTDBDatabaseRegionControlIT.java @@ -58,6 +58,8 @@ public static void setUp() throws Exception { EnvFactory.getEnv() .getConfig() .getCommonConfig() + .setSchemaRegionGroupExtensionPolicy("CUSTOM") + .setDataRegionGroupExtensionPolicy("CUSTOM") .setDefaultSchemaRegionGroupNumPerDatabase(testDefaultSchemaRegionGroupNumPerDatabase) .setDefaultDataRegionGroupNumPerDatabase(testDefaultDataRegionGroupNumPerDatabase); @@ -132,7 +134,7 @@ public void testRegionGroupNumControlThroughCreation() final int testDataRegionGroupNum = 3; String createDatabaseSQL = String.format( - "CREATE DATABASE %s WITH SCHEMA_REGION_GROUP_NUM=%d, DATA_REGION_GROUP_NUM=%d;", + "CREATE DATABASE %s WITH MAX_SCHEMA_REGION_GROUP_NUM=%d, MAX_DATA_REGION_GROUP_NUM=%d;", database, testSchemaRegionGroupNum, testDataRegionGroupNum); statement.execute(createDatabaseSQL); insertBatchData(statement, database, 0); @@ -204,7 +206,7 @@ public void testRegionGroupNumControlThroughAlter() final int testDataRegionGroupNum = 3; String alterDatabaseSQL = String.format( - "ALTER DATABASE %s WITH SCHEMA_REGION_GROUP_NUM=%d, DATA_REGION_GROUP_NUM=%d;", + "ALTER DATABASE %s WITH MAX_SCHEMA_REGION_GROUP_NUM=%d, MAX_DATA_REGION_GROUP_NUM=%d;", database, testSchemaRegionGroupNum, testDataRegionGroupNum); statement.execute(alterDatabaseSQL); insertBatchData(statement, database, batchSize); @@ -233,4 +235,16 @@ public void testRegionGroupNumControlThroughAlter() Assert.assertEquals(testDataRegionGroupNum, dataRegionGroupNum.get()); } } + + @Test + public void testDeprecatedRegionGroupNumSqlRejected() throws SQLException { + try (final Connection connection = EnvFactory.getEnv().getConnection(); + final Statement statement = connection.createStatement()) { + Assert.assertThrows( + SQLException.class, + () -> + statement.execute( + "CREATE DATABASE root.paradise3 WITH SCHEMA_REGION_GROUP_NUM=3, DATA_REGION_GROUP_NUM=4;")); + } + } } diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java index f26aa171ae11b..0b0a82999c37a 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/tablemodel/manual/enhanced/IoTDBPipeMetaIT.java @@ -230,7 +230,6 @@ public void testNoTree() throws Exception { senderEnv, Arrays.asList( "create database root.test", - "alter database root.test with schema_region_group_num=2, data_region_group_num=3", "create timeSeries root.test.d1.s1 int32", "insert into root.test.d1 (s1) values (1)")); diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java index 6596c77913267..469448c5781b8 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java @@ -289,7 +289,7 @@ public void testCreateDatabaseIdempotent() throws Exception { public void testAlterDatabaseIdempotent() throws Exception { testIdempotent( Collections.singletonList("create database root.sg1"), - "ALTER DATABASE root.sg1 WITH SCHEMA_REGION_GROUP_NUM=2, DATA_REGION_GROUP_NUM=3;", + "ALTER DATABASE root.sg1 WITH TTL=3600000;", "create database root.sg2", "count databases", "count,", diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java index 58834cb5d799f..6868ef00ba75b 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java @@ -203,8 +203,7 @@ public void testManageDatabase() { statement.execute("drop database IF EXISTS test"); // Test create database with properties - statement.execute( - "create database test_prop with (ttl=300, schema_region_group_num=DEFAULT, time_partition_interval=100000)"); + statement.execute("create database test_prop with (ttl=300, time_partition_interval=100000)"); databaseNames = new String[] {"test_prop"}; TTLs = new String[] {"300"}; timePartitionInterval = new int[] {100000}; @@ -812,7 +811,7 @@ public void testMixedDatabase() throws SQLException { final Statement statement = connection.createStatement()) { statement.execute("create database root.test"); statement.execute( - "alter database root.test WITH SCHEMA_REGION_GROUP_NUM=2, DATA_REGION_GROUP_NUM=3"); + "alter database root.test WITH MAX_SCHEMA_REGION_GROUP_NUM=2, MAX_DATA_REGION_GROUP_NUM=3"); statement.execute("insert into root.test.d1 (s1) values(1)"); statement.execute("drop database root.test"); } @@ -882,6 +881,34 @@ public void testCountDatabases() throws SQLException { } } + @Test + public void testMaxRegionGroupNumRejectedInAutoPolicy() throws SQLException { + try (final Connection connection = + EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + final Statement statement = connection.createStatement()) { + try { + statement.execute("create database test_max with(max_data_region_group_num=4)"); + fail("max_data_region_group_num should be rejected under AUTO policy"); + } catch (final SQLException e) { + assertTrue( + e.getMessage() + .contains( + "max_data_region_group_num can only be set when data_region_group_extension_policy is CUSTOM")); + } + + statement.execute("create database test_max"); + try { + statement.execute("alter database test_max set properties max_data_region_group_num=4"); + fail("max_data_region_group_num should be rejected under AUTO policy"); + } catch (final SQLException e) { + assertTrue( + e.getMessage() + .contains( + "max_data_region_group_num can only be set when data_region_group_extension_policy is CUSTOM")); + } + } + } + @Test public void testDBAuth() throws SQLException { try (final Connection adminCon = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java new file mode 100644 index 0000000000000..c3ae953ff2aee --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMaxRegionGroupNumIT.java @@ -0,0 +1,100 @@ +/* + * 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.relational.it.schema; + +import org.apache.iotdb.db.it.utils.TestUtils; +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.TableClusterIT; +import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; +import org.apache.iotdb.itbase.env.BaseEnv; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collections; + +@RunWith(IoTDBTestRunner.class) +@Category({TableLocalStandaloneIT.class, TableClusterIT.class}) +public class IoTDBDatabaseMaxRegionGroupNumIT { + + @Before + public void setUp() throws Exception { + EnvFactory.getEnv() + .getConfig() + .getCommonConfig() + .setSchemaRegionGroupExtensionPolicy("CUSTOM") + .setDataRegionGroupExtensionPolicy("CUSTOM") + .setDefaultSchemaRegionGroupNumPerDatabase(1) + .setDefaultDataRegionGroupNumPerDatabase(2); + EnvFactory.getEnv().initClusterEnvironment(); + } + + @After + public void tearDown() throws Exception { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + @Test + public void testCreateAndAlterMaxRegionGroupNum() throws SQLException { + try (final Connection connection = + EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + final Statement statement = connection.createStatement()) { + statement.execute( + "create database test_create with(max_schema_region_group_num=3, max_data_region_group_num=4)"); + TestUtils.assertResultSetEqual( + statement.executeQuery( + "select database, max_schema_region_group_num, max_data_region_group_num " + + "from information_schema.databases where database = 'test_create'"), + "database,max_schema_region_group_num,max_data_region_group_num,", + Collections.singleton("test_create,3,4,")); + + statement.execute("create database test_alter"); + statement.execute( + "alter database test_alter set properties max_schema_region_group_num=3, max_data_region_group_num=4"); + try (final ResultSet resultSet = statement.executeQuery("show databases details")) { + boolean found = false; + while (resultSet.next()) { + if (!"test_alter".equals(resultSet.getString("Database"))) { + continue; + } + found = true; + org.junit.Assert.assertEquals(3, resultSet.getInt("MaxSchemaRegionGroupNum")); + org.junit.Assert.assertEquals(4, resultSet.getInt("MaxDataRegionGroupNum")); + } + org.junit.Assert.assertTrue(found); + } + + Assert.assertThrows( + SQLException.class, + () -> + statement.execute( + "create database test_deprecated with(schema_region_group_num=4, data_region_group_num=5)")); + } + } +} diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java new file mode 100644 index 0000000000000..e90046c59b301 --- /dev/null +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseMixedRegionGroupPolicyIT.java @@ -0,0 +1,77 @@ +/* + * 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.relational.it.schema; + +import org.apache.iotdb.db.it.utils.TestUtils; +import org.apache.iotdb.it.env.EnvFactory; +import org.apache.iotdb.it.framework.IoTDBTestRunner; +import org.apache.iotdb.itbase.category.TableClusterIT; +import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; +import org.apache.iotdb.itbase.env.BaseEnv; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.experimental.categories.Category; +import org.junit.runner.RunWith; + +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.Collections; + +@RunWith(IoTDBTestRunner.class) +@Category({TableLocalStandaloneIT.class, TableClusterIT.class}) +public class IoTDBDatabaseMixedRegionGroupPolicyIT { + + @Before + public void setUp() throws Exception { + EnvFactory.getEnv() + .getConfig() + .getCommonConfig() + .setSchemaRegionGroupExtensionPolicy("CUSTOM") + .setDataRegionGroupExtensionPolicy("AUTO") + .setDefaultSchemaRegionGroupNumPerDatabase(1) + .setDefaultDataRegionGroupNumPerDatabase(1) + .setDataRegionPerDataNode(4); + EnvFactory.getEnv().initClusterEnvironment(); + } + + @After + public void tearDown() throws Exception { + EnvFactory.getEnv().cleanClusterEnvironment(); + } + + @Test + public void testAutoPolicyStillAdjustsWhenTheOtherPolicyIsCustom() throws SQLException { + try (final Connection connection = + EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); + final Statement statement = connection.createStatement()) { + statement.execute("create database test_mixed with(max_schema_region_group_num=2)"); + + TestUtils.assertResultSetEqual( + statement.executeQuery( + "select database, max_schema_region_group_num, max_data_region_group_num " + + "from information_schema.databases where database = 'test_mixed'"), + "database,max_schema_region_group_num,max_data_region_group_num,", + Collections.singleton("test_mixed,2,4,")); + } + } +} diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 index 54d53bab67431..e96d84e892c8c 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IdentifierParser.g4 @@ -82,7 +82,7 @@ keyWords | CURRENT_USER | DATA | DATA_REPLICATION_FACTOR - | DATA_REGION_GROUP_NUM + | MAX_DATA_REGION_GROUP_NUM | DATABASE | DATABASES | DATANODE @@ -215,7 +215,7 @@ keyWords | RUNNING | SCHEMA | SCHEMA_REPLICATION_FACTOR - | SCHEMA_REGION_GROUP_NUM + | MAX_SCHEMA_REGION_GROUP_NUM | SECURITY | SELECT | SERIESSLOTID diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index 3ac375b7f1504..2f91b573aef0e 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -121,8 +121,8 @@ databaseAttributeClause databaseAttributeKey : TTL | TIME_PARTITION_INTERVAL - | SCHEMA_REGION_GROUP_NUM - | DATA_REGION_GROUP_NUM + | MAX_SCHEMA_REGION_GROUP_NUM + | MAX_DATA_REGION_GROUP_NUM ; // ---- Drop Database diff --git a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 index 59bac72fc7813..3950de50ea477 100644 --- a/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 +++ b/iotdb-core/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/SqlLexer.g4 @@ -1227,12 +1227,12 @@ TIME_PARTITION_INTERVAL : T I M E '_' P A R T I T I O N '_' I N T E R V A L ; -SCHEMA_REGION_GROUP_NUM - : S C H E M A '_' R E G I O N '_' G R O U P '_' N U M +MAX_SCHEMA_REGION_GROUP_NUM + : M A X '_' S C H E M A '_' R E G I O N '_' G R O U P '_' N U M ; -DATA_REGION_GROUP_NUM - : D A T A '_' R E G I O N '_' G R O U P '_' N U M +MAX_DATA_REGION_GROUP_NUM + : M A X '_' D A T A '_' R E G I O N '_' G R O U P '_' N U M ; CURRENT_TIMESTAMP diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java index dfa3448bc0f3b..095bbb8626865 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java @@ -625,14 +625,14 @@ private TSStatus customExtendRegionGroupIfNecessary( for (final Map.Entry entry : unassignedPartitionSlotsCountMap.entrySet()) { final String database = entry.getKey(); - final int minRegionGroupNum = - getClusterSchemaManager().getMinRegionGroupNum(database, consensusGroupType); + final int maxRegionGroupNum = + getClusterSchemaManager().getMaxRegionGroupNum(database, consensusGroupType); final int allocatedRegionGroupCount = partitionInfo.getRegionGroupCount(database, consensusGroupType); - // Extend RegionGroups until allocatedRegionGroupCount == minRegionGroupNum - if (allocatedRegionGroupCount < minRegionGroupNum) { - allotmentMap.put(database, minRegionGroupNum - allocatedRegionGroupCount); + // Extend RegionGroups until allocatedRegionGroupCount == maxRegionGroupNum + if (allocatedRegionGroupCount < maxRegionGroupNum) { + allotmentMap.put(database, maxRegionGroupNum - allocatedRegionGroupCount); } } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java index fbf62d8f1ddc5..ba0295dfc69d5 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java @@ -95,6 +95,7 @@ import org.apache.iotdb.confignode.manager.node.NodeManager; import org.apache.iotdb.confignode.manager.partition.PartitionManager; import org.apache.iotdb.confignode.manager.partition.PartitionMetrics; +import org.apache.iotdb.confignode.manager.partition.RegionGroupExtensionPolicy; import org.apache.iotdb.confignode.persistence.schema.ClusterSchemaInfo; import org.apache.iotdb.confignode.rpc.thrift.TDatabaseInfo; import org.apache.iotdb.confignode.rpc.thrift.TDatabaseSchema; @@ -267,6 +268,27 @@ public TSStatus alterDatabase( } } + if (databaseSchema.isSetMaxSchemaRegionGroupNum()) { + result = + validateMaxRegionGroupNumOnAlter( + databaseSchema.getName(), + TConsensusGroupType.SchemaRegion, + databaseSchema.getMaxSchemaRegionGroupNum()); + if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + return result; + } + } + if (databaseSchema.isSetMaxDataRegionGroupNum()) { + result = + validateMaxRegionGroupNumOnAlter( + databaseSchema.getName(), + TConsensusGroupType.DataRegion, + databaseSchema.getMaxDataRegionGroupNum()); + if (result.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + return result; + } + } + // Alter DatabaseSchema try { result = @@ -475,6 +497,14 @@ public TSStatus setTimePartitionInterval( * each Database based on existing cluster resources */ public synchronized void adjustMaxRegionGroupNum() { + final boolean isAdjustSchemaRegionGroupNum = + !CONF.getSchemaRegionGroupExtensionPolicy().equals(RegionGroupExtensionPolicy.CUSTOM); + final boolean isAdjustDataRegionGroupNum = + !CONF.getDataRegionGroupExtensionPolicy().equals(RegionGroupExtensionPolicy.CUSTOM); + if (!isAdjustSchemaRegionGroupNum && !isAdjustDataRegionGroupNum) { + return; + } + // Get all DatabaseSchemas final Map databaseSchemaMap = getMatchedDatabaseSchemasByName(getDatabaseNames(null), null); @@ -507,60 +537,64 @@ public synchronized void adjustMaxRegionGroupNum() { continue; } - // Adjust maxSchemaRegionGroupNum for each Database. - // All Databases share the DataNodes equally. - // The allocated SchemaRegionGroups will not be shrunk. - final int allocatedSchemaRegionGroupCount; - try { - allocatedSchemaRegionGroupCount = - getPartitionManager() - .getRegionGroupCount(databaseSchema.getName(), TConsensusGroupType.SchemaRegion); - } catch (final DatabaseNotExistsException e) { - // ignore the pre deleted database - continue; + int maxSchemaRegionGroupNum = databaseSchema.getMaxSchemaRegionGroupNum(); + if (isAdjustSchemaRegionGroupNum) { + // Adjust maxSchemaRegionGroupNum for each Database. + // All Databases share the DataNodes equally. + // The allocated SchemaRegionGroups will not be shrunk. + final int allocatedSchemaRegionGroupCount; + try { + allocatedSchemaRegionGroupCount = + getPartitionManager() + .getRegionGroupCount(databaseSchema.getName(), TConsensusGroupType.SchemaRegion); + } catch (final DatabaseNotExistsException e) { + // ignore the pre deleted database + continue; + } + maxSchemaRegionGroupNum = + calcMaxRegionGroupNum( + databaseSchema.getMinSchemaRegionGroupNum(), + SCHEMA_REGION_PER_DATA_NODE, + dataNodeNum, + databaseNum, + databaseSchema.getSchemaReplicationFactor(), + allocatedSchemaRegionGroupCount); + LOGGER.info( + ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR, + databaseSchema.getName(), + maxSchemaRegionGroupNum); } - final int maxSchemaRegionGroupNum = - calcMaxRegionGroupNum( - databaseSchema.getMinSchemaRegionGroupNum(), - SCHEMA_REGION_PER_DATA_NODE, - dataNodeNum, - databaseNum, - databaseSchema.getSchemaReplicationFactor(), - allocatedSchemaRegionGroupCount); - LOGGER.info( - ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR, - databaseSchema.getName(), - maxSchemaRegionGroupNum); - - // Adjust maxDataRegionGroupNum for each Database. - // All Databases share the DataNodes equally. - // The allocated DataRegionGroups will not be shrunk. - final int allocatedDataRegionGroupCount; - try { - allocatedDataRegionGroupCount = - getPartitionManager() - .getRegionGroupCount(databaseSchema.getName(), TConsensusGroupType.DataRegion); - } catch (final DatabaseNotExistsException e) { - // ignore the pre deleted database - continue; + int maxDataRegionGroupNum = databaseSchema.getMaxDataRegionGroupNum(); + if (isAdjustDataRegionGroupNum) { + // Adjust maxDataRegionGroupNum for each Database. + // All Databases share the DataNodes equally. + // The allocated DataRegionGroups will not be shrunk. + final int allocatedDataRegionGroupCount; + try { + allocatedDataRegionGroupCount = + getPartitionManager() + .getRegionGroupCount(databaseSchema.getName(), TConsensusGroupType.DataRegion); + } catch (final DatabaseNotExistsException e) { + // ignore the pre deleted database + continue; + } + maxDataRegionGroupNum = + calcMaxRegionGroupNum( + databaseSchema.getMinDataRegionGroupNum(), + DATA_REGION_PER_DATA_NODE == 0 + ? CONF.getDataRegionPerDataNodeProportion() + : DATA_REGION_PER_DATA_NODE, + DATA_REGION_PER_DATA_NODE == 0 ? totalCpuCoreNum : dataNodeNum, + databaseNum, + databaseSchema.getDataReplicationFactor(), + allocatedDataRegionGroupCount); + LOGGER.info( + ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR, + databaseSchema.getName(), + maxDataRegionGroupNum); } - final int maxDataRegionGroupNum = - calcMaxRegionGroupNum( - databaseSchema.getMinDataRegionGroupNum(), - DATA_REGION_PER_DATA_NODE == 0 - ? CONF.getDataRegionPerDataNodeProportion() - : DATA_REGION_PER_DATA_NODE, - DATA_REGION_PER_DATA_NODE == 0 ? totalCpuCoreNum : dataNodeNum, - databaseNum, - databaseSchema.getDataReplicationFactor(), - allocatedDataRegionGroupCount); - LOGGER.info( - ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR, - databaseSchema.getName(), - maxDataRegionGroupNum); - adjustMaxRegionGroupNumPlan.putEntry( databaseSchema.getName(), new Pair<>(maxSchemaRegionGroupNum, maxDataRegionGroupNum)); } @@ -908,14 +942,112 @@ public static TSStatus enrichDatabaseSchemaWithDefaultProperties( .FAILED_TO_CREATE_DATABASE_THE_DATAREGIONGROUPNUM_SHOULD_BE_POSITIVE); } + if (databaseSchema.isSetMaxSchemaRegionGroupNum()) { + errorResp = + validateMaxRegionGroupNumOnCreation( + databaseSchema, TConsensusGroupType.SchemaRegion, errorResp); + } + if (databaseSchema.isSetMaxDataRegionGroupNum()) { + errorResp = + validateMaxRegionGroupNumOnCreation( + databaseSchema, TConsensusGroupType.DataRegion, errorResp); + } + if (errorResp != null) { LOGGER.warn(ConfigNodeMessages.EXECUTE_SETDATABASE_WITH_RESULT, databaseSchema, errorResp); return errorResp; } - // The maxRegionGroupNum is equal to the minRegionGroupNum when initialize - databaseSchema.setMaxSchemaRegionGroupNum(databaseSchema.getMinSchemaRegionGroupNum()); - databaseSchema.setMaxDataRegionGroupNum(databaseSchema.getMinDataRegionGroupNum()); + if (!databaseSchema.isSetMaxSchemaRegionGroupNum()) { + databaseSchema.setMaxSchemaRegionGroupNum(databaseSchema.getMinSchemaRegionGroupNum()); + } + if (!databaseSchema.isSetMaxDataRegionGroupNum()) { + databaseSchema.setMaxDataRegionGroupNum(databaseSchema.getMinDataRegionGroupNum()); + } + + return StatusUtils.OK; + } + + private static TSStatus validateMaxRegionGroupNumOnCreation( + final TDatabaseSchema databaseSchema, + final TConsensusGroupType consensusGroupType, + final TSStatus previousError) { + final TSStatus status = + validateMaxRegionGroupNum( + databaseSchema.getName(), + consensusGroupType, + TConsensusGroupType.SchemaRegion.equals(consensusGroupType) + ? databaseSchema.getMaxSchemaRegionGroupNum() + : databaseSchema.getMaxDataRegionGroupNum(), + true); + return status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode() ? previousError : status; + } + + private static TSStatus validateMaxRegionGroupNum( + final String database, + final TConsensusGroupType consensusGroupType, + final int maxRegionGroupNum, + final boolean isCreate) { + final boolean isSchemaRegion = TConsensusGroupType.SchemaRegion.equals(consensusGroupType); + final RegionGroupExtensionPolicy policy = + isSchemaRegion + ? CONF.getSchemaRegionGroupExtensionPolicy() + : CONF.getDataRegionGroupExtensionPolicy(); + final String configKey = + isSchemaRegion ? "max_schema_region_group_num" : "max_data_region_group_num"; + final String fieldName = isSchemaRegion ? "MaxSchemaRegionGroupNum" : "MaxDataRegionGroupNum"; + + if (!policy.equals(RegionGroupExtensionPolicy.CUSTOM)) { + return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode()) + .setMessage( + String.format( + "Failed to %s database. The %s can only be set when %s_region_group_extension_policy is CUSTOM.", + isCreate ? "create" : "alter", configKey, isSchemaRegion ? "schema" : "data")); + } + + final int defaultRegionGroupNum = + isSchemaRegion + ? CONF.getDefaultSchemaRegionGroupNumPerDatabase() + : CONF.getDefaultDataRegionGroupNumPerDatabase(); + if (maxRegionGroupNum < defaultRegionGroupNum) { + return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode()) + .setMessage( + String.format( + "%s should be greater than or equal to default %sRegionGroupNum: %d.", + fieldName, isSchemaRegion ? "Schema" : "Data", defaultRegionGroupNum)); + } + + return StatusUtils.OK; + } + + private TSStatus validateMaxRegionGroupNumOnAlter( + final String database, + final TConsensusGroupType consensusGroupType, + final int maxRegionGroupNum) { + TSStatus status = + validateMaxRegionGroupNum(database, consensusGroupType, maxRegionGroupNum, false); + if (status.getCode() != TSStatusCode.SUCCESS_STATUS.getStatusCode()) { + return status; + } + + final boolean isSchemaRegion = TConsensusGroupType.SchemaRegion.equals(consensusGroupType); + final String fieldName = isSchemaRegion ? "MaxSchemaRegionGroupNum" : "MaxDataRegionGroupNum"; + + final int allocatedRegionGroupCount; + try { + allocatedRegionGroupCount = + getPartitionManager().getRegionGroupCount(database, consensusGroupType); + } catch (final DatabaseNotExistsException e) { + return new TSStatus(TSStatusCode.DATABASE_NOT_EXIST.getStatusCode()) + .setMessage(e.getMessage()); + } + if (maxRegionGroupNum < allocatedRegionGroupCount) { + return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode()) + .setMessage( + String.format( + "%s should be greater than or equal to allocated %sRegionGroupNum: %d.", + fieldName, isSchemaRegion ? "Schema" : "Data", allocatedRegionGroupCount)); + } return StatusUtils.OK; } diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java index 47f2264505b73..90f21d2e75c2d 100644 --- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java +++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/schema/ClusterSchemaInfo.java @@ -267,6 +267,20 @@ public TSStatus alterDatabase(final DatabaseSchemaPlan plan) { currentSchema.getName(), currentSchema.getMaxDataRegionGroupNum()); } + if (alterSchema.isSetMaxSchemaRegionGroupNum()) { + currentSchema.setMaxSchemaRegionGroupNum(alterSchema.getMaxSchemaRegionGroupNum()); + LOGGER.info( + ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_SCHEMAREGIONGROUPS_FOR, + currentSchema.getName(), + currentSchema.getMaxSchemaRegionGroupNum()); + } + if (alterSchema.isSetMaxDataRegionGroupNum()) { + currentSchema.setMaxDataRegionGroupNum(alterSchema.getMaxDataRegionGroupNum()); + LOGGER.info( + ConfigNodeMessages.ADJUSTREGIONGROUPNUM_THE_MAXIMUM_NUMBER_OF_DATAREGIONGROUPS_FOR, + currentSchema.getName(), + currentSchema.getMaxDataRegionGroupNum()); + } if (alterSchema.isSetTTL()) { currentSchema.setTTL(alterSchema.getTTL()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java index 4eff93bfc12d2..20f484e10d7c6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java @@ -285,8 +285,8 @@ import static org.apache.iotdb.commons.schema.table.TsTable.TABLE_ALLOWED_PROPERTIES; import static org.apache.iotdb.commons.schema.table.TsTable.TIME_COLUMN_NAME; import static org.apache.iotdb.commons.schema.table.TsTable.TTL_PROPERTY; -import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.DATA_REGION_GROUP_NUM_KEY; -import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.SCHEMA_REGION_GROUP_NUM_KEY; +import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.MAX_DATA_REGION_GROUP_NUM_KEY; +import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.MAX_SCHEMA_REGION_GROUP_NUM_KEY; import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.TIME_PARTITION_INTERVAL_KEY; import static org.apache.iotdb.db.queryengine.plan.execution.config.metadata.relational.CreateDBTask.TTL_KEY; import static org.apache.tsfile.common.constant.TsFileConstant.PATH_SEPARATOR; @@ -351,8 +351,8 @@ private IConfigTask visitDatabaseStatement( if (property.isSetToDefault()) { switch (key) { case TIME_PARTITION_INTERVAL_KEY: - case SCHEMA_REGION_GROUP_NUM_KEY: - case DATA_REGION_GROUP_NUM_KEY: + case MAX_SCHEMA_REGION_GROUP_NUM_KEY: + case MAX_DATA_REGION_GROUP_NUM_KEY: break; case TTL_KEY: if (node.getType() == DatabaseSchemaStatement.DatabaseSchemaStatementType.ALTER) { @@ -386,12 +386,13 @@ private IConfigTask visitDatabaseStatement( case TIME_PARTITION_INTERVAL_KEY: schema.setTimePartitionInterval(parseLongFromLiteral(value, TIME_PARTITION_INTERVAL_KEY)); break; - case SCHEMA_REGION_GROUP_NUM_KEY: - schema.setMinSchemaRegionGroupNum( - parseIntFromLiteral(value, SCHEMA_REGION_GROUP_NUM_KEY)); + case MAX_SCHEMA_REGION_GROUP_NUM_KEY: + schema.setMaxSchemaRegionGroupNum( + parseIntFromLiteral(value, MAX_SCHEMA_REGION_GROUP_NUM_KEY)); break; - case DATA_REGION_GROUP_NUM_KEY: - schema.setMinDataRegionGroupNum(parseIntFromLiteral(value, DATA_REGION_GROUP_NUM_KEY)); + case MAX_DATA_REGION_GROUP_NUM_KEY: + schema.setMaxDataRegionGroupNum( + parseIntFromLiteral(value, MAX_DATA_REGION_GROUP_NUM_KEY)); break; default: throw new SemanticException( diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java index ab9dee095aaab..31c96887600c5 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/DatabaseSchemaTask.java @@ -66,11 +66,12 @@ public static TDatabaseSchema constructDatabaseSchema( if (databaseSchemaStatement.getTimePartitionInterval() != null) { databaseSchema.setTimePartitionInterval(databaseSchemaStatement.getTimePartitionInterval()); } - if (databaseSchemaStatement.getSchemaRegionGroupNum() != null) { - databaseSchema.setMinSchemaRegionGroupNum(databaseSchemaStatement.getSchemaRegionGroupNum()); + if (databaseSchemaStatement.getMaxSchemaRegionGroupNum() != null) { + databaseSchema.setMaxSchemaRegionGroupNum( + databaseSchemaStatement.getMaxSchemaRegionGroupNum()); } - if (databaseSchemaStatement.getDataRegionGroupNum() != null) { - databaseSchema.setMinDataRegionGroupNum(databaseSchemaStatement.getDataRegionGroupNum()); + if (databaseSchemaStatement.getMaxDataRegionGroupNum() != null) { + databaseSchema.setMaxDataRegionGroupNum(databaseSchemaStatement.getMaxDataRegionGroupNum()); } databaseSchema.setIsTableModel(false); return databaseSchema; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java index df280c8759de2..59b50536c15ba 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/relational/AbstractDatabaseTask.java @@ -27,8 +27,8 @@ public abstract class AbstractDatabaseTask implements IConfigTask { /////////////////////////////// Allowed properties /////////////////////////////// public static final String TTL_KEY = "ttl"; public static final String TIME_PARTITION_INTERVAL_KEY = "time_partition_interval"; - public static final String SCHEMA_REGION_GROUP_NUM_KEY = "schema_region_group_num"; - public static final String DATA_REGION_GROUP_NUM_KEY = "data_region_group_num"; + public static final String MAX_SCHEMA_REGION_GROUP_NUM_KEY = "max_schema_region_group_num"; + public static final String MAX_DATA_REGION_GROUP_NUM_KEY = "max_data_region_group_num"; // Deprecated public static final String SCHEMA_REPLICATION_FACTOR_KEY = "schema_replication_factor"; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java index 6ecf65c86bb3c..b9e2fe21c7a54 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java @@ -2998,12 +2998,12 @@ private void parseDatabaseAttributesClause( } else if (attributeKey.TIME_PARTITION_INTERVAL() != null) { final long timePartitionInterval = Long.parseLong(attribute.INTEGER_LITERAL().getText()); databaseSchemaStatement.setTimePartitionInterval(timePartitionInterval); - } else if (attributeKey.SCHEMA_REGION_GROUP_NUM() != null) { - final int schemaRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - databaseSchemaStatement.setSchemaRegionGroupNum(schemaRegionGroupNum); - } else if (attributeKey.DATA_REGION_GROUP_NUM() != null) { - final int dataRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - databaseSchemaStatement.setDataRegionGroupNum(dataRegionGroupNum); + } else if (attributeKey.MAX_SCHEMA_REGION_GROUP_NUM() != null) { + final int maxSchemaRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); + databaseSchemaStatement.setMaxSchemaRegionGroupNum(maxSchemaRegionGroupNum); + } else if (attributeKey.MAX_DATA_REGION_GROUP_NUM() != null) { + final int maxDataRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); + databaseSchemaStatement.setMaxDataRegionGroupNum(maxDataRegionGroupNum); } } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java index 9fc9f2704f019..b31520fdc7605 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/DatabaseSchemaStatement.java @@ -36,8 +36,8 @@ public class DatabaseSchemaStatement extends Statement implements IConfigStateme private PartialPath databasePath; private Long ttl = null; private Long timePartitionInterval = null; - private Integer schemaRegionGroupNum = null; - private Integer dataRegionGroupNum = null; + private Integer maxSchemaRegionGroupNum = null; + private Integer maxDataRegionGroupNum = null; private boolean enablePrintExceptionLog = true; // Deprecated @@ -94,20 +94,20 @@ public void setTimePartitionInterval(final Long timePartitionInterval) { this.timePartitionInterval = timePartitionInterval; } - public Integer getSchemaRegionGroupNum() { - return schemaRegionGroupNum; + public Integer getMaxSchemaRegionGroupNum() { + return maxSchemaRegionGroupNum; } - public void setSchemaRegionGroupNum(final Integer schemaRegionGroupNum) { - this.schemaRegionGroupNum = schemaRegionGroupNum; + public void setMaxSchemaRegionGroupNum(final Integer maxSchemaRegionGroupNum) { + this.maxSchemaRegionGroupNum = maxSchemaRegionGroupNum; } - public Integer getDataRegionGroupNum() { - return dataRegionGroupNum; + public Integer getMaxDataRegionGroupNum() { + return maxDataRegionGroupNum; } - public void setDataRegionGroupNum(final Integer dataRegionGroupNum) { - this.dataRegionGroupNum = dataRegionGroupNum; + public void setMaxDataRegionGroupNum(final Integer maxDataRegionGroupNum) { + this.maxDataRegionGroupNum = maxDataRegionGroupNum; } public boolean getEnablePrintExceptionLog() { @@ -152,10 +152,10 @@ public String toString() { + dataReplicationFactor + ", timePartitionInterval=" + timePartitionInterval - + ", schemaRegionGroupNum=" - + schemaRegionGroupNum - + ", dataRegionGroupNum=" - + dataRegionGroupNum + + ", maxSchemaRegionGroupNum=" + + maxSchemaRegionGroupNum + + ", maxDataRegionGroupNum=" + + maxDataRegionGroupNum + '}'; } diff --git a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java index 8e73776e53796..4561fac09a9fe 100644 --- a/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java +++ b/iotdb-core/metrics/interface/src/main/java/org/apache/iotdb/metrics/reporter/iotdb/IoTDBSessionReporter.java @@ -84,9 +84,7 @@ public IoTDBSessionReporter(AbstractMetricManager metricManager) { if (!result.hasNext()) { try (SessionDataSetWrapper result2 = this.sessionPool.executeQueryStatement( - "CREATE DATABASE " - + metricConfig.getInternalDatabase() - + " WITH SCHEMA_REGION_GROUP_NUM=1, DATA_REGION_GROUP_NUM=1")) { + "CREATE DATABASE " + metricConfig.getInternalDatabase())) { if (!result2.hasNext()) { LOGGER.error(MetricsMessages.IOTDB_SESSION_REPORTER_DB_FAILED); } From e3cd74af709c226b7a47a204b7ab1eb60af7bd6a Mon Sep 17 00:00:00 2001 From: libo Date: Thu, 18 Jun 2026 17:28:35 +0800 Subject: [PATCH 2/3] Fix unexpected SQL execution on the IT --- .../treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java | 6 +++++- .../iotdb/relational/it/schema/IoTDBDatabaseIT.java | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java index 469448c5781b8..33a68d43ff207 100644 --- a/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/pipe/it/dual/treemodel/auto/enhanced/IoTDBPipeIdempotentIT.java @@ -65,6 +65,8 @@ public void setUp() { // Limit the schemaRegion number to 1 to guarantee the after sql executed on the same region // of the tested idempotent sql. .setDefaultSchemaRegionGroupNumPerDatabase(1) + .setSchemaRegionGroupExtensionPolicy("CUSTOM") + .setDataRegionGroupExtensionPolicy("CUSTOM") .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) .setEnforceStrongPassword(false) @@ -75,6 +77,8 @@ public void setUp() { .getConfig() .getCommonConfig() .setAutoCreateSchemaEnabled(true) + .setSchemaRegionGroupExtensionPolicy("CUSTOM") + .setDataRegionGroupExtensionPolicy("CUSTOM") .setConfigNodeConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) .setSchemaRegionConsensusProtocolClass(ConsensusFactory.RATIS_CONSENSUS) .setEnforceStrongPassword(false) @@ -289,7 +293,7 @@ public void testCreateDatabaseIdempotent() throws Exception { public void testAlterDatabaseIdempotent() throws Exception { testIdempotent( Collections.singletonList("create database root.sg1"), - "ALTER DATABASE root.sg1 WITH TTL=3600000;", + "ALTER DATABASE root.sg1 WITH MAX_SCHEMA_REGION_GROUP_NUM=2, MAX_DATA_REGION_GROUP_NUM=3;", "create database root.sg2", "count databases", "count,", diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java index 6868ef00ba75b..dac15d8b66bf4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java +++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/schema/IoTDBDatabaseIT.java @@ -27,6 +27,7 @@ import org.apache.iotdb.itbase.category.TableClusterIT; import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; import org.apache.iotdb.itbase.env.BaseEnv; +import org.apache.iotdb.jdbc.IoTDBSQLException; import org.junit.After; import org.junit.Assert; @@ -810,8 +811,11 @@ public void testMixedDatabase() throws SQLException { try (final Connection connection = EnvFactory.getEnv().getConnection(); final Statement statement = connection.createStatement()) { statement.execute("create database root.test"); - statement.execute( - "alter database root.test WITH MAX_SCHEMA_REGION_GROUP_NUM=2, MAX_DATA_REGION_GROUP_NUM=3"); + Assert.assertThrows( + IoTDBSQLException.class, + () -> + statement.execute( + "alter database root.test WITH MAX_SCHEMA_REGION_GROUP_NUM=2, MAX_DATA_REGION_GROUP_NUM=3")); statement.execute("insert into root.test.d1 (s1) values(1)"); statement.execute("drop database root.test"); } From 515c13747d5a19042f383aa5f32d7f1e34cf0c8a Mon Sep 17 00:00:00 2001 From: libo Date: Thu, 18 Jun 2026 18:40:37 +0800 Subject: [PATCH 3/3] The old statement shall be reclaimed in the same manner as the original connection when the connection is closed --- .../src/test/java/org/apache/iotdb/db/it/utils/TestUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/integration-test/src/test/java/org/apache/iotdb/db/it/utils/TestUtils.java b/integration-test/src/test/java/org/apache/iotdb/db/it/utils/TestUtils.java index 93f14dc572b55..1fc35a35b31e4 100644 --- a/integration-test/src/test/java/org/apache/iotdb/db/it/utils/TestUtils.java +++ b/integration-test/src/test/java/org/apache/iotdb/db/it/utils/TestUtils.java @@ -1216,6 +1216,7 @@ public static boolean tryExecuteNonQueriesWithRetry( } } connectionToUse = null; + statement = null; if (retryCountLeft > 0) { try {