Skip to content

fix(history): 旧版会话迁移按字节预算分页,避免 WebView 内存溢出 - #1137

Merged
xiaozhou26 merged 1 commit into
mainfrom
fix/legacy-migration-oom
Nov 3, 2026
Merged

xiaozhou26 merged 1 commit into
mainfrom
fix/legacy-migration-oom

Conversation

@xiaozhou26

Copy link
Copy Markdown
Contributor

Closes #1136

现象:从 1.x 升级到 2.0.2 后,启动页停在「正在迁移旧版会话 · 正在读取旧数据」,随后 WebView 报 Out of Memory,重启后依旧。

原因:legacy_history_migration_page 每页固定导出 20 个会话,连同每个会话全部 segment 的 messages_json 和 checkpoint 文件(base64)一次性经 IPC 发给 WebView。WebView 里还会再复制几份(解析 IPC 结果、canonicalMessagesForMigration 转换、fingerprint 序列化、导入请求体里的 source_metadata.original 和 segments[].messages_json)。历史里有长会话或内嵌图片时,一页的数据就能让渲染进程内存溢出;重启后又从同一页开始,所以始终失败。

改动(只改 Rust 导出端,前端与 K-brain 导入协议不变)

  • 每页会话数据(segments 的 messages/summary、checkpoint 索引和 blob、context/model JSON)累计上限约 8 MB,仍最多 20 个;加入下一个会超出时,把它留到下一页,游标停在上一个已导出会话。
  • 单个超过预算的会话独占一页,不会卡死分页。
  • complete 改为:没有因预算提前截断且本次查询不足 20 行。

测试

  • 新增 page_stops_at_byte_budget_and_resumes_after_last_exported_conversation:小预算下逐页导出、游标连续、超大会话独占一页、最终 complete;默认预算下小会话仍合并在一页。
  • cargo test -p liveagent --lib migration:12 passed。

已知限制:单个会话本身就有几百 MB 时,它独占的那一页仍可能超出 WebView 内存,要进一步拆小需要改前端导入流程和 K-brain 导入协议,这次没有做。

旧版会话迁移每页固定导出 20 个会话,连同全部 segment 的
messages_json 和 checkpoint 文件一次性经 IPC 发给 WebView,
WebView 内还会再复制几份(解析、转换、导入请求体)。历史中
有大会话或内嵌图片时,一页就让渲染进程 Out of Memory,
重启后从同一页重试,始终卡在「正在读取旧数据」。

导出改为每页最多约 8 MB 会话数据(仍最多 20 个),超出时
把当前会话留到下一页;单个超出预算的会话独占一页。

Closes #1136
@xiaozhou26
xiaozhou26 merged commit e41002b into main Nov 3, 2026
14 checks passed
@xiaozhou26
xiaozhou26 deleted the fix/legacy-migration-oom branch November 3, 2026 10:43
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.

[Bug] 升级后出现页面提示内存超出

1 participant