{"record":{"id":"502ef2bef39cce3d","repo":"apache/dolphinscheduler","slug":"delete-queue-by-id-fail-users","errorCode":"DELETE_QUEUE_BY_ID_FAIL_USERS","errorMessage":"DELETE_QUEUE_BY_ID_FAIL_USERS: {userCount} users are using this queue, delete failed","messagePattern":"DELETE_QUEUE_BY_ID_FAIL_USERS: (.+?) users are using this queue, delete failed","errorType":"error_code","errorClass":"ServiceException","httpStatus":null,"severity":"error","filePath":"dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/QueueServiceImpl.java","lineNumber":238,"sourceCode":"            throw new ServiceException(Status.USER_NO_OPERATION_PERM);\n        }\n\n        Queue queue = queueDao.queryById(id);\n        if (Objects.isNull(queue)) {\n            log.error(\"Queue does not exist\");\n            throw new ServiceException(Status.QUEUE_NOT_EXIST);\n        }\n\n        List<Tenant> tenantList = tenantDao.queryTenantListByQueueId(queue.getId());\n        if (CollectionUtils.isNotEmpty(tenantList)) {\n            log.warn(\"Delete queue failed, because there are {} tenants using it.\", tenantList.size());\n            throw new ServiceException(Status.DELETE_TENANT_BY_ID_FAIL_TENANTS, tenantList.size());\n        }\n\n        List<User> userList = userDao.queryUserListByQueue(queue.getQueueName());\n        if (CollectionUtils.isNotEmpty(userList)) {\n            log.warn(\"Delete queue failed, because there are {} users using it.\", userList.size());\n            throw new ServiceException(Status.DELETE_QUEUE_BY_ID_FAIL_USERS, userList.size());\n        }\n\n        if (!queueDao.deleteById(id)) {\n            throw new ServiceException(Status.DELETE_QUEUE_BY_ID_ERROR);\n        }\n\n    }\n\n    /**\n     * verify queue and queueName\n     *\n     * @param queue queue\n     * @param queueName queue name\n     * @return true if the queue name not exists, otherwise return false\n     */\n    @Override\n    public void verifyQueue(String queue, String queueName) {\n        Queue queueValidator = new Queue(queueName, queue);","sourceCodeStart":220,"sourceCodeEnd":256,"githubUrl":"https://github.com/apache/dolphinscheduler/blob/02eac45a1b6676e639fcbfb4be2243de5771b05d/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/QueueServiceImpl.java#L220-L256","documentation":"QueueServiceImpl.deleteQueueById throws ServiceException(Status.DELETE_QUEUE_BY_ID_FAIL_USERS, userCount) when users still reference the queue by name: userDao.queryUserListByQueue(queue.getQueueName()) returns a non-empty list. This is a second referential-integrity guard, after the tenant check; queues referenced by user records cannot be deleted. The message interpolates the number of blocking users.","triggerScenarios":"Deleting a queue while rows in t_ds_user have queue equal to the queue's queueName; legacy user records still carrying the queue name after tenants were migrated off it.","commonSituations":"After reassigning tenants but forgetting that individual users also carry a queue field; old user profiles pointing at a decommissioned YARN queue; data migrated from older DolphinScheduler versions keeping the user.queue column populated.","solutions":["Update each blocking user's queue to another queue (user management API/UI), then retry the delete.","Find the users via the reported count: query t_ds_user WHERE queue = '<queueName>' and reassign them.","If the user-level queue field is unused in your deployment, clear it (set to default) for those users, then delete the queue."],"exampleFix":"// before\ndeleteQueueById(loginUser, 7) -> DELETE_QUEUE_BY_ID_FAIL_USERS (2 users)\n\n// after: reassign users first\nuserService.updateUser(loginUser, userId, ..., \"default\"); // for each blocking user\ndeleteQueueById(loginUser, 7) -> succeeds","handlingStrategy":"validation","validationCode":"// check user references before deleting\nList<User> users = userDao.queryUserListByQueue(queueName);\nif (!users.isEmpty()) {\n    throw new IllegalStateException(\"Queue \" + queueName + \" still used by \" + users.size() + \" user(s)\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    queueService.deleteQueueById(loginUser, id);\n} catch (ServiceException e) {\n    if (Status.DELETE_QUEUE_BY_ID_FAIL_USERS.getCode() == e.getCode()) {\n        // reassign users then retry\n    } else { throw e; }\n}","preventionTips":["Migrate both tenants AND users off a queue before delete","Sweep legacy t_ds_user.queue values during cleanups","Run a pre-delete dependency report"],"tags":["queue-management","referential-integrity","users"],"backgroundTag":"resource-in-use","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"}