This is an automated email from the ASF dual-hosted git repository. yongzao pushed a commit to branch Support-cluster-Database-heterogeneous-by-ALTER-SQL in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit a6b67162adf0fd9328150e2cb0a055c71f310aec Author: YongzaoDan <[email protected]> AuthorDate: Thu Feb 2 16:53:53 2023 +0800 Finish DataNode part --- .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 | 7 +++- .../org/apache/iotdb/db/audit/AuditLogger.java | 2 +- .../org/apache/iotdb/db/auth/AuthorityChecker.java | 2 +- .../apache/iotdb/db/client/ConfigNodeClient.java | 27 ++++++++++-- .../iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java | 5 ++- .../db/mpp/plan/analyze/cache/PartitionCache.java | 4 +- .../plan/execution/config/ConfigTaskVisitor.java | 13 ++++-- .../config/executor/ClusterConfigTaskExecutor.java | 43 +++++++++++++++---- .../config/executor/IConfigTaskExecutor.java | 7 ++-- ...orageGroupTask.java => DatabaseSchemaTask.java} | 48 ++++++++++++---------- .../iotdb/db/mpp/plan/parser/ASTVisitor.java | 35 ++++++++++------ .../db/mpp/plan/parser/StatementGenerator.java | 5 ++- .../iotdb/db/mpp/plan/statement/StatementType.java | 2 +- .../db/mpp/plan/statement/StatementVisitor.java | 10 +++-- ...Statement.java => DatabaseSchemaStatement.java} | 27 ++++++++++-- .../service/thrift/impl/ClientRPCServiceImpl.java | 6 +-- .../db/sync/transport/server/ReceiverManager.java | 5 ++- .../src/main/thrift/confignode.thrift | 16 +++++--- 18 files changed, 183 insertions(+), 81 deletions(-) diff --git a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 index cc8807580f..8fde528c21 100644 --- a/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 +++ b/antlr/src/main/antlr4/org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4 @@ -38,7 +38,7 @@ statement ddlStatement : createStorageGroup | createTimeseries | createSchemaTemplate | createTimeseriesOfSchemaTemplate | createFunction | createTrigger | createContinuousQuery - | alterTimeseries | deleteStorageGroup | deleteTimeseries | deletePartition | deleteTimeseriesOfSchemaTemplate + | alterTimeseries | alterStorageGroup | deleteStorageGroup | deleteTimeseries | deletePartition | deleteTimeseriesOfSchemaTemplate | dropFunction | dropTrigger | dropContinuousQuery | dropSchemaTemplate | setTTL | unsetTTL | startTrigger | stopTrigger | setSchemaTemplate | unsetSchemaTemplate | showStorageGroup | showDevices | showTimeseries | showChildPaths | showChildNodes @@ -86,6 +86,11 @@ storageGroupAttributeClause : (TTL | SCHEMA_REPLICATION_FACTOR | DATA_REPLICATION_FACTOR | TIME_PARTITION_INTERVAL | SCHEMA_REGION_GROUP_NUM | DATA_REGION_GROUP_NUM) '=' INTEGER_LITERAL ; +// Alter StorageGroup +alterStorageGroup + : ALTER (STORAGE GROUP | DATABASE) prefixPath storageGroupAttributesClause + ; + // Create Timeseries createTimeseries : CREATE ALIGNED TIMESERIES fullPath alignedMeasurements? #createAlignedTimeseries diff --git a/server/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java b/server/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java index a407bd7b35..4d7e7f94bd 100644 --- a/server/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java +++ b/server/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java @@ -140,7 +140,7 @@ public class AuditLogger { case REVOKE_ROLE_PRIVILEGE: case GRANT_WATERMARK_EMBEDDING: case REVOKE_WATERMARK_EMBEDDING: - case SET_STORAGE_GROUP: + case STORAGE_GROUP_SCHEMA: case DELETE_STORAGE_GROUP: case CREATE_TIMESERIES: case CREATE_ALIGNED_TIMESERIES: diff --git a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java index 99e9fbbbb1..62a89050bf 100644 --- a/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java +++ b/server/src/main/java/org/apache/iotdb/db/auth/AuthorityChecker.java @@ -159,7 +159,7 @@ public class AuthorityChecker { return PrivilegeType.GRANT_USER_ROLE.ordinal(); case REVOKE_USER_ROLE: return PrivilegeType.REVOKE_USER_ROLE.ordinal(); - case SET_STORAGE_GROUP: + case STORAGE_GROUP_SCHEMA: case TTL: return PrivilegeType.CREATE_DATABASE.ordinal(); case DELETE_STORAGE_GROUP: diff --git a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java index 48133e9981..8ddf9dccec 100644 --- a/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java +++ b/server/src/main/java/org/apache/iotdb/db/client/ConfigNodeClient.java @@ -97,7 +97,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TSetDataNodeStatusReq; import org.apache.iotdb.confignode.rpc.thrift.TSetDataReplicationFactorReq; import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaReplicationFactorReq; import org.apache.iotdb.confignode.rpc.thrift.TSetSchemaTemplateReq; -import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq; import org.apache.iotdb.confignode.rpc.thrift.TSetTimePartitionIntervalReq; import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp; import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp; @@ -113,6 +112,7 @@ import org.apache.iotdb.confignode.rpc.thrift.TShowStorageGroupResp; import org.apache.iotdb.confignode.rpc.thrift.TShowTrailReq; import org.apache.iotdb.confignode.rpc.thrift.TShowTrailResp; import org.apache.iotdb.confignode.rpc.thrift.TShowVariablesResp; +import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp; import org.apache.iotdb.confignode.rpc.thrift.TSystemConfigurationResp; import org.apache.iotdb.confignode.rpc.thrift.TUnsetSchemaTemplateReq; @@ -492,10 +492,31 @@ public class ConfigNodeClient implements IConfigNodeRPCService.Iface, ThriftClie } @Override - public TSStatus setStorageGroup(TSetStorageGroupReq req) throws TException { + public TSStatus setDatabase(TStorageGroupSchema databaseSchema) throws TException { for (int i = 0; i < RETRY_NUM; i++) { try { - TSStatus status = client.setStorageGroup(req); + TSStatus status = client.setDatabase(databaseSchema); + if (!updateConfigNodeLeader(status)) { + return status; + } + } catch (TException e) { + logger.warn( + "Failed to connect to ConfigNode {} from DataNode {} when executing {}", + configNode, + config.getAddressAndPort(), + Thread.currentThread().getStackTrace()[1].getMethodName()); + configLeader = null; + } + waitAndReconnect(); + } + throw new TException(MSG_RECONNECTION_FAIL); + } + + @Override + public TSStatus alterDatabase(TStorageGroupSchema databaseSchema) throws TException { + for (int i = 0; i < RETRY_NUM; i++) { + try { + TSStatus status = client.alterDatabase(databaseSchema); if (!updateConfigNodeLeader(status)) { return status; } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java index 3ad3545145..b43c20b55b 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java @@ -100,7 +100,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CountTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowClusterStatement; @@ -1976,7 +1976,8 @@ public class AnalyzeVisitor extends StatementVisitor<Analysis, MPPQueryContext> } for (PartialPath sgPath : sgSet) { - SetStorageGroupStatement statement = new SetStorageGroupStatement(); + DatabaseSchemaStatement statement = + new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE); statement.setStorageGroupPath(sgPath); executeSetStorageGroupStatement(statement); } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java index 26e60f8782..16dff082fe 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/cache/PartitionCache.java @@ -38,7 +38,6 @@ import org.apache.iotdb.commons.partition.executor.SeriesPartitionExecutor; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.confignode.rpc.thrift.TRegionRouteMapResp; -import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchemaResp; import org.apache.iotdb.db.client.ConfigNodeClient; @@ -238,8 +237,7 @@ public class PartitionCache { for (String storageGroupName : storageGroupNamesNeedCreated) { TStorageGroupSchema storageGroupSchema = new TStorageGroupSchema(); storageGroupSchema.setName(storageGroupName); - TSetStorageGroupReq req = new TSetStorageGroupReq(storageGroupSchema); - TSStatus tsStatus = client.setStorageGroup(req); + TSStatus tsStatus = client.setDatabase(storageGroupSchema); if (TSStatusCode.SUCCESS_STATUS.getStatusCode() == tsStatus.getCode()) { successFullyCreatedStorageGroup.add(storageGroupName); } else { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java index 14d8fea3d1..b5d71185e6 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/ConfigTaskVisitor.java @@ -23,6 +23,7 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CountStorageGroupT import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CreateContinuousQueryTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CreateFunctionTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CreateTriggerTask; +import org.apache.iotdb.db.mpp.plan.execution.config.metadata.DatabaseSchemaTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.DeleteStorageGroupTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.DeleteTimeSeriesTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.DropContinuousQueryTask; @@ -32,7 +33,6 @@ import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetRegionIdTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetSeriesSlotListTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetTimeSlotListTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.MigrateRegionTask; -import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetStorageGroupTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetTTLTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterDetailsTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterTask; @@ -76,6 +76,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CountStorageGroupStatemen import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DropContinuousQueryStatement; @@ -85,7 +86,6 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetTimeSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.MigrateRegionStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.SetTTLStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowClusterStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowConfigNodesStatement; @@ -138,8 +138,13 @@ public class ConfigTaskVisitor } @Override - public IConfigTask visitSetStorageGroup(SetStorageGroupStatement statement, TaskContext context) { - return new SetStorageGroupTask(statement); + public IConfigTask visitSetDatabase(DatabaseSchemaStatement statement, TaskContext context) { + return new DatabaseSchemaTask(statement); + } + + @Override + public IConfigTask visitAlterDatabase(DatabaseSchemaStatement statement, TaskContext context) { + return new DatabaseSchemaTask(statement); } @Override diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java index d9fbf026b8..e835df708b 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/ClusterConfigTaskExecutor.java @@ -59,7 +59,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TGetUDFTableResp; import org.apache.iotdb.confignode.rpc.thrift.TMigrateRegionReq; import org.apache.iotdb.confignode.rpc.thrift.TPipeSinkInfo; import org.apache.iotdb.confignode.rpc.thrift.TRegionInfo; -import org.apache.iotdb.confignode.rpc.thrift.TSetStorageGroupReq; import org.apache.iotdb.confignode.rpc.thrift.TShowCQResp; import org.apache.iotdb.confignode.rpc.thrift.TShowClusterResp; import org.apache.iotdb.confignode.rpc.thrift.TShowConfigNodesResp; @@ -84,10 +83,10 @@ import org.apache.iotdb.db.metadata.template.Template; import org.apache.iotdb.db.mpp.plan.analyze.Analyzer; import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.CountStorageGroupTask; +import org.apache.iotdb.db.mpp.plan.execution.config.metadata.DatabaseSchemaTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetRegionIdTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetSeriesSlotListTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.GetTimeSlotListTask; -import org.apache.iotdb.db.mpp.plan.execution.config.metadata.SetStorageGroupTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterDetailsTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowClusterTask; import org.apache.iotdb.db.mpp.plan.execution.config.metadata.ShowConfigNodesTask; @@ -107,13 +106,13 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CountStorageGroupStatemen import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetTimeSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.MigrateRegionStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.SetTTLStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowClusterStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDataNodesStatement; @@ -200,22 +199,48 @@ public class ClusterConfigTaskExecutor implements IConfigTaskExecutor { } @Override - public SettableFuture<ConfigTaskResult> setStorageGroup( - SetStorageGroupStatement setStorageGroupStatement) { + public SettableFuture<ConfigTaskResult> setDatabase( + DatabaseSchemaStatement databaseSchemaStatement) { SettableFuture<ConfigTaskResult> future = SettableFuture.create(); // Construct request using statement TStorageGroupSchema storageGroupSchema = - SetStorageGroupTask.constructStorageGroupSchema(setStorageGroupStatement); - TSetStorageGroupReq req = new TSetStorageGroupReq(storageGroupSchema); + DatabaseSchemaTask.constructStorageGroupSchema(databaseSchemaStatement); try (ConfigNodeClient configNodeClient = CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.configNodeRegionId)) { // Send request to some API server - TSStatus tsStatus = configNodeClient.setStorageGroup(req); + TSStatus tsStatus = configNodeClient.setDatabase(storageGroupSchema); // Get response or throw exception if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { LOGGER.warn( "Failed to execute create database {} in config node, status is {}.", - setStorageGroupStatement.getStorageGroupPath(), + databaseSchemaStatement.getStorageGroupPath(), + tsStatus); + future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); + } else { + future.set(new ConfigTaskResult(TSStatusCode.SUCCESS_STATUS)); + } + } catch (ClientManagerException | TException e) { + future.setException(e); + } + return future; + } + + @Override + public SettableFuture<ConfigTaskResult> alterDatabase( + DatabaseSchemaStatement databaseSchemaStatement) { + SettableFuture<ConfigTaskResult> future = SettableFuture.create(); + // Construct request using statement + TStorageGroupSchema storageGroupSchema = + DatabaseSchemaTask.constructStorageGroupSchema(databaseSchemaStatement); + try (ConfigNodeClient configNodeClient = + CONFIG_NODE_CLIENT_MANAGER.borrowClient(ConfigNodeInfo.configNodeRegionId)) { + // Send request to some API server + TSStatus tsStatus = configNodeClient.alterDatabase(storageGroupSchema); + // Get response or throw exception + if (TSStatusCode.SUCCESS_STATUS.getStatusCode() != tsStatus.getCode()) { + LOGGER.warn( + "Failed to execute create database {} in config node, status is {}.", + databaseSchemaStatement.getStorageGroupPath(), tsStatus); future.setException(new IoTDBException(tsStatus.message, tsStatus.code)); } else { diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java index ba75d3cadd..03ac9fa524 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/executor/IConfigTaskExecutor.java @@ -26,13 +26,13 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CountStorageGroupStatemen import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetTimeSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.MigrateRegionStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.SetTTLStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowClusterStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowDataNodesStatement; @@ -61,8 +61,9 @@ import com.google.common.util.concurrent.SettableFuture; public interface IConfigTaskExecutor { - SettableFuture<ConfigTaskResult> setStorageGroup( - SetStorageGroupStatement setStorageGroupStatement); + SettableFuture<ConfigTaskResult> setDatabase(DatabaseSchemaStatement databaseSchemaStatement); + + SettableFuture<ConfigTaskResult> alterDatabase(DatabaseSchemaStatement databaseSchemaStatement); SettableFuture<ConfigTaskResult> showStorageGroup( ShowStorageGroupStatement showStorageGroupStatement); diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/SetStorageGroupTask.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/DatabaseSchemaTask.java similarity index 54% rename from server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/SetStorageGroupTask.java rename to server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/DatabaseSchemaTask.java index c5b601a451..2771f3cb49 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/SetStorageGroupTask.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/execution/config/metadata/DatabaseSchemaTask.java @@ -23,51 +23,57 @@ import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema; import org.apache.iotdb.db.mpp.plan.execution.config.ConfigTaskResult; import org.apache.iotdb.db.mpp.plan.execution.config.IConfigTask; import org.apache.iotdb.db.mpp.plan.execution.config.executor.IConfigTaskExecutor; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import com.google.common.util.concurrent.ListenableFuture; -public class SetStorageGroupTask implements IConfigTask { +public class DatabaseSchemaTask implements IConfigTask { - private final SetStorageGroupStatement setStorageGroupStatement; + private final DatabaseSchemaStatement databaseSchemaStatement; - public SetStorageGroupTask(SetStorageGroupStatement setStorageGroupStatement) { - this.setStorageGroupStatement = setStorageGroupStatement; + public DatabaseSchemaTask(DatabaseSchemaStatement databaseSchemaStatement) { + this.databaseSchemaStatement = databaseSchemaStatement; } @Override public ListenableFuture<ConfigTaskResult> execute(IConfigTaskExecutor configTaskExecutor) { // If the action is executed successfully, return the Future. // If your operation is async, you can return the corresponding future directly. - return configTaskExecutor.setStorageGroup(setStorageGroupStatement); + switch (databaseSchemaStatement.getSubType()) { + case CREATE: + return configTaskExecutor.setDatabase(databaseSchemaStatement); + case ALTER: + default: + return configTaskExecutor.alterDatabase(databaseSchemaStatement); + } } - /** construct create database schema according to statement */ + /** Construct DatabaseSchema according to statement */ public static TStorageGroupSchema constructStorageGroupSchema( - SetStorageGroupStatement setStorageGroupStatement) { + DatabaseSchemaStatement databaseSchemaStatement) { TStorageGroupSchema storageGroupSchema = new TStorageGroupSchema(); - storageGroupSchema.setName(setStorageGroupStatement.getStorageGroupPath().getFullPath()); - if (setStorageGroupStatement.getTTL() != null) { - storageGroupSchema.setTTL(setStorageGroupStatement.getTTL()); + storageGroupSchema.setName(databaseSchemaStatement.getStorageGroupPath().getFullPath()); + if (databaseSchemaStatement.getTTL() != null) { + storageGroupSchema.setTTL(databaseSchemaStatement.getTTL()); } - if (setStorageGroupStatement.getSchemaReplicationFactor() != null) { + if (databaseSchemaStatement.getSchemaReplicationFactor() != null) { storageGroupSchema.setSchemaReplicationFactor( - setStorageGroupStatement.getSchemaReplicationFactor()); + databaseSchemaStatement.getSchemaReplicationFactor()); } - if (setStorageGroupStatement.getDataReplicationFactor() != null) { + if (databaseSchemaStatement.getDataReplicationFactor() != null) { storageGroupSchema.setDataReplicationFactor( - setStorageGroupStatement.getDataReplicationFactor()); + databaseSchemaStatement.getDataReplicationFactor()); } - if (setStorageGroupStatement.getTimePartitionInterval() != null) { + if (databaseSchemaStatement.getTimePartitionInterval() != null) { storageGroupSchema.setTimePartitionInterval( - setStorageGroupStatement.getTimePartitionInterval()); + databaseSchemaStatement.getTimePartitionInterval()); } - if (setStorageGroupStatement.getSchemaRegionGroupNum() != null) { + if (databaseSchemaStatement.getSchemaRegionGroupNum() != null) { storageGroupSchema.setMinSchemaRegionGroupNum( - setStorageGroupStatement.getSchemaRegionGroupNum()); + databaseSchemaStatement.getSchemaRegionGroupNum()); } - if (setStorageGroupStatement.getDataRegionGroupNum() != null) { - storageGroupSchema.setMinDataRegionGroupNum(setStorageGroupStatement.getDataRegionGroupNum()); + if (databaseSchemaStatement.getDataRegionGroupNum() != null) { + storageGroupSchema.setMinDataRegionGroupNum(databaseSchemaStatement.getDataRegionGroupNum()); } return storageGroupSchema; } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java index 4be6e2b70b..493abc4b3d 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/ASTVisitor.java @@ -102,6 +102,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateContinuousQueryStat import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DropContinuousQueryStatement; @@ -111,7 +112,6 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetTimeSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.MigrateRegionStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.SetTTLStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement; @@ -1921,39 +1921,50 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> { // Create database @Override public Statement visitCreateStorageGroup(IoTDBSqlParser.CreateStorageGroupContext ctx) { - SetStorageGroupStatement setStorageGroupStatement = new SetStorageGroupStatement(); + DatabaseSchemaStatement databaseSchemaStatement = + new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE); PartialPath path = parsePrefixPath(ctx.prefixPath()); - setStorageGroupStatement.setStorageGroupPath(path); + databaseSchemaStatement.setStorageGroupPath(path); if (ctx.storageGroupAttributesClause() != null) { parseStorageGroupAttributesClause( - setStorageGroupStatement, ctx.storageGroupAttributesClause()); + databaseSchemaStatement, ctx.storageGroupAttributesClause()); } - return setStorageGroupStatement; + return databaseSchemaStatement; + } + + @Override + public Statement visitAlterStorageGroup(IoTDBSqlParser.AlterStorageGroupContext ctx) { + DatabaseSchemaStatement databaseSchemaStatement = + new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.ALTER); + PartialPath path = parsePrefixPath(ctx.prefixPath()); + databaseSchemaStatement.setStorageGroupPath(path); + parseStorageGroupAttributesClause(databaseSchemaStatement, ctx.storageGroupAttributesClause()); + return databaseSchemaStatement; } private void parseStorageGroupAttributesClause( - SetStorageGroupStatement setStorageGroupStatement, + DatabaseSchemaStatement databaseSchemaStatement, IoTDBSqlParser.StorageGroupAttributesClauseContext ctx) { for (IoTDBSqlParser.StorageGroupAttributeClauseContext attribute : ctx.storageGroupAttributeClause()) { if (attribute.TTL() != null) { long ttl = Long.parseLong(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setTTL(ttl); + databaseSchemaStatement.setTTL(ttl); } else if (attribute.SCHEMA_REPLICATION_FACTOR() != null) { int schemaReplicationFactor = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setSchemaReplicationFactor(schemaReplicationFactor); + databaseSchemaStatement.setSchemaReplicationFactor(schemaReplicationFactor); } else if (attribute.DATA_REPLICATION_FACTOR() != null) { int dataReplicationFactor = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setDataReplicationFactor(dataReplicationFactor); + databaseSchemaStatement.setDataReplicationFactor(dataReplicationFactor); } else if (attribute.TIME_PARTITION_INTERVAL() != null) { long timePartitionInterval = Long.parseLong(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setTimePartitionInterval(timePartitionInterval); + databaseSchemaStatement.setTimePartitionInterval(timePartitionInterval); } else if (attribute.SCHEMA_REGION_GROUP_NUM() != null) { int schemaRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setSchemaRegionGroupNum(schemaRegionGroupNum); + databaseSchemaStatement.setSchemaRegionGroupNum(schemaRegionGroupNum); } else if (attribute.DATA_REGION_GROUP_NUM() != null) { int dataRegionGroupNum = Integer.parseInt(attribute.INTEGER_LITERAL().getText()); - setStorageGroupStatement.setDataRegionGroupNum(dataRegionGroupNum); + databaseSchemaStatement.setDataRegionGroupNum(dataRegionGroupNum); } } } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java index ec43ef2d91..cb482524e4 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/parser/StatementGenerator.java @@ -51,9 +51,9 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.QueryStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement; @@ -423,7 +423,8 @@ public class StatementGenerator { public static Statement createStatement(String storageGroup) throws IllegalPathException { // construct create database statement - SetStorageGroupStatement statement = new SetStorageGroupStatement(); + DatabaseSchemaStatement statement = + new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE); statement.setStorageGroupPath(parseStorageGroupRawString(storageGroup)); return statement; } diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java index 96ef577f18..c4d4fdfeec 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementType.java @@ -49,7 +49,7 @@ public enum StatementType { GRANT_WATERMARK_EMBEDDING, REVOKE_WATERMARK_EMBEDDING, - SET_STORAGE_GROUP, + STORAGE_GROUP_SCHEMA, DELETE_STORAGE_GROUP, CREATE_TIMESERIES, CREATE_ALIGNED_TIMESERIES, diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java index c78db0b7af..9cac1d0646 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/StatementVisitor.java @@ -44,6 +44,7 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateFunctionStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTriggerStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DropContinuousQueryStatement; @@ -53,7 +54,6 @@ import org.apache.iotdb.db.mpp.plan.statement.metadata.GetRegionIdStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetSeriesSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.GetTimeSlotListStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.MigrateRegionStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.SetTTLStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildNodesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.ShowChildPathsStatement; @@ -159,8 +159,12 @@ public abstract class StatementVisitor<R, C> { return visitStatement(deleteStorageGroupStatement, context); } - public R visitSetStorageGroup(SetStorageGroupStatement setStorageGroupStatement, C context) { - return visitStatement(setStorageGroupStatement, context); + public R visitSetDatabase(DatabaseSchemaStatement databaseSchemaStatement, C context) { + return visitStatement(databaseSchemaStatement, context); + } + + public R visitAlterDatabase(DatabaseSchemaStatement databaseSchemaStatement, C context) { + return visitStatement(databaseSchemaStatement, context); } // Alter TTL diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/SetStorageGroupStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/DatabaseSchemaStatement.java similarity index 85% rename from server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/SetStorageGroupStatement.java rename to server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/DatabaseSchemaStatement.java index 46c55337b5..40ad82753c 100644 --- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/SetStorageGroupStatement.java +++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/metadata/DatabaseSchemaStatement.java @@ -29,7 +29,10 @@ import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor; import java.util.Collections; import java.util.List; -public class SetStorageGroupStatement extends Statement implements IConfigStatement { +public class DatabaseSchemaStatement extends Statement implements IConfigStatement { + + private final DatabaseSchemaStatementType subType; + private PartialPath storageGroupPath; private Long TTL = null; private Integer schemaReplicationFactor = null; @@ -38,9 +41,14 @@ public class SetStorageGroupStatement extends Statement implements IConfigStatem private Integer schemaRegionGroupNum = null; private Integer dataRegionGroupNum = null; - public SetStorageGroupStatement() { + public DatabaseSchemaStatement(DatabaseSchemaStatementType subType) { super(); - statementType = StatementType.SET_STORAGE_GROUP; + this.subType = subType; + statementType = StatementType.STORAGE_GROUP_SCHEMA; + } + + public DatabaseSchemaStatementType getSubType() { + return subType; } public PartialPath getStorageGroupPath() { @@ -101,7 +109,13 @@ public class SetStorageGroupStatement extends Statement implements IConfigStatem @Override public <R, C> R accept(StatementVisitor<R, C> visitor, C context) { - return visitor.visitSetStorageGroup(this, context); + switch (subType) { + case CREATE: + return visitor.visitSetDatabase(this, context); + case ALTER: + default: + return visitor.visitAlterDatabase(this, context); + } } @Override @@ -135,4 +149,9 @@ public class SetStorageGroupStatement extends Statement implements IConfigStatem + dataRegionGroupNum + '}'; } + + public enum DatabaseSchemaStatementType { + CREATE, + ALTER + } } diff --git a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java index 0c785ffc5d..947545dc72 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java +++ b/server/src/main/java/org/apache/iotdb/db/service/thrift/impl/ClientRPCServiceImpl.java @@ -53,9 +53,9 @@ import org.apache.iotdb.db.mpp.plan.statement.crud.InsertTabletStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateAlignedTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateMultiTimeSeriesStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.CreateTimeSeriesStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.DeleteTimeSeriesStatement; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.CreateSchemaTemplateStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.DropSchemaTemplateStatement; import org.apache.iotdb.db.mpp.plan.statement.metadata.template.SetSchemaTemplateStatement; @@ -651,8 +651,8 @@ public class ClientRPCServiceImpl implements IClientRPCServiceWithHandler { } // Step 1: Create SetStorageGroupStatement - SetStorageGroupStatement statement = - (SetStorageGroupStatement) StatementGenerator.createStatement(storageGroup); + DatabaseSchemaStatement statement = + (DatabaseSchemaStatement) StatementGenerator.createStatement(storageGroup); if (enableAuditLog) { AuditLogger.log(String.format("create database %s", storageGroup), statement); } diff --git a/server/src/main/java/org/apache/iotdb/db/sync/transport/server/ReceiverManager.java b/server/src/main/java/org/apache/iotdb/db/sync/transport/server/ReceiverManager.java index 8ae5dba86d..79a45de2ab 100644 --- a/server/src/main/java/org/apache/iotdb/db/sync/transport/server/ReceiverManager.java +++ b/server/src/main/java/org/apache/iotdb/db/sync/transport/server/ReceiverManager.java @@ -32,7 +32,7 @@ import org.apache.iotdb.db.mpp.plan.Coordinator; import org.apache.iotdb.db.mpp.plan.analyze.IPartitionFetcher; import org.apache.iotdb.db.mpp.plan.analyze.schema.ISchemaFetcher; import org.apache.iotdb.db.mpp.plan.execution.ExecutionResult; -import org.apache.iotdb.db.mpp.plan.statement.metadata.SetStorageGroupStatement; +import org.apache.iotdb.db.mpp.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.query.control.SessionManager; import org.apache.iotdb.db.sync.pipedata.PipeData; import org.apache.iotdb.db.sync.pipedata.TsFilePipeData; @@ -422,7 +422,8 @@ public class ReceiverManager { return true; } try { - SetStorageGroupStatement statement = new SetStorageGroupStatement(); + DatabaseSchemaStatement statement = + new DatabaseSchemaStatement(DatabaseSchemaStatement.DatabaseSchemaStatementType.CREATE); statement.setStorageGroupPath(new PartialPath(database)); long queryId = SessionManager.getInstance().requestQueryId(); ExecutionResult result = diff --git a/thrift-confignode/src/main/thrift/confignode.thrift b/thrift-confignode/src/main/thrift/confignode.thrift index 425402e3b2..124621fe81 100644 --- a/thrift-confignode/src/main/thrift/confignode.thrift +++ b/thrift-confignode/src/main/thrift/confignode.thrift @@ -145,11 +145,7 @@ struct TSetDataNodeStatusReq { 2: required string status } -// StorageGroup -struct TSetStorageGroupReq { - 1: required TStorageGroupSchema storageGroup -} - +// Database struct TDeleteStorageGroupReq { 1: required string prefixPath } @@ -792,7 +788,15 @@ service IConfigNodeRPCService { * PATH_ILLEGAL if the new StorageGroup's name is illegal * STORAGE_GROUP_ALREADY_EXISTS if the StorageGroup already exist */ - common.TSStatus setStorageGroup(TSetStorageGroupReq req) + common.TSStatus setDatabase(TStorageGroupSchema databaseSchema) + + /** + * Alter a StorageGroup's schema, including + * TTL, ReplicationFactor, timePartitionInterval and RegionGroupNum + * + * @return SUCCESS_STATUS if the specified StorageGroupSchema is altered successfully + */ + common.TSStatus alterDatabase(TStorageGroupSchema databaseSchema) /** * Generate a DeleteStorageGroupProcedure to delete a specific StorageGroup
