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