This is an automated email from the ASF dual-hosted git repository. wangbo 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 f7437380ca3 [Fix] some fix for workload group (#50543) f7437380ca3 is described below commit f7437380ca39ff02e42a57a368b4f0a09fcf3ed1 Author: wangbo <wan...@selectdb.com> AuthorDate: Tue May 6 14:20:49 2025 +0800 [Fix] some fix for workload group (#50543) --- .../org/apache/doris/mysql/privilege/Auth.java | 10 ++ .../resource/workloadgroup/WorkloadGroup.java | 4 + .../resource/workloadgroup/WorkloadGroupKey.java | 78 +++++++++++++ .../resource/workloadgroup/WorkloadGroupMgr.java | 126 +++++++++++---------- .../org/apache/doris/mysql/privilege/AuthTest.java | 3 + .../workloadgroup/WorkloadGroupMgrTest.java | 64 ++++++++--- .../resource/workloadgroup/WorkloadGroupTest.java | 43 +++++++ .../account_p0/test_grant_priv_workload.groovy | 13 +++ .../workload_manager_p0/test_curd_wlg.groovy | 14 +-- 9 files changed, 276 insertions(+), 79 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java index aba0f9571f9..cb252bd983b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java +++ b/fe/fe-core/src/main/java/org/apache/doris/mysql/privilege/Auth.java @@ -774,6 +774,16 @@ public class Auth implements Writable { private void grantInternal(UserIdentity userIdent, String role, WorkloadGroupPattern workloadGroupPattern, PrivBitSet privs, boolean errOnNonExist, boolean isReplay) throws DdlException { + if (!isReplay) { + if (!FeConstants.runningUnitTest) { + if (!"%".equals(workloadGroupPattern.getworkloadGroupName()) && !Env.getCurrentEnv() + .getWorkloadGroupMgr() + .isWorkloadGroupExists(workloadGroupPattern.getworkloadGroupName())) { + throw new DdlException( + "Can not find workload group " + workloadGroupPattern.getworkloadGroupName()); + } + } + } writeLock(); try { if (role == null) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java index f7a0fdce49c..5cf893fc004 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroup.java @@ -539,6 +539,10 @@ public class WorkloadGroup implements Writable, GsonPostProcessable { return name; } + public WorkloadGroupKey getWorkloadGroupKey() { + return WorkloadGroupKey.get(this.getComputeGroup(), this.getName()); + } + public Map<String, String> getProperties() { return properties; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupKey.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupKey.java new file mode 100644 index 00000000000..f894003fb2f --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupKey.java @@ -0,0 +1,78 @@ +// 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.resource.workloadgroup; + +import com.google.common.base.Preconditions; +import org.apache.commons.lang3.StringUtils; + +import java.util.Objects; + +public class WorkloadGroupKey { + + private String computeGroup; + + private String workloadGroupName; + + private WorkloadGroupKey(String computeGroup, String workloadGroupName) { + this.computeGroup = computeGroup; + this.workloadGroupName = workloadGroupName; + } + + public static WorkloadGroupKey get(String computeGroup, String workloadGroupName) { + Preconditions.checkState(!StringUtils.isEmpty(workloadGroupName)); + return new WorkloadGroupKey( + StringUtils.isEmpty(computeGroup) ? WorkloadGroupMgr.EMPTY_COMPUTE_GROUP : computeGroup, + workloadGroupName); + } + + public String getComputeGroup() { + return computeGroup; + } + + public String getWorkloadGroupName() { + return workloadGroupName; + } + + @Override + public String toString() { + return computeGroup + "." + workloadGroupName; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o instanceof WorkloadGroupKey) { + WorkloadGroupKey otherWgKey = (WorkloadGroupKey) o; + + boolean cgEqual = this.computeGroup.equals(otherWgKey.computeGroup); + boolean wgEqual = this.workloadGroupName.equals(otherWgKey.workloadGroupName); + return cgEqual && wgEqual; + } + + return false; + } + + @Override + public int hashCode() { + return Objects.hash(computeGroup, workloadGroupName); + } + +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java index dbe91a2898a..662a3714eb7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgr.java @@ -88,7 +88,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost private static final Logger LOG = LogManager.getLogger(WorkloadGroupMgr.class); @SerializedName(value = "idToWorkloadGroup") private final Map<Long, WorkloadGroup> idToWorkloadGroup = Maps.newHashMap(); - private final Map<Pair<String, String>, WorkloadGroup> nameToWorkloadGroup = Maps.newHashMap(); + private final Map<WorkloadGroupKey, WorkloadGroup> keyToWorkloadGroup = Maps.newHashMap(); private final Map<Long, QueryQueue> idToQueryQueue = Maps.newHashMap(); private final ResourceProcNode procNode = new ResourceProcNode(); private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); @@ -163,12 +163,13 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost lock.writeLock().unlock(); } - private WorkloadGroup getWorkloadGroupByComputeGroupUnlock(String cgName, String wgName) + private WorkloadGroup getWorkloadGroupByComputeGroupUnlock(WorkloadGroupKey wgKey) throws DdlException { - WorkloadGroup wg = nameToWorkloadGroup.get(Pair.of(cgName, wgName)); + WorkloadGroup wg = keyToWorkloadGroup.get(wgKey); if (wg == null) { throw new DdlException( - "Can not find workload group " + wgName + " in compute group " + cgName + "."); + "Can not find workload group " + wgKey.getWorkloadGroupName() + " in compute group " + + wgKey.getComputeGroup() + "."); } return wg; } @@ -181,7 +182,8 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost readLock(); try { for (String cgName : cgNames) { - WorkloadGroup workloadGroup = getWorkloadGroupByComputeGroupUnlock(cgName, wgName); + WorkloadGroup workloadGroup = getWorkloadGroupByComputeGroupUnlock( + WorkloadGroupKey.get(cgName, wgName)); workloadGroups.add(workloadGroup.toThrift()); } context.setWorkloadGroupName(wgName); @@ -271,7 +273,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost valueList.add(String.valueOf(qdtail.first)); valueList.add(String.valueOf(qdtail.second)); } - ret.put(wg.getName(), valueList); + ret.put(wg.getWorkloadGroupKey().toString(), valueList); } } finally { readUnlock(); @@ -300,20 +302,21 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost String workloadGroupName = workloadGroup.getName(); writeLock(); try { - Pair<String, String> key = Pair.of(computeGroup, workloadGroupName); - if (nameToWorkloadGroup.containsKey(key)) { + WorkloadGroupKey wgKey = WorkloadGroupKey.get(computeGroup, workloadGroupName); + if (keyToWorkloadGroup.containsKey(wgKey)) { if (isIfNotExists) { return; } throw new DdlException( - "Compute group " + key.first + " already has workload group " + key.second + "."); + "Compute group " + wgKey.getComputeGroup() + " already has workload group " + + wgKey.getWorkloadGroupName() + "."); } if (idToWorkloadGroup.size() >= Config.workload_group_max_num) { throw new DdlException( "Workload group number can not be exceed " + Config.workload_group_max_num); } checkGlobalUnlock(workloadGroup, null); - nameToWorkloadGroup.put(key, workloadGroup); + keyToWorkloadGroup.put(wgKey, workloadGroup); idToWorkloadGroup.put(workloadGroup.getId(), workloadGroup); Env.getCurrentEnv().getEditLog().logCreateWorkloadGroup(workloadGroup); } finally { @@ -386,12 +389,13 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost } WorkloadGroup newWorkloadGroup; + WorkloadGroupKey wgKey = WorkloadGroupKey.get(computeGroup, workloadGroupName); writeLock(); try { - WorkloadGroup currentWorkloadGroup = getWorkloadGroupByComputeGroupUnlock(computeGroup, workloadGroupName); + WorkloadGroup currentWorkloadGroup = getWorkloadGroupByComputeGroupUnlock(wgKey); newWorkloadGroup = WorkloadGroup.copyAndUpdate(currentWorkloadGroup, properties); checkGlobalUnlock(newWorkloadGroup, currentWorkloadGroup); - nameToWorkloadGroup.put(Pair.of(computeGroup, workloadGroupName), newWorkloadGroup); + keyToWorkloadGroup.put(wgKey, newWorkloadGroup); idToWorkloadGroup.put(newWorkloadGroup.getId(), newWorkloadGroup); Env.getCurrentEnv().getEditLog().logAlterWorkloadGroup(newWorkloadGroup); } finally { @@ -421,11 +425,13 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost + "then you can drop the group."); } + WorkloadGroupKey wgKey = WorkloadGroupKey.get(computeGroup, workloadGroupName); + // A group with related policies should not be deleted. Long wgId = null; readLock(); try { - WorkloadGroup wg = nameToWorkloadGroup.get(Pair.of(computeGroup, workloadGroupName)); + WorkloadGroup wg = keyToWorkloadGroup.get(wgKey); if (wg != null) { wgId = wg.getId(); } @@ -441,52 +447,43 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost } } - Pair<String, String> key = Pair.of(computeGroup, workloadGroupName); writeLock(); try { - if (!nameToWorkloadGroup.containsKey(key)) { + if (!keyToWorkloadGroup.containsKey(wgKey)) { if (ifExists) { return; } throw new DdlException( - "Can not find workload group " + workloadGroupName + " in compute group " + computeGroup + "."); + "Can not find workload group " + wgKey.getWorkloadGroupName() + " in compute group " + + wgKey.getComputeGroup() + "."); } - WorkloadGroup workloadGroup = nameToWorkloadGroup.get(key); - long groupId = workloadGroup.getId(); - idToWorkloadGroup.remove(groupId); - nameToWorkloadGroup.remove(key); - idToQueryQueue.remove(groupId); - Env.getCurrentEnv().getEditLog().logDropWorkloadGroup(new DropWorkloadGroupOperationLog(groupId)); + WorkloadGroup workloadGroup = keyToWorkloadGroup.get(wgKey); + keyToWorkloadGroup.remove(wgKey); + idToWorkloadGroup.remove(workloadGroup.getId()); + idToQueryQueue.remove(workloadGroup.getId()); + Env.getCurrentEnv().getEditLog() + .logDropWorkloadGroup(new DropWorkloadGroupOperationLog(workloadGroup.getId())); } finally { writeUnlock(); } - LOG.info("Drop workload group success: {} for compute group {}", workloadGroupName, computeGroup); + LOG.info("Drop workload group success: {} for compute group {}", wgKey.getWorkloadGroupName(), + wgKey.getComputeGroup()); } private void insertWorkloadGroup(WorkloadGroup workloadGroup) { writeLock(); try { - LOG.info("[init_wg] before, name map, {}, id map: {}, name map: {}", "replay", - idToWorkloadGroup, nameToWorkloadGroup); + LOG.info("[init_wg] before, {}, id map: {}, name map: {}", "replay", + idToWorkloadGroup, keyToWorkloadGroup); idToWorkloadGroup.put(workloadGroup.getId(), workloadGroup); - Pair<String, String> key = Pair.of(workloadGroup.getComputeGroup(), workloadGroup.getName()); - nameToWorkloadGroup.put(key, workloadGroup); - LOG.info("[init_wg] after, name map, {}, id map: {}, name map: {}", "replay", - idToWorkloadGroup, nameToWorkloadGroup); + keyToWorkloadGroup.put(workloadGroup.getWorkloadGroupKey(), workloadGroup); + LOG.info("[init_wg] after, {}, id map: {}, name map: {}", "replay", + idToWorkloadGroup, keyToWorkloadGroup); } finally { writeUnlock(); } } - public boolean isWorkloadGroupExists(String workloadGroupName) { - readLock(); - try { - return nameToWorkloadGroup.containsKey(workloadGroupName); - } finally { - readUnlock(); - } - } - public void replayCreateWorkloadGroup(WorkloadGroup workloadGroup) { insertWorkloadGroup(workloadGroup); } @@ -503,7 +500,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost return; } WorkloadGroup workloadGroup = idToWorkloadGroup.get(id); - nameToWorkloadGroup.remove(workloadGroup.getName()); + keyToWorkloadGroup.remove(workloadGroup.getWorkloadGroupKey()); idToWorkloadGroup.remove(id); } finally { writeUnlock(); @@ -554,8 +551,8 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost } // for ut - public Map<Pair<String, String>, WorkloadGroup> getNameToWorkloadGroup() { - return nameToWorkloadGroup; + public Map<WorkloadGroupKey, WorkloadGroup> getNameToWorkloadGroup() { + return keyToWorkloadGroup; } // for ut @@ -576,14 +573,13 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost @Override public void gsonPostProcess() throws IOException { - LOG.info("[init_wg] before, name map, {}, id map: {}, name map: {}", "gson", - idToWorkloadGroup, nameToWorkloadGroup); + LOG.info("[init_wg] before, {}, id map: {}, name map: {}", "gson", + idToWorkloadGroup, keyToWorkloadGroup); for (Map.Entry<Long, WorkloadGroup> entry : idToWorkloadGroup.entrySet()) { - String computeGroupName = entry.getValue().getComputeGroup(); - nameToWorkloadGroup.put(Pair.of(computeGroupName, entry.getValue().getName()), entry.getValue()); + keyToWorkloadGroup.put(entry.getValue().getWorkloadGroupKey(), entry.getValue()); } - LOG.info("[init_wg] after, name map, {}, id map: {}, name map: {}", "gson", - idToWorkloadGroup, nameToWorkloadGroup); + LOG.info("[init_wg] after, {}, id map: {}, name map: {}", "gson", + idToWorkloadGroup, keyToWorkloadGroup); } public class ResourceProcNode { @@ -611,8 +607,8 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost List<WorkloadGroup> oldWgList = Lists.newArrayList(); readLock(); try { - for (Map.Entry<Pair<String, String>, WorkloadGroup> entry : nameToWorkloadGroup.entrySet()) { - if (EMPTY_COMPUTE_GROUP.equals(entry.getKey().first)) { + for (Map.Entry<WorkloadGroupKey, WorkloadGroup> entry : keyToWorkloadGroup.entrySet()) { + if (EMPTY_COMPUTE_GROUP.equals(entry.getKey().getComputeGroup())) { oldWgList.add(entry.getValue()); } } @@ -626,7 +622,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost writeLock(); try { LOG.info("[init_wg] before create normal wg, id map: {}, name map: {}", idToWorkloadGroup, - nameToWorkloadGroup); + keyToWorkloadGroup); if (idToWorkloadGroup.isEmpty()) { String defaultCgName = Config.isCloudMode() ? Tag.VALUE_DEFAULT_COMPUTE_GROUP_NAME : Tag.VALUE_DEFAULT_TAG; @@ -636,14 +632,14 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost WorkloadGroup defaultWg = new WorkloadGroup(Env.getCurrentEnv().getNextId(), DEFAULT_GROUP_NAME, properties); idToWorkloadGroup.put(defaultWg.getId(), defaultWg); - nameToWorkloadGroup.put(Pair.of(defaultWg.getComputeGroup(), defaultWg.getName()), defaultWg); + keyToWorkloadGroup.put(defaultWg.getWorkloadGroupKey(), defaultWg); Env.getCurrentEnv().getEditLog().logCreateWorkloadGroup(defaultWg); LOG.info("[init_wg]Create default workload group success: {}", defaultWg); } else { LOG.info("[init_wg]This is not a new cluster, skip create default wg"); } LOG.info("[init_wg] after create normal wg, id map: {}, name map: {}", idToWorkloadGroup, - nameToWorkloadGroup); + keyToWorkloadGroup); } finally { writeUnlock(); } @@ -652,16 +648,16 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost public void bindWorkloadGroupToComputeGroup(Set<String> cgSet, WorkloadGroup oldWg) { writeLock(); try { - Pair<String, String> oldKey = Pair.of(EMPTY_COMPUTE_GROUP, oldWg.getName()); + WorkloadGroupKey oldKey = WorkloadGroupKey.get(EMPTY_COMPUTE_GROUP, oldWg.getName()); // it means old compute group has been dropped, just return; - if (!nameToWorkloadGroup.containsKey(oldKey)) { + if (!keyToWorkloadGroup.containsKey(oldKey)) { LOG.info("[init_wg]Old workload group {} has been dropped, skip it.", oldWg.getName()); return; } // create new workload group for all compute group. for (String computeGroup : cgSet) { - Pair<String, String> newKey = Pair.of(computeGroup, oldWg.getName()); - if (nameToWorkloadGroup.containsKey(newKey)) { + WorkloadGroupKey newKey = WorkloadGroupKey.get(computeGroup, oldWg.getName()); + if (keyToWorkloadGroup.containsKey(newKey)) { LOG.info("[init_wg]Workload group {} already exists in compute group {}, skip it.", oldWg.getName(), computeGroup); continue; @@ -673,7 +669,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost newProp.put(WorkloadGroup.COMPUTE_GROUP, computeGroup); WorkloadGroup newWg = new WorkloadGroup(Env.getCurrentEnv().getNextId(), oldWg.getName(), newProp); - nameToWorkloadGroup.put(newKey, newWg); + keyToWorkloadGroup.put(newKey, newWg); idToWorkloadGroup.put(newWg.getId(), newWg); Env.getCurrentEnv().getEditLog().logCreateWorkloadGroup(newWg); LOG.info("[init_wg]Create workload group {} for compute group {} success.", oldWg.getName(), @@ -681,7 +677,7 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost } // drop old workload group - nameToWorkloadGroup.remove(oldKey); + keyToWorkloadGroup.remove(oldKey); idToWorkloadGroup.remove(oldWg.getId()); idToQueryQueue.remove(oldWg.getId()); Env.getCurrentEnv().getEditLog().logDropWorkloadGroup(new DropWorkloadGroupOperationLog(oldWg.getId())); @@ -693,4 +689,18 @@ public class WorkloadGroupMgr extends MasterDaemon implements Writable, GsonPost } } + public boolean isWorkloadGroupExists(String wgName) { + readLock(); + try { + for (WorkloadGroup wg : idToWorkloadGroup.values()) { + if (wg.getName().equals(wgName)) { + return true; + } + } + return false; + } finally { + readUnlock(); + } + } + } diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java index e7f81c31a64..333904bf98d 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/AuthTest.java @@ -38,6 +38,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.common.AnalysisException; import org.apache.doris.common.DdlException; import org.apache.doris.common.ExceptionChecker; +import org.apache.doris.common.FeConstants; import org.apache.doris.common.UserException; import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.mysql.MysqlPassword; @@ -1987,6 +1988,7 @@ public class AuthTest { @Test public void testWorkloadGroupPriv() throws UserException { + FeConstants.runningUnitTest = true; UserIdentity userIdentity = new UserIdentity("testUser", "%"); String role = "role0"; String workloadGroupName = "g1"; @@ -2447,6 +2449,7 @@ public class AuthTest { @Test public void testShowRoles() { + FeConstants.runningUnitTest = true; String role = "test_wg_role"; CreateRoleStmt roleStmt = new CreateRoleStmt(role); try { diff --git a/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgrTest.java index 323f95f1f15..8489466bcb2 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgrTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupMgrTest.java @@ -25,6 +25,7 @@ import org.apache.doris.common.UserException; import org.apache.doris.mysql.privilege.AccessControllerManager; import org.apache.doris.mysql.privilege.Auth; import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.persist.DropWorkloadGroupOperationLog; import org.apache.doris.persist.EditLog; import org.apache.doris.qe.ConnectContext; import org.apache.doris.resource.computegroup.ComputeGroup; @@ -127,13 +128,13 @@ public class WorkloadGroupMgrTest { WorkloadGroup wg1 = new WorkloadGroup(wgId1, wgName1, properties1); workloadGroupMgr.createWorkloadGroup(cg1, wg1, false); - Pair<String, String> key1 = Pair.of(cg1, wgName1); - Map<Pair<String, String>, WorkloadGroup> nameToRG = workloadGroupMgr.getNameToWorkloadGroup(); + WorkloadGroupKey key1 = WorkloadGroupKey.get(cg1, wgName1); + Map<WorkloadGroupKey, WorkloadGroup> nameToRG = workloadGroupMgr.getNameToWorkloadGroup(); Assert.assertEquals(1, nameToRG.size()); Assert.assertTrue(nameToRG.containsKey(key1)); WorkloadGroup group1 = nameToRG.get(key1); - Assert.assertEquals(key1.second, group1.getName()); - Assert.assertEquals(key1.first, group1.getComputeGroup()); + Assert.assertEquals(key1.getWorkloadGroupName(), group1.getName()); + Assert.assertEquals(key1.getComputeGroup(), group1.getComputeGroup()); Map<Long, WorkloadGroup> idToRG = workloadGroupMgr.getIdToWorkloadGroup(); Assert.assertEquals(1, idToRG.size()); @@ -150,7 +151,7 @@ public class WorkloadGroupMgrTest { WorkloadGroup wg2 = new WorkloadGroup(wgId2, wgName2, properties2); workloadGroupMgr.createWorkloadGroup(cg2, wg2, false); - Pair<String, String> key2 = Pair.of(cg2, wgName2); + WorkloadGroupKey key2 = WorkloadGroupKey.get(cg2, wgName2); nameToRG = workloadGroupMgr.getNameToWorkloadGroup(); Assert.assertEquals(2, nameToRG.size()); Assert.assertTrue(nameToRG.containsKey(key2)); @@ -158,7 +159,7 @@ public class WorkloadGroupMgrTest { idToRG = workloadGroupMgr.getIdToWorkloadGroup(); Assert.assertEquals(2, idToRG.size()); Assert.assertTrue(idToRG.containsKey(group2.getId())); - Assert.assertTrue(key2.first.equals(wg2.getComputeGroup())); + Assert.assertTrue(key2.getComputeGroup().equals(wg2.getComputeGroup())); // 3 test memory limit exceeds Map<String, String> properties3 = Maps.newHashMap(); @@ -294,7 +295,7 @@ public class WorkloadGroupMgrTest { prop1.put(WorkloadGroup.CPU_SHARE, "10"); workloadGroupMgr.createWorkloadGroup(cgName1, new WorkloadGroup(wgId1, wgName1, prop1), false); Assert.assertTrue(Long.valueOf( - workloadGroupMgr.getNameToWorkloadGroup().get(Pair.of(cgName1, wgName1)).getProperties() + workloadGroupMgr.getNameToWorkloadGroup().get(WorkloadGroupKey.get(cgName1, wgName1)).getProperties() .get(WorkloadGroup.CPU_SHARE)) == 10); // test alter failed @@ -311,7 +312,7 @@ public class WorkloadGroupMgrTest { // test alter success workloadGroupMgr.alterWorkloadGroup(cgName1, wgName1, prop2); - WorkloadGroup wg = workloadGroupMgr.getNameToWorkloadGroup().get(Pair.of(cgName1, wgName1)); + WorkloadGroup wg = workloadGroupMgr.getNameToWorkloadGroup().get(WorkloadGroupKey.get(cgName1, wgName1)); Assert.assertTrue(Long.valueOf(wg.getProperties().get(WorkloadGroup.CPU_SHARE)) == 20); } @@ -333,7 +334,7 @@ public class WorkloadGroupMgrTest { prop1.put(WorkloadGroup.CPU_SHARE, "123"); WorkloadGroup wg1 = new WorkloadGroup(wgId1, wgName1, prop1); wgMgr.getIdToWorkloadGroup().put(wgId1, wg1); - wgMgr.getNameToWorkloadGroup().put(Pair.of(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName1), wg1); + wgMgr.getNameToWorkloadGroup().put(WorkloadGroupKey.get(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName1), wg1); wgMgr.getIdToQueryQueue().put(wgId1, new QueryQueue(0, 0, 0, 0, 0)); long wgId2 = 2; @@ -342,7 +343,7 @@ public class WorkloadGroupMgrTest { prop2.put(WorkloadGroup.CPU_SHARE, "123"); WorkloadGroup wg2 = new WorkloadGroup(wgId2, wgName2, prop2); wgMgr.getIdToWorkloadGroup().put(wgId2, wg2); - wgMgr.getNameToWorkloadGroup().put(Pair.of(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName2), wg2); + wgMgr.getNameToWorkloadGroup().put(WorkloadGroupKey.get(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName2), wg2); wgMgr.getIdToQueryQueue().put(wgId2, new QueryQueue(0, 0, 0, 0, 0)); long wgId3 = 3; @@ -351,7 +352,7 @@ public class WorkloadGroupMgrTest { prop3.put(WorkloadGroup.CPU_SHARE, "123"); WorkloadGroup wg3 = new WorkloadGroup(wgId3, wgName3, prop3); wgMgr.getIdToWorkloadGroup().put(wgId3, wg3); - wgMgr.getNameToWorkloadGroup().put(Pair.of(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName3), wg3); + wgMgr.getNameToWorkloadGroup().put(WorkloadGroupKey.get(WorkloadGroupMgr.EMPTY_COMPUTE_GROUP, wgName3), wg3); wgMgr.getIdToQueryQueue().put(wgId3, new QueryQueue(0, 0, 0, 0, 0)); @@ -392,9 +393,9 @@ public class WorkloadGroupMgrTest { Assert.assertTrue(wgMgr.getIdToWorkloadGroup().get(wgId4).equals(wg4)); for (String cgName : cgSet) { - WorkloadGroup wg11 = wgMgr.getNameToWorkloadGroup().get(Pair.of(cgName, wgName1)); - WorkloadGroup wg22 = wgMgr.getNameToWorkloadGroup().get(Pair.of(cgName, wgName2)); - WorkloadGroup wg33 = wgMgr.getNameToWorkloadGroup().get(Pair.of(cgName, wgName3)); + WorkloadGroup wg11 = wgMgr.getNameToWorkloadGroup().get(WorkloadGroupKey.get(cgName, wgName1)); + WorkloadGroup wg22 = wgMgr.getNameToWorkloadGroup().get(WorkloadGroupKey.get(cgName, wgName2)); + WorkloadGroup wg33 = wgMgr.getNameToWorkloadGroup().get(WorkloadGroupKey.get(cgName, wgName3)); Assert.assertTrue(wgMgr.getIdToWorkloadGroup().containsKey(wg11.getId())); Assert.assertTrue(wgMgr.getIdToWorkloadGroup().containsKey(wg22.getId())); @@ -560,4 +561,39 @@ public class WorkloadGroupMgrTest { } } } + + @Test + public void testReplayWorkloadGroup() { + WorkloadGroupMgr wgMgr = new WorkloadGroupMgr(); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().size() == 0); + Assert.assertTrue(wgMgr.getIdToWorkloadGroup().size() == 0); + + + // 1 test replay create + WorkloadGroup wg1 = new WorkloadGroup(1, "wg1", Maps.newHashMap()); + wgMgr.replayCreateWorkloadGroup(wg1); + + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().size() == 1); + Assert.assertTrue(wgMgr.getIdToWorkloadGroup().size() == 1); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().get(wg1.getWorkloadGroupKey()) + .equals(wgMgr.getIdToWorkloadGroup().get(wg1.getId()))); + + // 2 test replay alter + Map<String, String> pop2 = Maps.newHashMap(); + pop2.put("cpu_share", "2345"); + WorkloadGroup wg2 = new WorkloadGroup(1, "wg1", pop2); + wgMgr.replayAlterWorkloadGroup(wg2); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().get(wg2.getWorkloadGroupKey()) + .equals(wgMgr.getIdToWorkloadGroup().get(wg2.getId()))); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().get(wg2.getWorkloadGroupKey()).getProperties().get("cpu_share") + .equals("2345")); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().size() == 1); + Assert.assertTrue(wgMgr.getIdToWorkloadGroup().size() == 1); + + // 3 test replay drop + DropWorkloadGroupOperationLog dropLog = new DropWorkloadGroupOperationLog(1); + wgMgr.replayDropWorkloadGroup(dropLog); + Assert.assertTrue(wgMgr.getNameToWorkloadGroup().size() == 0); + Assert.assertTrue(wgMgr.getIdToWorkloadGroup().size() == 0); + } } diff --git a/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupTest.java b/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupTest.java index a7176f2d50a..e75f1ef904a 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/resource/workloadgroup/WorkloadGroupTest.java @@ -109,4 +109,47 @@ public class WorkloadGroupTest { } Assert.assertEquals(hasException, true); } + + @Test + public void testWorkloadGroupKey() { + // equal + WorkloadGroupKey eqKey1 = WorkloadGroupKey.get("cg1", "wg1"); + WorkloadGroupKey eqKey2 = WorkloadGroupKey.get("cg1", "wg1"); + WorkloadGroupKey eqKey3 = WorkloadGroupKey.get("cg1", "wg2"); + Assert.assertTrue(eqKey1.equals(eqKey1)); + Assert.assertTrue(eqKey1.equals(eqKey2)); + Assert.assertTrue(eqKey2.equals(eqKey1)); + Assert.assertTrue(eqKey1.hashCode() == eqKey2.hashCode()); + + Assert.assertFalse(eqKey3.equals(eqKey1)); + Assert.assertFalse(eqKey1.equals(eqKey3)); + Assert.assertTrue(eqKey1.hashCode() != eqKey3.hashCode()); + + WorkloadGroupKey eqKey4 = WorkloadGroupKey.get("cg2", "wg2"); + Assert.assertFalse(eqKey4.equals(eqKey3)); + Assert.assertFalse(eqKey3.equals(eqKey4)); + Assert.assertFalse(eqKey4.hashCode() == eqKey3.hashCode()); + + + // test wg name exception + try { + WorkloadGroupKey.get("cg1", ""); + Assert.fail(); + } catch (IllegalStateException e) { + Assert.assertTrue(true); + } + + + // test null equal + Assert.assertTrue(!eqKey1.equals(null)); + + WorkloadGroupKey nullkey2 = WorkloadGroupKey.get(null, "wg1"); + WorkloadGroupKey nullkey3 = WorkloadGroupKey.get("", "wg1"); + Assert.assertTrue(nullkey2.equals(nullkey3)); + Assert.assertTrue(nullkey3.equals(nullkey2)); + + Assert.assertFalse(nullkey2.equals(eqKey1)); + Assert.assertFalse(eqKey1.equals(nullkey2)); + + } } diff --git a/regression-test/suites/account_p0/test_grant_priv_workload.groovy b/regression-test/suites/account_p0/test_grant_priv_workload.groovy index 12149f0fa7a..c5ce48318c2 100644 --- a/regression-test/suites/account_p0/test_grant_priv_workload.groovy +++ b/regression-test/suites/account_p0/test_grant_priv_workload.groovy @@ -18,6 +18,16 @@ import org.junit.Assert; suite("test_grant_priv_workload") { + def forComputeGroupStr = ""; + + //cloud-mode + if (isCloudMode()) { + def clusters = sql " SHOW CLUSTERS; " + assertTrue(!clusters.isEmpty()) + def validCluster = clusters[0][0] + forComputeGroupStr = " for $validCluster " + } + def user1 = 'test_grant_priv_workload_user1' def user2 = 'test_grant_priv_workload_user2' def pwd = '123456' @@ -31,6 +41,8 @@ suite("test_grant_priv_workload") { sql """CREATE USER '${user1}' IDENTIFIED BY '${pwd}'""" sql """CREATE USER '${user2}' IDENTIFIED BY '${pwd}'""" + sql "create workload group if not exists ${workload1} ${forComputeGroupStr} properties('cpu_share'='123')" + // test only have USAGE_PRIV, can not grant to other user sql """grant USAGE_PRIV on WORKLOAD GROUP ${workload1} to ${user1}""" connect(user1, "${pwd}", url) { @@ -52,6 +64,7 @@ suite("test_grant_priv_workload") { } } + sql "drop workload group ${workload1} ${forComputeGroupStr}" sql """drop user if exists ${user1}""" sql """drop user if exists ${user2}""" } diff --git a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy index 53d800bb4e8..e3a443afe3d 100644 --- a/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy +++ b/regression-test/suites/workload_manager_p0/test_curd_wlg.groovy @@ -88,13 +88,6 @@ suite("test_crud_wlg") { sql "ADMIN SET FRONTEND CONFIG ('enable_workload_group' = 'true');" sql "ADMIN SET FRONTEND CONFIG ('query_queue_update_interval_ms' = '100');" - sql "create workload group if not exists normal $forComputeGroupStr " + - "properties ( " + - " 'cpu_share'='1024', " + - " 'memory_limit'='50%', " + - " 'enable_memory_overcommit'='true' " + - ");" - // reset normal group property sql "alter workload group normal $forComputeGroupStr properties ( 'cpu_share'='1024' );" sql "alter workload group normal $forComputeGroupStr properties ( 'memory_limit'='50%' );" @@ -340,6 +333,13 @@ suite("test_crud_wlg") { } } + + sql "drop workload group if exists grant_test_wg $forComputeGroupStr;" + test { + sql " GRANT USAGE_PRIV ON WORKLOAD GROUP grant_test_wg TO 'test_wlg_user'@'%';" + exception "Can not find workload group" + } + sql "GRANT USAGE_PRIV ON WORKLOAD GROUP 'test_group' TO 'test_wlg_user'@'%';" connect('test_wlg_user', '12345', context.config.jdbcUrl) { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org