This is an automated email from the ASF dual-hosted git repository.

HappenLee 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 6a7670a9e1b [fix](fe) Allow workload groups to reach the configured 
count limit (#68637)
6a7670a9e1b is described below

commit 6a7670a9e1b81e22981dfa36179a88625eaea8d0
Author: HappenLee <[email protected]>
AuthorDate: Wed Sep 30 14:18:18 2026 +0800

    [fix](fe) Allow workload groups to reach the configured count limit (#68637)
    
    
    Creating the workload group that reaches `workload_group_max_num` is
    incorrectly rejected. With the default limit of 15, a compute group
    containing `normal` and 13 other workload groups cannot create its 15th
    group.
    
    `checkGlobalUnlock` already includes the candidate group in its count,
    so reject only counts greater than the configured maximum. Keep the
    existing per-compute-group accounting and create-only check.
    
    Add parameterized manager tests for limits 1, 2, and 15, including the
    `normal` group. Verify that two compute groups can independently reach
    the limit and that rejected creations leave both metadata maps and the
    edit log unchanged.
    
    ### Release note
    
    Fix an off-by-one check that prevented each compute group from reaching
    the configured `workload_group_max_num` limit.
    
    ### Check List (For Author)
    
    - Test:
    - [x] Unit Test: `MAVEN_ARGS='-T48' ./run-fe-ut.sh --run
    org.apache.doris.resource.workloadgroup.WorkloadGroupMgrTest` — 10 tests
    passed.
    - Confirmed all 3 new parameterized boundary cases fail against the
    original implementation.
    - `mvn -T48 checkstyle:check -pl fe-core` — passed with 0 violations.
        - `git diff --check` — passed.
    - Behavior changed:
    - [x] Yes. Allow exactly the configured number of workload groups per
    compute group; continue rejecting one more than the limit.
    - Does this need documentation?
        - [x] No. Restore the existing maximum-count contract.
---
 .../resource/workloadgroup/WorkloadGroupMgr.java   |  4 +--
 .../workloadgroup/WorkloadGroupMgrTest.java        | 41 ++++++++++++++++++++++
 2 files changed, 43 insertions(+), 2 deletions(-)

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 b7cbb082187..eaad0846c4b 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
@@ -273,8 +273,8 @@ public class WorkloadGroupMgr implements Writable, 
GsonPostProcessable {
             }
         }
 
-        // 4 check wg num
-        if (isCreateStmt && wgNumOfCurrentCg >= Config.workload_group_max_num) 
{
+        // The count already includes the workload group being created.
+        if (isCreateStmt && wgNumOfCurrentCg > Config.workload_group_max_num) {
             throw new DdlException(
                     "Workload group number in Compute Group " + newWgCg + "can 
not exceed "
                             + Config.workload_group_max_num);
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 e2ce8927b3c..fd8c618c5d3 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
@@ -37,6 +37,8 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.ArgumentMatchers;
 import org.mockito.MockedStatic;
 import org.mockito.Mockito;
@@ -213,6 +215,45 @@ public class WorkloadGroupMgrTest {
         }
     }
 
+    @ParameterizedTest
+    @ValueSource(ints = {1, 2, 15})
+    public void testWorkloadGroupCountLimit(int limit) throws DdlException {
+        int originalLimit = Config.workload_group_max_num;
+        try {
+            Config.workload_group_max_num = limit;
+            WorkloadGroupMgr workloadGroupMgr = new WorkloadGroupMgr();
+            for (String computeGroup : List.of("cg1", "cg2")) {
+                for (int i = 0; i < limit; i++) {
+                    Map<String, String> properties = Maps.newHashMap();
+                    properties.put(WorkloadGroup.COMPUTE_GROUP, computeGroup);
+                    properties.put(WorkloadGroup.MIN_CPU_PERCENT, "0");
+                    String name = i == 0 ? WorkloadGroupMgr.DEFAULT_GROUP_NAME 
: "wg" + i;
+                    WorkloadGroup group = new 
WorkloadGroup(id.incrementAndGet(), name, properties);
+                    workloadGroupMgr.createWorkloadGroup(computeGroup, group, 
false);
+                    Assertions.assertSame(group, 
workloadGroupMgr.getNameToWorkloadGroup()
+                            .get(WorkloadGroupKey.get(computeGroup, name)));
+                }
+
+                Map<String, String> properties = Maps.newHashMap();
+                properties.put(WorkloadGroup.COMPUTE_GROUP, computeGroup);
+                properties.put(WorkloadGroup.MIN_CPU_PERCENT, "0");
+                WorkloadGroup excess = new WorkloadGroup(id.incrementAndGet(), 
"excess", properties);
+                DdlException exception = 
Assertions.assertThrows(DdlException.class,
+                        () -> 
workloadGroupMgr.createWorkloadGroup(computeGroup, excess, false));
+                Assertions.assertTrue(exception.getMessage().contains("can not 
exceed " + limit));
+                
Assertions.assertFalse(workloadGroupMgr.getIdToWorkloadGroup().containsKey(excess.getId()));
+                
Assertions.assertFalse(workloadGroupMgr.getNameToWorkloadGroup()
+                        .containsKey(WorkloadGroupKey.get(computeGroup, 
excess.getName())));
+                Mockito.verify(editLog, 
Mockito.never()).logCreateWorkloadGroup(excess);
+            }
+            Assertions.assertEquals(2 * limit, 
workloadGroupMgr.getIdToWorkloadGroup().size());
+            Assertions.assertEquals(2 * limit, 
workloadGroupMgr.getNameToWorkloadGroup().size());
+            Mockito.verify(editLog, Mockito.times(2 * 
limit)).logCreateWorkloadGroup(ArgumentMatchers.any());
+        } finally {
+            Config.workload_group_max_num = originalLimit;
+        }
+    }
+
     @Test
     public void testGetWorkloadGroup() throws UserException {
         Config.enable_workload_group = true;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to