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]