{"record":{"id":"25f15832ce297461","repo":"iflytek/astron-agent","slug":"repo-knowledge-delete-failed","errorCode":"REPO_KNOWLEDGE_DELETE_FAILED","errorMessage":"ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED","messagePattern":"ResponseEnum\\.REPO_KNOWLEDGE_DELETE_FAILED","errorType":"error_code","errorClass":"BusinessException","httpStatus":null,"severity":"error","filePath":"console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java","lineNumber":1677,"sourceCode":"     * @throws BusinessException if file not found or deletion operations fail\n     */\n    public void deleteKnowledgeChunks(String docId, JSONArray deleteChunkIds) {\n        if (!deleteChunkIds.isEmpty()) { // Delete documents\n            KnowledgeRequest request = new KnowledgeRequest();\n            request.setDocId(docId);\n            request.setChunkIds(deleteChunkIds.toJavaList(String.class));\n            FileInfoV2 fileInfoV2 = fileInfoV2Service.getOnly(new QueryWrapper<FileInfoV2>().eq(\"uuid\", docId));\n            if (fileInfoV2 == null) {\n                throw new BusinessException(ResponseEnum.REPO_FILE_NOT_EXIST);\n            }\n            request.setRagType(fileInfoV2.getSource());\n            if (!applyRagflowDatasetIdForDelete(request, fileInfoV2)) {\n                return;\n            }\n            KnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);\n            if (response.getCode() != 0) {\n                log.error(\"Failed to delete knowledge chunk, message:{}\", response.getMessage());\n                throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);\n            }\n        }\n    }\n\n    /**\n     * Create a Knowledge POJO from KnowledgeVO with default settings\n     *\n     * @param knowledgeVO the knowledge value object containing user input\n     * @param fileId the file UUID associated with this knowledge\n     * @return Knowledge object with populated default values\n     */\n    private Knowledge getKnowledgePojo(KnowledgeVO knowledgeVO, String fileId) {\n        Knowledge knowledge = new Knowledge();\n        knowledge.setFileId(fileId);\n        knowledge.setContent(this.getKnowledgeDefaultConfig(knowledgeVO.getContent()));\n        knowledge.setCharCount((long) knowledgeVO.getContent().length());\n        knowledge.setEnabled(1);\n        // Source is manual creation","sourceCodeStart":1659,"sourceCodeEnd":1695,"githubUrl":"https://github.com/iflytek/astron-agent/blob/5e758547a83371a5a4b29dadf4ac03e8dd527635/console/backend/toolkit/src/main/java/com/iflytek/astron/console/toolkit/service/repo/KnowledgeService.java#L1659-L1695","documentation":"After resolving the file and applying the RAGFlow dataset ID, KnowledgeService calls knowledgeV2ServiceCallHandler.deleteDocOrChunk(request) to remove chunks. A response code != 0 triggers the log 'Failed to delete knowledge chunk' and BusinessException(REPO_KNOWLEDGE_DELETE_FAILED), wrapping any upstream rejection of the chunk delete.","triggerScenarios":"deleteDocOrChunk returns non-zero: chunks already removed upstream, invalid/missing ragflowDatasetId (or applyRagflowDatasetIdForDelete produced a state the upstream rejects), wrong ragType, or upstream RAG service failure/outage.","commonSituations":"Concurrent deletions of the same chunks; RAGFlow dataset deleted/recreated making datasetId stale; upstream maintenance window; contract drift after knowledge-service upgrade.","solutions":["Read 'Failed to delete knowledge chunk, message:{}' in the logs for the upstream cause.","Verify chunks still exist upstream; treat 'not found' as success for idempotency.","Re-validate the file's source/ragType and regenerate the ragflowDatasetId before retrying.","Retry after upstream recovery; if state is divergent, reconcile the upstream index (re-sync or recreate dataset mapping)."],"exampleFix":"// before\nKnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);\nif (response.getCode() != 0) {\n    throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);\n}\n\n// after\nKnowledgeResponse response = knowledgeV2ServiceCallHandler.deleteDocOrChunk(request);\nif (response.getCode() != 0) {\n    log.warn(\"chunk delete failed docId={} msg={}\", request.getDocId(), response.getMessage());\n    if (!isNotFoundUpstream(response)) {\n        throw new BusinessException(ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED);\n    } // else: already gone, treat as success\n}","handlingStrategy":"retry","validationCode":"// ensure dataset mapping is valid before delete\nif (fileInfoV2.getSource().equals(ProjectContent.FILE_SOURCE_RAG_FLOW_RAG_STR)\n        && repo.getRagflowDatasetId() == null) {\n    return; // cannot delete upstream without dataset mapping\n}","typeGuard":null,"tryCatchPattern":"try {\n    knowledgeService.deleteChunks(docId, chunkIds);\n} catch (BusinessException e) {\n    if (ResponseEnum.REPO_KNOWLEDGE_DELETE_FAILED.getCode().equals(e.getCode())) {\n        // if upstream says not-found, treat as success; otherwise retry with backoff\n    } else { throw e; }\n}","preventionTips":["Make chunk deletes idempotent against upstream 'already deleted'.","Re-sync ragflowDatasetId whenever the RAGFlow dataset changes.","Retry transient upstream failures with backoff, not immediately in a loop.","Log the upstream message for every non-zero code."],"tags":["java","ragflow","delete","upstream-error"],"backgroundTag":"upstream-api-error","analyzedSha":"5e758547a83371a5a4b29dadf4ac03e8dd527635","analyzedAt":"2026-09-12T08:03:51.356Z","contentChangedAt":"2026-09-12T08:03:51.356Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}