Skip to content

fix(session): cap summary.diffs at 256KB to stop event-loop starvation - #459

Merged
LeXwDeX merged 7 commits into
mainfrom
feat/458-giant-summary-guard
Aug 28, 2026
Merged

fix(session): cap summary.diffs at 256KB to stop event-loop starvation#459
LeXwDeX merged 7 commits into
mainfrom
feat/458-giant-summary-guard

Conversation

@LeXwDeX

@LeXwDeX LeXwDeX commented Aug 28, 2026

Copy link
Copy Markdown
Owner

Closes #458

Why

一次 upstream sync 会话把 37.8MB 全量 git diff 注入 user 消息 summary.diffs(实测 message.data = 37,872,527 字节;event 表单条 message.updated 达 37.87MB,全局 opencode.db 被撑至 10GB)。此后每次 updateMessage 都把 37.8MB 写入 message 行 + event 表 + SSE 广播,同进程 TUI 处理巨型事件产生分配风暴(CPU ~142%、GC 满负荷、RSS 稳定 9GB),事件循环饿死导致 ESC abort 请求永远得不到调度——用户只能 kill -9。会话全部 137 个 parts 仅 695KB:diffs 是纯元数据(TUI 展示用),截断不影响发给 LLM 的内容。

What changed

三层防护,共享常量 MAX_SUMMARY_DIFF_BYTES = 256KBpackages/opencode/src/session/session.ts):

位置 行为
源头截断 src/session/summary.ts summarize computeDiff 之后、updateMessage 之前按贪心字节预算保留前缀文件列表,新数据不再超限
读护栏(存量治愈) session.ts fromRow / stripOversizedDiffs DB 读出超限 summary_diffs 整体剥离,保留 additions/deletions/files 统计——已存在的 37.8MB 旧消息重新加载即被卸载,旧会话可安全继续
写护栏 session.ts toRow / truncateSummaryDiffs 写库前截断,任何路径写入 DB 的 summary_diffs 均不超预算

字节记账精确([] 括号 2 字节、逗号 +1),写/读护栏互补,round-trip 幂等无震荡。summary.ts 复用 session.ts 导出的同一 helper,无循环依赖、无重复算法。

Evidence

  • bun run typecheck(tsgo --noEmit)通过
  • 新增 test/session/summary-diff-guard.test.ts7/7 pass(真实服务图 Session.node + 真实 Database.node,仅 stub Snapshot.diffFull)——源头截断保持前缀顺序且不超预算;读护栏剥离 legacy 超限行保留统计;预算内 round-trip 无损;空数组/单条超预算/精确满额三个边界
  • bun run test:dag-core:52 pass / 0 fail(DAG 门禁无回归)
  • DAG workflow(map → coding → verify → review → synthesize)承载实现,review 结论 PASS(0 blocking;3 条 INFO 建议已在最终提交中全部吸收:helper 统一、字节记账注释、边界测试钉死)

Checklist

  • 测试测真实实现(无业务逻辑 mock)
  • summary.diffsundefined 在 schema 与全部 TUI 消费方均为合法形态
  • 后续拆分项(不在本 PR):abort 路径对事件循环饿死的韧性、事件循环 lag watchdog

@LeXwDeX LeXwDeX changed the title Delivery giant-summary-guard fix(session): cap summary.diffs at 256KB to stop event-loop starvation Aug 28, 2026
@LeXwDeX
LeXwDeX marked this pull request as ready for review August 28, 2026 08:07
@LeXwDeX
LeXwDeX merged commit a057b9c into main Aug 28, 2026
9 checks passed
@LeXwDeX
LeXwDeX deleted the feat/458-giant-summary-guard branch August 28, 2026 09:43
This was referenced Aug 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(session): giant summary.diffs message starves event loop — ESC abort unresponsive

1 participant