Skip to content

Commit 1629d33

Browse files
authored
[Fix-17798] Fix assign workergroup to project is incorrect (#17799)
1 parent 14b1160 commit 1629d33

File tree

2 files changed

+56
-9
lines changed

2 files changed

+56
-9
lines changed

dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/ProjectWorkerGroupRelationServiceImpl.java

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,30 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
9494
return result;
9595
}
9696

97+
Project project = projectMapper.queryByCode(projectCode);
98+
if (Objects.isNull(project)) {
99+
putMsg(result, Status.PROJECT_NOT_EXIST);
100+
return result;
101+
}
102+
103+
/*
104+
* Todo : For modification operations on projects, we should acquire project row locks. All project-related
105+
* operations and modification/creation actions for workflows/task definitions within the project require
106+
* acquiring row locks first
107+
*/
97108
if (CollectionUtils.isEmpty(workerGroups)) {
109+
Set<String> projectWorkerGroupNames =
110+
projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(projectCode);
111+
if (CollectionUtils.isNotEmpty(projectWorkerGroupNames)) {
112+
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
113+
if (CollectionUtils.isNotEmpty(usedWorkerGroups)) {
114+
Set<String> usedInProject = SetUtils.intersection(usedWorkerGroups, projectWorkerGroupNames);
115+
if (!usedInProject.isEmpty()) {
116+
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS, usedInProject);
117+
}
118+
}
119+
}
120+
98121
boolean deleted = projectWorkerGroupDao.deleteByProjectCode(projectCode);
99122
if (deleted) {
100123
putMsg(result, Status.SUCCESS);
@@ -104,12 +127,6 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
104127
return result;
105128
}
106129

107-
Project project = projectMapper.queryByCode(projectCode);
108-
if (Objects.isNull(project)) {
109-
putMsg(result, Status.PROJECT_NOT_EXIST);
110-
return result;
111-
}
112-
113130
Set<String> allWorkerGroupNames = new HashSet<>(workerGroupDao.queryAllWorkerGroupNames());
114131
workerGroupService.getConfigWorkerGroupPageDetail().forEach(
115132
workerGroupPageDetail -> allWorkerGroupNames.add(workerGroupPageDetail.getName()));
@@ -131,9 +148,11 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
131148

132149
if (CollectionUtils.isNotEmpty(needDeletedWorkerGroups)) {
133150
Set<String> usedWorkerGroups = getAllUsedWorkerGroups(project);
134-
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && usedWorkerGroups.containsAll(needDeletedWorkerGroups)) {
135-
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS,
136-
SetUtils.intersection(usedWorkerGroups, needDeletedWorkerGroups).toSet());
151+
if (CollectionUtils.isNotEmpty(usedWorkerGroups) && CollectionUtils.isNotEmpty(needDeletedWorkerGroups)) {
152+
Set<String> shouldNotDelete = SetUtils.intersection(usedWorkerGroups, needDeletedWorkerGroups);
153+
if (CollectionUtils.isNotEmpty(shouldNotDelete)) {
154+
throw new ServiceException(Status.USED_WORKER_GROUP_EXISTS, shouldNotDelete);
155+
}
137156
}
138157
boolean deleted =
139158
projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(projectCode,
@@ -147,6 +166,7 @@ public Result assignWorkerGroupsToProject(User loginUser, Long projectCode, List
147166
throw new ServiceException(Status.ASSIGN_WORKER_GROUP_TO_PROJECT_ERROR);
148167
}
149168
}
169+
150170
Set<String> needAssignedWorkerGroups =
151171
SetUtils.difference(unauthorizedWorkerGroupNames, projectWorkerGroupNames);
152172
if (CollectionUtils.isNotEmpty(needAssignedWorkerGroups)) {

dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/ProjectWorkerGroupRelationServiceTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,13 @@ public void testAssignWorkerGroupsToProject() {
138138
getWorkerGroups());
139139
Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode());
140140

141+
// success when no task referenced any wg
142+
Mockito.when(projectWorkerGroupDao.deleteByProjectCode(projectCode))
143+
.thenReturn(true);
144+
result = projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
145+
new ArrayList<>());
146+
Assertions.assertEquals(Status.SUCCESS.getCode(), result.getCode());
147+
141148
// db deletion fail
142149
Mockito.when(projectWorkerGroupDao.deleteByProjectCodeAndWorkerGroups(Mockito.any(), Mockito.any()))
143150
.thenReturn(false);
@@ -154,6 +161,26 @@ public void testAssignWorkerGroupsToProject() {
154161
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
155162
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
156163
getUnusedWorkerGroups()));
164+
165+
// test clear all wg and fail when wg is referenced by task definition
166+
// test case: project all wg: test, task used wg: test, new wg: null
167+
Mockito.when(taskDefinitionDao.queryAllTaskDefinitionWorkerGroups(Mockito.anyLong()))
168+
.thenReturn(Collections.singletonList(getProjectWorkerGroup().getWorkerGroup()));
169+
Mockito.when(projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(Mockito.any()))
170+
.thenReturn(Sets.newHashSet(getProjectWorkerGroup().getWorkerGroup()));
171+
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
172+
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
173+
new ArrayList<>()));
174+
175+
// test delete superset of the used wg collection and fail when wg is referenced by task definition
176+
// test case: project all wg: test,test1,test2. task used wg: test. new wg: test1, delete test2 and test
177+
Mockito.when(taskDefinitionDao.queryAllTaskDefinitionWorkerGroups(Mockito.anyLong()))
178+
.thenReturn(Collections.singletonList(getProjectWorkerGroup().getWorkerGroup()));
179+
Mockito.when(projectWorkerGroupDao.queryAssignedWorkerGroupNamesByProjectCode(Mockito.any()))
180+
.thenReturn(Sets.newHashSet("test", "test1", "test2"));
181+
AssertionsHelper.assertThrowsServiceException(Status.USED_WORKER_GROUP_EXISTS,
182+
() -> projectWorkerGroupRelationService.assignWorkerGroupsToProject(loginUser, projectCode,
183+
getUnusedWorkerGroups()));
157184
}
158185

159186
@Test

0 commit comments

Comments
 (0)