{"record":{"id":"ea14c75f4934495d","repo":"apache/dolphinscheduler","slug":"50041","errorCode":"50041","errorMessage":"delete task definition version error","messagePattern":"delete task definition version error","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java","lineNumber":286,"sourceCode":"        // check if user have write perm for project\n        projectService.checkHasProjectWritePermissionThrowException(loginUser, project);\n\n        TaskDefinition taskDefinition = taskDefinitionDao.queryByCode(taskCode);\n        if (taskDefinition == null || projectCode != taskDefinition.getProjectCode()) {\n            log.error(\"Task definition does not exist, taskDefinitionCode:{}.\", taskCode);\n            throw new ServiceException(Status.TASK_DEFINE_NOT_EXIST, String.valueOf(taskCode));\n        }\n        if (taskDefinition.getVersion() == version) {\n            log.warn(\n                    \"Task definition can not be deleted due to version is being used, projectCode:{}, taskDefinitionCode:{}, version:{}.\",\n                    projectCode, taskCode, version);\n            throw new ServiceException(Status.MAIN_TABLE_USING_VERSION);\n        }\n        int delete = taskDefinitionLogMapper.deleteByCodeAndVersion(taskCode, version);\n        if (delete <= 0) {\n            log.error(\"Task definition version delete error, projectCode:{}, taskDefinitionCode:{}, version:{}.\",\n                    projectCode, taskCode, version);\n            throw new ServiceException(Status.DELETE_TASK_DEFINITION_VERSION_ERROR);\n        }\n        log.info(\n                \"Task definition version delete complete, projectCode:{}, taskDefinitionCode:{}, version:{}.\",\n                projectCode, taskCode, version);\n    }\n\n    @Override\n    public TaskDefinitionVO queryTaskDefinitionDetail(User loginUser, long projectCode, long taskCode) {\n        Project project = projectDao.queryByCode(projectCode);\n        // check user access for project\n        projectService.checkProjectAndAuthThrowException(loginUser, project, TASK_DEFINITION);\n\n        TaskDefinition taskDefinition = taskDefinitionDao.queryByCode(taskCode);\n        if (taskDefinition == null || projectCode != taskDefinition.getProjectCode()) {\n            log.error(\"Task definition does not exist, taskDefinitionCode:{}.\", taskCode);\n            throw new ServiceException(Status.TASK_DEFINE_NOT_EXIST, String.valueOf(taskCode));\n        }\n        List<WorkflowTaskRelation> taskRelationList = workflowTaskRelationDao","sourceCodeStart":268,"sourceCodeEnd":304,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java#L268-L304","documentation":"Thrown when the delete of a task definition version from t_ds_task_definition_log affects zero rows (taskDefinitionLogMapper.deleteByCodeAndVersion returned <= 0). It means the requested (code, version) pair does not exist in the version-history table, so nothing was deleted.","triggerScenarios":"Calling deleteByCodeAndVersion with a version number that was never persisted to the log table (typo, already deleted, version beyond history), while the version check against the master table passed.","commonSituations":"Double-deleting the same version from concurrent scripts or retries; off-by-one when enumerating versions; environments where history was purged externally.","solutions":["Verify the version exists before deleting: taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(code, version) != null.","Make cleanup scripts idempotent: treat zero-row deletes as success rather than retrying.","Catch ServiceException code 50041 and log the (code, version) pair for diagnosis instead of failing the whole batch."],"exampleFix":"// before\ntaskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, code, version); // throws if rows==0\n// after\nif (taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(code, version) != null) {\n    taskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, code, version);\n}","handlingStrategy":"validation","validationCode":"TaskDefinitionLog log = taskDefinitionLogMapper.queryByDefinitionCodeAndVersion(code, version);\nif (log == null) { throw new IllegalStateException(\"version \" + version + \" not in history\"); }","typeGuard":"boolean versionExists(TaskDefinitionLog l) {\n    return l != null && l.getVersion() > 0;\n}","tryCatchPattern":"try {\n    taskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, code, version);\n} catch (ServiceException e) {\n    if (e.getCode() == 50041) { /* already deleted: treat as success in idempotent scripts */ }\n    else { throw e; }\n}","preventionTips":["Query version history before deleting to confirm the exact version number.","Avoid retry loops around delete operations; make them idempotent.","Guard against double-execution in cleanup jobs using a processed-versions set."],"tags":["task-definition","delete","empty-delete"],"backgroundTag":"record-not-found","analyzedSha":"02eac45a1b6676e639fcbfb4be2243de5771b05d","analyzedAt":"2026-09-06T17:43:00.555Z","contentChangedAt":"2026-09-06T17:43:00.555Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}