Affected Component
Backend Service & API
Bug Description
Wiki 导入任务可能在所有文档都已经完成后仍然显示执行中。
我们遇到的情况是:知识库里的所有文档都已经是 parse_status = completed,并且 pending_subtasks_count = 0,但 Wiki 页面仍然显示有 pending tasks。检查数据库后发现,task_pending_ops 里残留了 stale 的 wiki:ingest 任务行,knowledge_processing_spans 里也残留了 running 状态的 postprocess.wiki span。
初步判断是 Wiki ingest 批处理接近或达到 60 分钟超时时,worker context 被 cancel。后续尾部清理仍然使用这个已经 cancel 的 context 去删除 consumed pending rows 和关闭 spans,导致这些 DB 操作失败,日志里出现 context deadline exceeded。
但当前代码里 trimPendingList 删除失败只打日志,不返回错误;随后 batch 仍然无条件设置 claimsSettled = true,导致 deferred cleanup 不再释放 stale claims。最终表现就是文档完成了,但 pending rows 和 running spans 残留,UI 一直显示任务还在执行。
Steps to Reproduce
创建或使用一个开启 Wiki 的知识库。
2. 导入较多文档,使 Wiki ingest 处理时间超过 60 分钟。
3. 等待文档解析和后处理完成。
4. 打开 Wiki 页面或查询 stats API。
5. 观察到 pending_tasks 仍然不为 0。
6. 检查数据库:
knowledges 中所有文档都是 completed
task_pending_ops 中仍有 stale 的 wiki:ingest rows
knowledge_processing_spans 中仍有 postprocess.wiki span 处于 running
Expected Behavior
当 Wiki ingest 已经完成文档处理后,已消费的 pending rows 应该被可靠删除或释放,相关 spans 也应该被正常关闭。
即使主 ingest context 超时,终态清理也应该:
- 使用 bounded detached context 完成必要清理;或
- 明确返回错误,让任务保持可恢复、可重试状态
UI 不应该在所有文档都已经完成后继续显示 Wiki 任务 pending。
Actual Behavior
Wiki 任务一直显示 pending,虽然文档本身已经全部完成。
本次现场观察到的数据库状态:
- 该 KB 下 8 个文档全部
parse_status = completed
- 所有文档
pending_subtasks_count = 0
task_pending_ops 仍残留 4 条:
task_type = wiki:ingest
op = ingest
claimed_at 已经是 stale claim
fail_count = 0
knowledge_processing_spans 中仍有多个 postprocess.wiki span 是 running
task_dead_letters 为空
结果是:已完成文档对应的 pending rows 没有被删除,stale claims 残留,stats 接口继续把它们计入 pending_tasks。
WeKnora Version
commit 9733bd2
Deployment Method
Docker Compose
Operating System
linux
Relevant Logs
wiki ingest stats: ... elapsed=1h0m0.012s ...
context deadline exceeded
wiki ingest: failed to trim 3 pending rows: context deadline exceeded
[SpanTracker] EndSpan failed span=...: context deadline exceeded
Confirmation
Affected Component
Backend Service & API
Bug Description
Wiki 导入任务可能在所有文档都已经完成后仍然显示执行中。
我们遇到的情况是:知识库里的所有文档都已经是
parse_status = completed,并且pending_subtasks_count = 0,但 Wiki 页面仍然显示有 pending tasks。检查数据库后发现,task_pending_ops里残留了 stale 的wiki:ingest任务行,knowledge_processing_spans里也残留了running状态的postprocess.wikispan。初步判断是 Wiki ingest 批处理接近或达到 60 分钟超时时,worker context 被 cancel。后续尾部清理仍然使用这个已经 cancel 的 context 去删除 consumed pending rows 和关闭 spans,导致这些 DB 操作失败,日志里出现
context deadline exceeded。但当前代码里
trimPendingList删除失败只打日志,不返回错误;随后 batch 仍然无条件设置claimsSettled = true,导致 deferred cleanup 不再释放 stale claims。最终表现就是文档完成了,但 pending rows 和 running spans 残留,UI 一直显示任务还在执行。Steps to Reproduce
创建或使用一个开启 Wiki 的知识库。
2. 导入较多文档,使 Wiki ingest 处理时间超过 60 分钟。
3. 等待文档解析和后处理完成。
4. 打开 Wiki 页面或查询 stats API。
5. 观察到
pending_tasks仍然不为 0。6. 检查数据库:
knowledges中所有文档都是completedtask_pending_ops中仍有 stale 的wiki:ingestrowsknowledge_processing_spans中仍有postprocess.wikispan 处于runningExpected Behavior
当 Wiki ingest 已经完成文档处理后,已消费的 pending rows 应该被可靠删除或释放,相关 spans 也应该被正常关闭。
即使主 ingest context 超时,终态清理也应该:
UI 不应该在所有文档都已经完成后继续显示 Wiki 任务 pending。
Actual Behavior
Wiki 任务一直显示 pending,虽然文档本身已经全部完成。
本次现场观察到的数据库状态:
parse_status = completedpending_subtasks_count = 0task_pending_ops仍残留 4 条:task_type = wiki:ingestop = ingestclaimed_at已经是 stale claimfail_count = 0knowledge_processing_spans中仍有多个postprocess.wikispan 是runningtask_dead_letters为空结果是:已完成文档对应的 pending rows 没有被删除,stale claims 残留,stats 接口继续把它们计入
pending_tasks。WeKnora Version
commit 9733bd2
Deployment Method
Docker Compose
Operating System
linux
Relevant Logs
Confirmation