apache/dolphinscheduler · error · ServiceException
50053
50053
Error message
the version that the master table is using
What it means
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.
Source
Thrown at dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java:280
return result;
}
@Override
public void deleteByCodeAndVersion(User loginUser, long projectCode, long taskCode, int version) {
Project project = projectDao.queryByCode(projectCode);
// check if user have write perm for project
projectService.checkHasProjectWritePermissionThrowException(loginUser, project);
TaskDefinition taskDefinition = taskDefinitionDao.queryByCode(taskCode);
if (taskDefinition == null || projectCode != taskDefinition.getProjectCode()) {
log.error("Task definition does not exist, taskDefinitionCode:{}.", taskCode);
throw new ServiceException(Status.TASK_DEFINE_NOT_EXIST, String.valueOf(taskCode));
}
if (taskDefinition.getVersion() == version) {
log.warn(
"Task definition can not be deleted due to version is being used, projectCode:{}, taskDefinitionCode:{}, version:{}.",
projectCode, taskCode, version);
throw new ServiceException(Status.MAIN_TABLE_USING_VERSION);
}
int delete = taskDefinitionLogMapper.deleteByCodeAndVersion(taskCode, version);
if (delete <= 0) {
log.error("Task definition version delete error, projectCode:{}, taskDefinitionCode:{}, version:{}.",
projectCode, taskCode, version);
throw new ServiceException(Status.DELETE_TASK_DEFINITION_VERSION_ERROR);
}
log.info(
"Task definition version delete complete, projectCode:{}, taskDefinitionCode:{}, version:{}.",
projectCode, taskCode, version);
}
@Override
public TaskDefinitionVO queryTaskDefinitionDetail(User loginUser, long projectCode, long taskCode) {
Project project = projectDao.queryByCode(projectCode);
// check user access for project
projectService.checkProjectAndAuthThrowException(loginUser, project, TASK_DEFINITION);
View on GitHub (pinned to 02eac45a1b)
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.
Example fix
// before
taskDefinitionController.deleteTaskDefinitionVersion(projectCode, code, currentVersion); // 50053
// after
TaskDefinition def = taskDefinitionDao.queryByCode(code);
if (currentVersion < def.getVersion()) {
taskDefinitionController.deleteTaskDefinitionVersion(projectCode, code, currentVersion);
} Defensive patterns
Strategy: validation
Validate before calling
TaskDefinition def = taskDefinitionDao.queryByCode(taskCode);
boolean canDelete = def != null && version < def.getVersion();
if (!canDelete) { throw new IllegalStateException("cannot delete in-use version " + version); } Type guard
boolean isDeletableVersion(TaskDefinition def, int version) {
return def != null && version < def.getVersion();
} Try / catch
try {
taskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, code, version);
} catch (ServiceException e) {
if (e.getCode() == 50053) { /* version in use: skip or alert */ }
else { throw e; }
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06).
Data as JSON: /api/errors/6fc8a2533ad00534.
Report an issue: GitHub.