This is an automated email from the ASF dual-hosted git repository.
HTHou pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 797319b453c The new value cannot be less than the current maximum
quota. The quota uses the default value if unspecified in the ALTER DATABASE
statement (#18154)
797319b453c is described below
commit 797319b453cbfa3518c3d89dbe90ce82760453b0
Author: libo <[email protected]>
AuthorDate: Wed Jul 8 16:44:00 2026 +0800
The new value cannot be less than the current maximum quota. The quota uses
the default value if unspecified in the ALTER DATABASE statement (#18154)
---
.../it/database/IoTDBDatabaseRegionControlIT.java | 111 +++++++++++++++++++++
.../schema/IoTDBDatabaseMaxRegionGroupNumIT.java | 73 ++++++++++++++
.../iotdb/confignode/i18n/ManagerMessages.java | 3 +
.../iotdb/confignode/i18n/ManagerMessages.java | 3 +
.../manager/schema/ClusterSchemaManager.java | 36 +++++--
5 files changed, 219 insertions(+), 7 deletions(-)
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 bcee965cbcd..bf4ecab85fc 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
@@ -39,6 +39,7 @@ import org.junit.runner.RunWith;
import java.io.IOException;
import java.sql.Connection;
+import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
@@ -164,6 +165,53 @@ public class IoTDBDatabaseRegionControlIT {
}
}
+ @Test
+ public void testRecreateWithPartialMaxRegionGroupNumUsesDefaultCounterpart()
throws SQLException {
+ try (final Connection connection = EnvFactory.getEnv().getConnection();
+ final Statement statement = connection.createStatement()) {
+ final String database = "root.rg_tree_create_schema";
+ statement.execute(String.format("CREATE DATABASE %s;", database));
+
+ try (final ResultSet resultSet =
+ statement.executeQuery("SHOW DATABASES DETAILS " + database)) {
+ Assert.assertTrue(resultSet.next());
+ Assert.assertEquals(
+ testDefaultSchemaRegionGroupNumPerDatabase,
+ resultSet.getInt("MaxSchemaRegionGroupNum"));
+ Assert.assertEquals(
+ testDefaultDataRegionGroupNumPerDatabase,
resultSet.getInt("MaxDataRegionGroupNum"));
+ Assert.assertFalse(resultSet.next());
+ }
+
+ statement.execute(String.format("DROP DATABASE %s;", database));
+ statement.execute(
+ String.format("CREATE DATABASE %s WITH
MAX_SCHEMA_REGION_GROUP_NUM=3;", database));
+
+ try (final ResultSet resultSet =
+ statement.executeQuery("SHOW DATABASES DETAILS " + database)) {
+ Assert.assertTrue(resultSet.next());
+ Assert.assertEquals(3, resultSet.getInt("MaxSchemaRegionGroupNum"));
+ Assert.assertEquals(
+ testDefaultDataRegionGroupNumPerDatabase,
resultSet.getInt("MaxDataRegionGroupNum"));
+ Assert.assertFalse(resultSet.next());
+ }
+
+ final String dataDatabase = "root.rg_tree_create_data";
+ statement.execute(
+ String.format("CREATE DATABASE %s WITH
MAX_DATA_REGION_GROUP_NUM=4;", dataDatabase));
+
+ try (final ResultSet resultSet =
+ statement.executeQuery("SHOW DATABASES DETAILS " + dataDatabase)) {
+ Assert.assertTrue(resultSet.next());
+ Assert.assertEquals(
+ testDefaultSchemaRegionGroupNumPerDatabase,
+ resultSet.getInt("MaxSchemaRegionGroupNum"));
+ Assert.assertEquals(4, resultSet.getInt("MaxDataRegionGroupNum"));
+ Assert.assertFalse(resultSet.next());
+ }
+ }
+ }
+
@Test
public void testRegionGroupNumControlThroughAlter()
throws SQLException, ClientManagerException, IOException,
InterruptedException, TException {
@@ -236,6 +284,69 @@ public class IoTDBDatabaseRegionControlIT {
}
}
+ @Test
+ public void testAlterMaxDataRegionGroupNumCannotDecrease() throws
SQLException {
+ try (final Connection connection = EnvFactory.getEnv().getConnection();
+ final Statement statement = connection.createStatement()) {
+ final String database = "root.rg_tree_decrease";
+ statement.execute(
+ String.format("CREATE DATABASE %s WITH
MAX_DATA_REGION_GROUP_NUM=8;", database));
+ statement.execute(
+ String.format("ALTER DATABASE %s WITH
MAX_DATA_REGION_GROUP_NUM=16;", database));
+
+ final SQLException exception =
+ Assert.assertThrows(
+ SQLException.class,
+ () ->
+ statement.execute(
+ String.format(
+ "ALTER DATABASE %s WITH
MAX_DATA_REGION_GROUP_NUM=12;", database)));
+ Assert.assertTrue(
+ exception.getMessage(),
+ exception
+ .getMessage()
+ .contains(
+ "MaxDataRegionGroupNum should be greater than or equal to
current max "
+ + "DataRegionGroupNum: 16."));
+
+ try (final ResultSet resultSet =
+ statement.executeQuery("SHOW DATABASES DETAILS " + database)) {
+ Assert.assertTrue(resultSet.next());
+ Assert.assertEquals(16, resultSet.getInt("MaxDataRegionGroupNum"));
+ Assert.assertFalse(resultSet.next());
+ }
+
+ final String schemaDatabase = "root.rg_tree_decrease_schema";
+ statement.execute(
+ String.format("CREATE DATABASE %s WITH
MAX_SCHEMA_REGION_GROUP_NUM=4;", schemaDatabase));
+ statement.execute(
+ String.format("ALTER DATABASE %s WITH
MAX_SCHEMA_REGION_GROUP_NUM=5;", schemaDatabase));
+
+ final SQLException schemaException =
+ Assert.assertThrows(
+ SQLException.class,
+ () ->
+ statement.execute(
+ String.format(
+ "ALTER DATABASE %s WITH
MAX_SCHEMA_REGION_GROUP_NUM=3;",
+ schemaDatabase)));
+ Assert.assertTrue(
+ schemaException.getMessage(),
+ schemaException
+ .getMessage()
+ .contains(
+ "MaxSchemaRegionGroupNum should be greater than or equal to
current max "
+ + "SchemaRegionGroupNum: 5."));
+
+ try (final ResultSet resultSet =
+ statement.executeQuery("SHOW DATABASES DETAILS " + schemaDatabase)) {
+ Assert.assertTrue(resultSet.next());
+ Assert.assertEquals(5, resultSet.getInt("MaxSchemaRegionGroupNum"));
+ Assert.assertFalse(resultSet.next());
+ }
+ }
+ }
+
@Test
public void testDeprecatedRegionGroupNumSqlRejected() throws SQLException {
try (final Connection connection = EnvFactory.getEnv().getConnection();
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
index 90966f6406e..cdca1fd1b76 100644
---
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
@@ -89,6 +89,22 @@ public class IoTDBDatabaseMaxRegionGroupNumIT {
"database,max_schema_region_group_num,max_data_region_group_num,",
Collections.singleton("test_create,3,4,"));
+ statement.execute("create database test_create_schema
with(max_schema_region_group_num=3)");
+ TestUtils.assertResultSetEqual(
+ statement.executeQuery(
+ "select database, max_schema_region_group_num,
max_data_region_group_num "
+ + "from information_schema.databases where database =
'test_create_schema'"),
+ "database,max_schema_region_group_num,max_data_region_group_num,",
+ Collections.singleton("test_create_schema,3," +
DEFAULT_DATA_REGION_GROUP_NUM + ","));
+
+ statement.execute("create database test_create_data
with(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_data'"),
+ "database,max_schema_region_group_num,max_data_region_group_num,",
+ Collections.singleton("test_create_data," +
DEFAULT_SCHEMA_REGION_GROUP_NUM + ",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");
@@ -113,6 +129,63 @@ public class IoTDBDatabaseMaxRegionGroupNumIT {
}
}
+ @Test
+ public void testAlterMaxRegionGroupNumCannotDecrease() throws SQLException {
+ try (final Connection connection =
+ EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
+ final Statement statement = connection.createStatement()) {
+ statement.execute("create database test_decrease_data
with(max_data_region_group_num=8)");
+ statement.execute(
+ "alter database test_decrease_data set properties
max_data_region_group_num=16");
+
+ final SQLException exception =
+ Assert.assertThrows(
+ SQLException.class,
+ () ->
+ statement.execute(
+ "alter database test_decrease_data set properties
max_data_region_group_num=12"));
+ Assert.assertTrue(
+ exception.getMessage(),
+ exception
+ .getMessage()
+ .contains(
+ "MaxDataRegionGroupNum should be greater than or equal to
current max "
+ + "DataRegionGroupNum: 16."));
+
+ TestUtils.assertResultSetEqual(
+ statement.executeQuery(
+ "select database, max_data_region_group_num from
information_schema.databases "
+ + "where database = 'test_decrease_data'"),
+ "database,max_data_region_group_num,",
+ Collections.singleton("test_decrease_data,16,"));
+
+ statement.execute("create database test_decrease_schema
with(max_schema_region_group_num=4)");
+ statement.execute(
+ "alter database test_decrease_schema set properties
max_schema_region_group_num=5");
+
+ final SQLException schemaException =
+ Assert.assertThrows(
+ SQLException.class,
+ () ->
+ statement.execute(
+ "alter database test_decrease_schema set properties
max_schema_region_group_num=3"));
+ Assert.assertTrue(
+ schemaException.getMessage(),
+ schemaException
+ .getMessage()
+ .contains(
+ "MaxSchemaRegionGroupNum should be greater than or equal to
current max "
+ + "SchemaRegionGroupNum: 5."));
+
+ TestUtils.assertResultSetEqual(
+ statement.executeQuery(
+ "select database, max_schema_region_group_num from
information_schema.databases "
+ + "where database = 'test_decrease_schema'"),
+ "database,max_schema_region_group_num,",
+ Collections.singleton("test_decrease_schema,5,"));
+ }
+ }
+
@Test
public void testAllocatedRegionGroupNumEqualsQuotaAfterAlterAndWrite()
throws SQLException {
try (final Connection connection =
diff --git
a/iotdb-core/confignode/src/main/i18n/en/org/apache/iotdb/confignode/i18n/ManagerMessages.java
b/iotdb-core/confignode/src/main/i18n/en/org/apache/iotdb/confignode/i18n/ManagerMessages.java
index 812c38c0437..082fcd9439b 100644
---
a/iotdb-core/confignode/src/main/i18n/en/org/apache/iotdb/confignode/i18n/ManagerMessages.java
+++
b/iotdb-core/confignode/src/main/i18n/en/org/apache/iotdb/confignode/i18n/ManagerMessages.java
@@ -598,6 +598,9 @@ public final class ManagerMessages {
public static final String
MESSAGE_CURRENT_SCHEMAREGIONGROUPNUM_ARG_ALTER_SCHEMAREGIONGROUPNUM_ARG_F7495BC2
= "Current SchemaRegionGroupNum: %d, Alter SchemaRegionGroupNum: %d";
public static final String
MESSAGE_FAILED_ALTER_DATABASE_DATAREGIONGROUPNUM_COULD_ONLY_INCREASED_84283EB5
= "Failed to alter database. The DataRegionGroupNum could only be increased. ";
public static final String
MESSAGE_CURRENT_DATAREGIONGROUPNUM_ARG_ALTER_DATAREGIONGROUPNUM_ARG_61C6E978 =
"Current DataRegionGroupNum: %d, Alter DataRegionGroupNum: %d";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MIN_ARG_REGIONGROUPNUM_ARG_B81D93DF
= "%s should be greater than or equal to current min %sRegionGroupNum: %d.";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MAX_ARG_REGIONGROUPNUM_ARG_3D170323
= "%s should be greater than or equal to current max %sRegionGroupNum: %d.";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_ALLOCATED_ARG_REGIONGROUPNUM_ARG_994394A1
= "%s should be greater than or equal to allocated %sRegionGroupNum: %d.";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_SCHEMAREPLICATIONFACTOR_SHOULD_POSITIVE_8847F33C
= "Failed to create database. The schemaReplicationFactor should be positive.";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_DATAREPLICATIONFACTOR_SHOULD_POSITIVE_C2565B7E =
"Failed to create database. The dataReplicationFactor should be positive.";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_TIMEPARTITIONORIGIN_SHOULD_NON_NEGATIVE_BD0595C9
= "Failed to create database. The timePartitionOrigin should be non-negative.";
diff --git
a/iotdb-core/confignode/src/main/i18n/zh/org/apache/iotdb/confignode/i18n/ManagerMessages.java
b/iotdb-core/confignode/src/main/i18n/zh/org/apache/iotdb/confignode/i18n/ManagerMessages.java
index 9c508beacf4..072c2b728a2 100644
---
a/iotdb-core/confignode/src/main/i18n/zh/org/apache/iotdb/confignode/i18n/ManagerMessages.java
+++
b/iotdb-core/confignode/src/main/i18n/zh/org/apache/iotdb/confignode/i18n/ManagerMessages.java
@@ -590,6 +590,9 @@ public final class ManagerMessages {
public static final String
MESSAGE_CURRENT_SCHEMAREGIONGROUPNUM_ARG_ALTER_SCHEMAREGIONGROUPNUM_ARG_F7495BC2
= "当前 SchemaRegionGroupNum:%d,待修改的 SchemaRegionGroupNum:%d";
public static final String
MESSAGE_FAILED_ALTER_DATABASE_DATAREGIONGROUPNUM_COULD_ONLY_INCREASED_84283EB5
= "修改数据库失败。DataRegionGroupNum 只能增加。";
public static final String
MESSAGE_CURRENT_DATAREGIONGROUPNUM_ARG_ALTER_DATAREGIONGROUPNUM_ARG_61C6E978 =
"当前 DataRegionGroupNum:%d,待修改的 DataRegionGroupNum:%d";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MIN_ARG_REGIONGROUPNUM_ARG_B81D93DF
= "%s 应大于等于当前最小 %sRegionGroupNum:%d。";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MAX_ARG_REGIONGROUPNUM_ARG_3D170323
= "%s 应大于等于当前最大 %sRegionGroupNum:%d。";
+ public static final String
MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_ALLOCATED_ARG_REGIONGROUPNUM_ARG_994394A1
= "%s 应大于等于已分配的 %sRegionGroupNum:%d。";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_SCHEMAREPLICATIONFACTOR_SHOULD_POSITIVE_8847F33C
= "创建数据库失败。schemaReplicationFactor 应为正数。";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_DATAREPLICATIONFACTOR_SHOULD_POSITIVE_C2565B7E =
"创建数据库失败。dataReplicationFactor 应为正数。";
public static final String
MESSAGE_FAILED_CREATE_DATABASE_TIMEPARTITIONORIGIN_SHOULD_NON_NEGATIVE_BD0595C9
= "创建数据库失败。timePartitionOrigin 应为非负数。";
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 b352b067a4d..0e5cf10bbe4 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
@@ -934,16 +934,16 @@ public class ClusterSchemaManager {
.FAILED_TO_CREATE_DATABASE_THE_DATAREGIONGROUPNUM_SHOULD_BE_POSITIVE);
}
- if (databaseSchema.isSetMaxSchemaRegionGroupNum()) {
+ if (!isErrorStatus(errorResp) &&
databaseSchema.isSetMaxSchemaRegionGroupNum()) {
errorResp =
validateMaxRegionGroupNumOnCreation(databaseSchema,
TConsensusGroupType.SchemaRegion);
}
- if (databaseSchema.isSetMaxDataRegionGroupNum()) {
+ if (!isErrorStatus(errorResp) &&
databaseSchema.isSetMaxDataRegionGroupNum()) {
errorResp =
validateMaxRegionGroupNumOnCreation(databaseSchema,
TConsensusGroupType.DataRegion);
}
- if (errorResp != null) {
+ if (isErrorStatus(errorResp)) {
LOGGER.warn(ConfigNodeMessages.EXECUTE_SETDATABASE_WITH_RESULT,
databaseSchema, errorResp);
return errorResp;
}
@@ -958,6 +958,10 @@ public class ClusterSchemaManager {
return StatusUtils.OK;
}
+ private static boolean isErrorStatus(final TSStatus status) {
+ return status != null && status.getCode() !=
TSStatusCode.SUCCESS_STATUS.getStatusCode();
+ }
+
private static TSStatus validateMaxRegionGroupNumOnCreation(
final TDatabaseSchema databaseSchema, final TConsensusGroupType
consensusGroupType) {
return validateMaxRegionGroupNum(
@@ -1021,8 +1025,23 @@ public class ClusterSchemaManager {
return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
.setMessage(
String.format(
- "%s should be greater than or equal to current min
%sRegionGroupNum: %d.",
- fieldName, isSchemaRegion ? "Schema" : "Data",
minRegionGroupNum));
+ ManagerMessages
+
.MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MIN_ARG_REGIONGROUPNUM_ARG_B81D93DF,
+ fieldName,
+ isSchemaRegion ? "Schema" : "Data",
+ minRegionGroupNum));
+ }
+
+ final int currentMaxRegionGroupNum = getMaxRegionGroupNum(database,
consensusGroupType);
+ if (maxRegionGroupNum < currentMaxRegionGroupNum) {
+ return new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+ .setMessage(
+ String.format(
+ ManagerMessages
+
.MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_CURRENT_MAX_ARG_REGIONGROUPNUM_ARG_3D170323,
+ fieldName,
+ isSchemaRegion ? "Schema" : "Data",
+ currentMaxRegionGroupNum));
}
final int allocatedRegionGroupCount;
@@ -1037,8 +1056,11 @@ public class ClusterSchemaManager {
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));
+ ManagerMessages
+
.MESSAGE_ARG_SHOULD_BE_GREATER_THAN_OR_EQUAL_TO_ALLOCATED_ARG_REGIONGROUPNUM_ARG_994394A1,
+ fieldName,
+ isSchemaRegion ? "Schema" : "Data",
+ allocatedRegionGroupCount));
}
return StatusUtils.OK;