{"record":{"id":"6fc8a2533ad00534","repo":"apache/dolphinscheduler","slug":"50053","errorCode":"50053","errorMessage":"the version that the master table is using","messagePattern":"the version that the master table is using","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java","lineNumber":280,"sourceCode":"        return result;\n    }\n\n    @Override\n    public void deleteByCodeAndVersion(User loginUser, long projectCode, long taskCode, int version) {\n        Project project = projectDao.queryByCode(projectCode);\n        // 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","sourceCodeStart":262,"sourceCodeEnd":298,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java#L262-L298","documentation":"Thrown when attempting to delete a task definition version whose version equals the version currently referenced by the master t_ds_task_definition table. DolphinScheduler keeps version history in t_ds_task_definition_log, and the current (in-use) version is protected from deletion. The delete is aborted to avoid corrupting the active task definition.","triggerScenarios":"Calling DELETE /projects/{projectCode}/task-definition/{code}/version/{version} (TaskDefinitionServiceImpl.deleteByCodeAndVersion) with a version argument equal to taskDefinition.getVersion() of the current master-table row.","commonSituations":"Deleting 'old' versions after not noticing which version is actually published/online; scripting bulk cleanup of history without excluding the current version; UI/API version mismatch after the task was updated.","solutions":["Delete only versions lower than the current master-table version: query the task definition first and skip version == taskDefinition.getVersion().","If the current version itself must change, update/release a new version of the task definition first, then delete the now-unused old one.","Catch ServiceException with code 50053 and surface a clear message instead of retrying the delete."],"exampleFix":"// before\ntaskDefinitionController.deleteTaskDefinitionVersion(projectCode, code, currentVersion); // 50053\n// after\nTaskDefinition def = taskDefinitionDao.queryByCode(code);\nif (currentVersion < def.getVersion()) {\n    taskDefinitionController.deleteTaskDefinitionVersion(projectCode, code, currentVersion);\n}","handlingStrategy":"validation","validationCode":"TaskDefinition def = taskDefinitionDao.queryByCode(taskCode);\nboolean canDelete = def != null && version < def.getVersion();\nif (!canDelete) { throw new IllegalStateException(\"cannot delete in-use version \" + version); }","typeGuard":"boolean isDeletableVersion(TaskDefinition def, int version) {\n    return def != null && version < def.getVersion();\n}","tryCatchPattern":"try {\n    taskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, code, version);\n} catch (ServiceException e) {\n    if (e.getCode() == 50053) { /* version in use: skip or alert */ }\n    else { throw e; }\n}","preventionTips":["Always list versions of a task definition and exclude the current one before bulk deletion.","After updating a task definition, re-check which version is current before cleanup.","Write idempotent cleanup scripts that skip protected versions instead of aborting."],"tags":["task-definition","delete-guard","version-conflict"],"backgroundTag":"invalid-state-transition","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"}