Skip to content

[Bug]: Wiki 导入任务在所有文档完成后仍卡住,超时会导致尾部清理失败 #2074

Description

@cctv549681

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

  • I have searched existing issues and confirmed this is a new one

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions