From 544b015f766a208cba1bd63f8d2bda762677b2b4 Mon Sep 17 00:00:00 2001 From: JinYong Li <42576980+JinyLeeChina@users.noreply.github.com> Date: Tue, 7 Dec 2021 15:26:28 +0800 Subject: [PATCH] [Bug] [API] task definition release/delete bug (#7232) * fix worker group display * fix workflow query bug * fix workflow query bug * fix task definition release/delete bug --- .../impl/TaskDefinitionServiceImpl.java | 31 ++++++++++++++++--- .../TaskDefinitionServiceImplTest.java | 7 +++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java index 23ac004fad..174551394f 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java @@ -210,6 +210,19 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe } int delete = taskDefinitionMapper.deleteByCode(taskCode); if (delete > 0) { + List taskRelationList = processTaskRelationMapper.queryUpstreamByCode(projectCode, taskCode); + if (!processTaskRelationList.isEmpty()) { + int deleteRelation = 0; + int deleteRelationLog = 0; + for (ProcessTaskRelation processTaskRelation : taskRelationList) { + ProcessTaskRelationLog processTaskRelationLog = new ProcessTaskRelationLog(processTaskRelation); + deleteRelation += processTaskRelationMapper.deleteRelation(processTaskRelationLog); + deleteRelationLog += processTaskRelationLogMapper.deleteRelation(processTaskRelationLog); + } + if ((deleteRelation & deleteRelationLog) == 0) { + throw new ServiceException(Status.DELETE_TASK_PROCESS_RELATION_ERROR); + } + } putMsg(result, Status.SUCCESS); } else { putMsg(result, Status.DELETE_TASK_DEFINE_BY_CODE_ERROR); @@ -496,6 +509,7 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe * @param releaseState releaseState * @return update result code */ + @Transactional(rollbackFor = RuntimeException.class) @Override public Map releaseTaskDefinition(User loginUser, long projectCode, long code, ReleaseState releaseState) { Project project = projectMapper.queryByCode(projectCode); @@ -514,11 +528,15 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe putMsg(result, Status.TASK_DEFINE_NOT_EXIST, code); return result; } - + TaskDefinitionLog taskDefinitionLog = taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(code, taskDefinition.getVersion()); + if (taskDefinitionLog == null) { + putMsg(result, Status.TASK_DEFINE_NOT_EXIST, code); + return result; + } switch (releaseState) { case OFFLINE: taskDefinition.setFlag(Flag.NO); - taskDefinitionMapper.updateById(taskDefinition); + taskDefinitionLog.setFlag(Flag.NO); break; case ONLINE: String resourceIds = taskDefinition.getResourceIds(); @@ -534,13 +552,18 @@ public class TaskDefinitionServiceImpl extends BaseServiceImpl implements TaskDe } } taskDefinition.setFlag(Flag.YES); - taskDefinitionMapper.updateById(taskDefinition); + taskDefinitionLog.setFlag(Flag.NO); break; default: putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, RELEASESTATE); return result; } - + int update = taskDefinitionMapper.updateById(taskDefinition); + int updateLog = taskDefinitionLogMapper.updateById(taskDefinitionLog); + if ((update == 0 && updateLog == 1) || (update == 1 && updateLog == 0)) { + putMsg(result, Status.UPDATE_TASK_DEFINITION_ERROR); + throw new ServiceException(Status.UPDATE_TASK_DEFINITION_ERROR); + } putMsg(result, Status.SUCCESS); return result; } diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/TaskDefinitionServiceImplTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/TaskDefinitionServiceImplTest.java index 315f11c326..d8852b4ce0 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/TaskDefinitionServiceImplTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/TaskDefinitionServiceImplTest.java @@ -309,7 +309,14 @@ public class TaskDefinitionServiceImplTest { putMsg(result, Status.SUCCESS); TaskDefinition taskDefinition = new TaskDefinition(); taskDefinition.setProjectCode(projectCode); + taskDefinition.setVersion(1); + taskDefinition.setCode(taskCode); + String params = "{\"resourceList\":[],\"localParams\":[],\"rawScript\":\"echo 1\",\"conditionResult\":{\"successNode\":[\"\"],\"failedNode\":[\"\"]},\"dependence\":{}}"; + taskDefinition.setTaskParams(params); + taskDefinition.setTaskType(TaskType.SHELL.getDesc()); Mockito.when(taskDefinitionMapper.queryByCode(taskCode)).thenReturn(taskDefinition); + TaskDefinitionLog taskDefinitionLog = new TaskDefinitionLog(taskDefinition); + Mockito.when(taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(taskCode, taskDefinition.getVersion())).thenReturn(taskDefinitionLog); Map offlineTaskResult = taskDefinitionService.releaseTaskDefinition(loginUser, projectCode, taskCode, ReleaseState.OFFLINE); Assert.assertEquals(Status.SUCCESS, offlineTaskResult.get(Constants.STATUS));