You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by lu...@apache.org on 2023/04/24 06:00:08 UTC
[doris] branch master updated: [Feature](resource-group) Support drop resource group (#18873)
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: 赵立伟 <zh...@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-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org