This is an automated email from the ASF dual-hosted git repository. luozenglin pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 17e206c538 [Feature](resource-group) Support drop resource group (#18873) 17e206c538 is described below commit 17e206c538d1ccb011dca8c1ee64177a8ca9bb13 Author: 赵立伟 <zhaoli...@xiaomi.com> AuthorDate: Mon Apr 24 14:00:00 2023 +0800 [Feature](resource-group) Support drop resource group (#18873) --- fe/fe-core/src/main/cup/sql_parser.cup | 4 ++ .../doris/analysis/DropResourceGroupStmt.java | 64 ++++++++++++++++++++++ .../org/apache/doris/journal/JournalEntity.java | 6 ++ .../persist/DropResourceGroupOperationLog.java | 53 ++++++++++++++++++ .../java/org/apache/doris/persist/EditLog.java | 10 ++++ .../org/apache/doris/persist/OperationType.java | 1 + .../main/java/org/apache/doris/qe/DdlExecutor.java | 3 + .../resource/resourcegroup/ResourceGroupMgr.java | 46 ++++++++++++++++ .../resourcegroup/ResourceGroupMgrTest.java | 29 ++++++++++ 9 files changed, 216 insertions(+) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 90903ab5e6..6bdcd354a0 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -3013,6 +3013,10 @@ drop_stmt ::= {: RESULT = new DropResourceStmt(ifExists, resourceName); :} + | KW_DROP KW_RESOURCE KW_GROUP opt_if_exists:ifExists ident_or_text:resourceGroupName + {: + RESULT = new DropResourceGroupStmt(ifExists, resourceGroupName); + :} | KW_DROP KW_ENCRYPTKEY opt_if_exists:ifExists encryptkey_name:keyName {: RESULT = new DropEncryptKeyStmt(ifExists, keyName); diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DropResourceGroupStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropResourceGroupStmt.java new file mode 100644 index 0000000000..3da3f5a683 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DropResourceGroupStmt.java @@ -0,0 +1,64 @@ +// 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.doris.analysis; + +import org.apache.doris.catalog.Env; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.FeNameFormat; +import org.apache.doris.common.UserException; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.qe.ConnectContext; + +public class DropResourceGroupStmt extends DdlStmt { + private boolean ifExists; + private String resourceGroupName; + + public DropResourceGroupStmt(boolean ifExists, String resourceGroupName) { + this.ifExists = ifExists; + this.resourceGroupName = resourceGroupName; + } + + public boolean isIfExists() { + return ifExists; + } + + public String getResourceGroupName() { + return resourceGroupName; + } + + @Override + public void analyze(Analyzer analyzer) throws UserException { + super.analyze(analyzer); + + // check auth + if (!Env.getCurrentEnv().getAccessManager().checkGlobalPriv(ConnectContext.get(), PrivPredicate.ADMIN)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "ADMIN"); + } + + FeNameFormat.checkResourceGroupName(resourceGroupName); + } + + @Override + public String toSql() { + StringBuilder sb = new StringBuilder(); + sb.append("DROP "); + sb.append("RESOURCE GROUP '").append(resourceGroupName).append("' "); + return sb.toString(); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java b/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java index dd66fb6d56..50aeb15080 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java +++ b/fe/fe-core/src/main/java/org/apache/doris/journal/JournalEntity.java @@ -83,6 +83,7 @@ import org.apache.doris.persist.DropDbInfo; import org.apache.doris.persist.DropInfo; import org.apache.doris.persist.DropLinkDbAndUpdateDbInfo; import org.apache.doris.persist.DropPartitionInfo; +import org.apache.doris.persist.DropResourceGroupOperationLog; import org.apache.doris.persist.DropResourceOperationLog; import org.apache.doris.persist.DropSqlBlockRuleOperationLog; import org.apache.doris.persist.GlobalVarPersistInfo; @@ -807,6 +808,11 @@ public class JournalEntity implements Writable { isRead = true; break; } + case OperationType.OP_DROP_RESOURCE_GROUP: { + data = DropResourceGroupOperationLog.read(in); + isRead = true; + break; + } case OperationType.OP_ALTER_LIGHT_SCHEMA_CHANGE: { data = AlterLightSchemaChangeInfo.read(in); isRead = true; diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/DropResourceGroupOperationLog.java b/fe/fe-core/src/main/java/org/apache/doris/persist/DropResourceGroupOperationLog.java new file mode 100644 index 0000000000..5a912ab0f1 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/DropResourceGroupOperationLog.java @@ -0,0 +1,53 @@ +// 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.doris.persist; + +import org.apache.doris.common.io.Text; +import org.apache.doris.common.io.Writable; +import org.apache.doris.persist.gson.GsonUtils; + +import com.google.gson.annotations.SerializedName; + +import java.io.DataInput; +import java.io.DataOutput; +import java.io.IOException; + +/** + * For resource group drop + */ +public class DropResourceGroupOperationLog implements Writable { + @SerializedName(value = "id") + private long id; + + public DropResourceGroupOperationLog(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + @Override + public void write(DataOutput out) throws IOException { + Text.writeString(out, GsonUtils.GSON.toJson(this)); + } + + public static DropResourceGroupOperationLog read(DataInput in) throws IOException { + return GsonUtils.GSON.fromJson(Text.readString(in), DropResourceGroupOperationLog.class); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java index 39998dbb01..b20f5a3be7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java @@ -1012,6 +1012,12 @@ public class EditLog { env.getResourceGroupMgr().replayCreateResourceGroup(resourceGroup); break; } + case OperationType.OP_DROP_RESOURCE_GROUP: { + final DropResourceGroupOperationLog operationLog = + (DropResourceGroupOperationLog) journal.getData(); + env.getResourceGroupMgr().replayDropResourceGroup(operationLog); + break; + } case OperationType.OP_INIT_EXTERNAL_TABLE: { // Do nothing. break; @@ -1562,6 +1568,10 @@ public class EditLog { logEdit(OperationType.OP_CREATE_RESOURCE_GROUP, resourceGroup); } + public void logDropResourceGroup(DropResourceGroupOperationLog operationLog) { + logEdit(OperationType.OP_DROP_RESOURCE_GROUP, operationLog); + } + public void logAlterStoragePolicy(StoragePolicy storagePolicy) { logEdit(OperationType.OP_ALTER_STORAGE_POLICY, storagePolicy); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java index f8636135ac..d143268a08 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/OperationType.java @@ -283,6 +283,7 @@ public class OperationType { // resource group 410 ~ 419 public static final short OP_CREATE_RESOURCE_GROUP = 410; + public static final short OP_DROP_RESOURCE_GROUP = 411; /** * Get opcode name by op code. diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java index 773126bfca..1430a65776 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/DdlExecutor.java @@ -83,6 +83,7 @@ import org.apache.doris.analysis.DropFunctionStmt; import org.apache.doris.analysis.DropMaterializedViewStmt; import org.apache.doris.analysis.DropPolicyStmt; import org.apache.doris.analysis.DropRepositoryStmt; +import org.apache.doris.analysis.DropResourceGroupStmt; import org.apache.doris.analysis.DropResourceStmt; import org.apache.doris.analysis.DropRoleStmt; import org.apache.doris.analysis.DropSqlBlockRuleStmt; @@ -262,6 +263,8 @@ public class DdlExecutor { env.getResourceMgr().dropResource((DropResourceStmt) ddlStmt); } else if (ddlStmt instanceof CreateResourceGroupStmt) { env.getResourceGroupMgr().createResourceGroup((CreateResourceGroupStmt) ddlStmt); + } else if (ddlStmt instanceof DropResourceGroupStmt) { + env.getResourceGroupMgr().dropResourceGroup((DropResourceGroupStmt) ddlStmt); } else if (ddlStmt instanceof CreateDataSyncJobStmt) { CreateDataSyncJobStmt createSyncJobStmt = (CreateDataSyncJobStmt) ddlStmt; SyncJobManager syncJobMgr = env.getSyncJobManager(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java index 37c0bc69e6..20f24ad315 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgr.java @@ -18,6 +18,7 @@ package org.apache.doris.resource.resourcegroup; import org.apache.doris.analysis.CreateResourceGroupStmt; +import org.apache.doris.analysis.DropResourceGroupStmt; import org.apache.doris.catalog.Env; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; @@ -27,6 +28,7 @@ import org.apache.doris.common.io.Writable; import org.apache.doris.common.proc.BaseProcResult; import org.apache.doris.common.proc.ProcNodeInterface; import org.apache.doris.common.proc.ProcResult; +import org.apache.doris.persist.DropResourceGroupOperationLog; import org.apache.doris.persist.gson.GsonPostProcessable; import org.apache.doris.persist.gson.GsonUtils; import org.apache.doris.thrift.TPipelineResourceGroup; @@ -149,6 +151,35 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { LOG.info("Create resource group success: {}", resourceGroup); } + public void dropResourceGroup(DropResourceGroupStmt stmt) throws DdlException { + if (!Config.enable_resource_group) { + throw new DdlException("unsupported feature now, coming soon."); + } + + String resourceGroupName = stmt.getResourceGroupName(); + if (resourceGroupName == DEFAULT_GROUP_NAME) { + throw new DdlException("Dropping default resource group " + resourceGroupName + " is not allowed"); + } + + writeLock(); + try { + if (!nameToResourceGroup.containsKey(resourceGroupName)) { + if (stmt.isIfExists()) { + return; + } + throw new DdlException("Resource group " + resourceGroupName + " does not exist"); + } + ResourceGroup resourceGroup = nameToResourceGroup.get(resourceGroupName); + long groupId = resourceGroup.getId(); + idToResourceGroup.remove(groupId); + nameToResourceGroup.remove(resourceGroupName); + Env.getCurrentEnv().getEditLog().logDropResourceGroup(new DropResourceGroupOperationLog(groupId)); + } finally { + writeUnlock(); + } + LOG.info("Drop resource group success: {}", resourceGroupName); + } + public void replayCreateResourceGroup(ResourceGroup resourceGroup) { writeLock(); try { @@ -159,6 +190,21 @@ public class ResourceGroupMgr implements Writable, GsonPostProcessable { } } + public void replayDropResourceGroup(DropResourceGroupOperationLog operationLog) { + long id = operationLog.getId(); + writeLock(); + try { + if (!idToResourceGroup.containsKey(id)) { + return; + } + ResourceGroup resourceGroup = idToResourceGroup.get(id); + nameToResourceGroup.remove(resourceGroup.getName()); + idToResourceGroup.remove(id); + } finally { + writeUnlock(); + } + } + public List<List<String>> getResourcesInfo() { return procNode.fetchResult().getRows(); } diff --git a/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java index 7c013b4cfb..ac431b748c 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/resource/resourcegroup/ResourceGroupMgrTest.java @@ -18,6 +18,7 @@ package org.apache.doris.resource.resourcegroup; import org.apache.doris.analysis.CreateResourceGroupStmt; +import org.apache.doris.analysis.DropResourceGroupStmt; import org.apache.doris.catalog.Env; import org.apache.doris.common.Config; import org.apache.doris.common.DdlException; @@ -143,4 +144,32 @@ public class ResourceGroupMgrTest { Assert.assertTrue(e.getMessage().contains("does not exist")); } } + + @Test + public void testDropResourceGroup() throws UserException { + Config.enable_resource_group = true; + ResourceGroupMgr resourceGroupMgr = new ResourceGroupMgr(); + Map<String, String> properties = Maps.newHashMap(); + properties.put(ResourceGroup.CPU_SHARE, "10"); + String name = "g1"; + CreateResourceGroupStmt createStmt = new CreateResourceGroupStmt(false, name, properties); + resourceGroupMgr.createResourceGroup(createStmt); + Assert.assertEquals(1, resourceGroupMgr.getResourceGroup(name).size()); + + DropResourceGroupStmt dropStmt = new DropResourceGroupStmt(false, name); + resourceGroupMgr.dropResourceGroup(dropStmt); + try { + resourceGroupMgr.getResourceGroup(name); + Assert.fail(); + } catch (UserException e) { + Assert.assertTrue(e.getMessage().contains("does not exist")); + } + + DropResourceGroupStmt dropDefaultStmt = new DropResourceGroupStmt(false, ResourceGroupMgr.DEFAULT_GROUP_NAME); + try { + resourceGroupMgr.dropResourceGroup(dropDefaultStmt); + } catch (DdlException e) { + Assert.assertTrue(e.getMessage().contains("is not allowed")); + } + } } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org