apache/dolphinscheduler · error · ServiceException

MAIN_TABLE_USING_VERSION

MAIN_TABLE_USING_VERSION

Error message

Task definition can not be deleted due to version is being used, projectCode:{}, taskDefinitionCode:{}, version:{}.

What it means

Thrown by TaskDefinitionServiceImpl.deleteByCodeAndVersion when the requested version equals the task definition's current version (taskDefinition.getVersion() == version). The version is still in use by the main task definition row, so deleting its history record is forbidden.

Source

Thrown at dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/TaskDefinitionServiceImpl.java:277

        pageInfo.setTotal((int) taskDefinitionVersionsPaging.getTotal());
        result.setData(pageInfo);
        putMsg(result, Status.SUCCESS);
        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);

View on GitHub (pinned to 02eac45a1b)

Solutions

  1. Choose a version number lower than the task definition's current version to delete.
  2. Check the task's current version via the task-definition API before deleting any version.
  3. If the current version itself must be removed, delete or modify the task definition (not just a version) through the proper task-definition delete/update API.

Example fix

// before
deleteByCodeAndVersion(loginUser, projectCode, taskCode, currentVersion); // fails
// after
int currentVersion = taskDefinition.getVersion();
if (version < currentVersion) {
    deleteByCodeAndVersion(loginUser, projectCode, taskCode, version); // ok
}
Defensive patterns

Strategy: validation

Validate before calling

TaskDefinition td = taskDefinitionDao.queryByCode(taskCode);
if (td != null && version >= td.getVersion()) {
  throw new IllegalStateException('Only versions older than ' + td.getVersion() + ' can be deleted');
}

Try / catch

try {
    taskDefinitionService.deleteByCodeAndVersion(loginUser, projectCode, taskCode, version);
} catch (ServiceException e) {
    if (e.getCode() == Status.MAIN_TABLE_USING_VERSION) {
        // skip or pick an older version
    } else { throw e; }
}

Prevention

When it happens

Trigger: DELETE /task-definition/{projectCode}/{taskCode}/{version} where the version parameter matches the task definition's active version in t_ds_task_definition.

Common situations: Cleanup scripts deleting old task versions that accidentally include the current one; users deleting 'version 1' when the task was never edited past version 1.

Related errors


AI-assisted analysis of apache/dolphinscheduler@02eac45a1b (2026-09-06). Data as JSON: /api/errors/f3737b40e870f8f3. Report an issue: GitHub.