fix: 消除会话列表解析阻塞并按需加载工具详情
This commit is contained in:
18
.planning/session-switch-live-failure/findings.md
Normal file
18
.planning/session-switch-live-failure/findings.md
Normal file
@@ -0,0 +1,18 @@
|
||||
# 排查发现
|
||||
|
||||
- 线上已使用 GET /api/sessions/:id,HTTP读取不等待WebSocket。
|
||||
- 缓存分为完整新鲜、完整过期和未命中;运行中的会话不能使用完整新鲜缓存直出。
|
||||
- 首屏读取12条、后续24条;首屏附带完整运行正文和工具调用快照。
|
||||
- 完成快照后,浏览器才订阅实时更新;订阅修订变化会触发后台HTTP对账。
|
||||
- 2026-10-18最近业务查询记录200、服务端执行为毫秒级;该计时不覆盖进入处理函数前等待、传输、浏览器解析与显示。
|
||||
- 工作区已有图片显示及文件浏览器等未提交修改,必须保留。
|
||||
- 真实归档隔离副本首屏实测:常用会话约805KB/122个工具,另一会话1.21MB/143个工具,最大副本6.31MB/311个工具;普通本机Firefox切换约0.4~1.5秒,未复现45秒超时。
|
||||
- 实际工具结果占主要体积,最大单条工具输出约1MB;闭合的工具details仍立即构造完整输出DOM,最大副本出现约1秒主线程停顿。
|
||||
- 正在受控传输夹具下复现完整工具输出绑在首屏导致的45秒请求超时;不据此断言现场网络有故障。
|
||||
- 2026-10-19线上请求02:27:06发出,02:28:25才进入HTTP处理函数,处理本身39ms;8秒CPU采样的大部分样本落在parseJsonTopLevelSuffixFields,调用源为WebSocket的sendSessionList。
|
||||
- 原算法对每个嵌套id/title候选复制并JSON.parse整个剩余后缀,近二次方成本与GC阻塞了所有HTTP请求。已改为从根结束符反向单次扫描,只解析完整顶层元数据。
|
||||
- 列表改读归档loadMetadata,不读正文块、不因快照过期而同步重建;按归档修订及快照stat缓存列表字段,标题/未读变化立即失效。
|
||||
- 128KB密集工具伪键只需14次JSON解析、约12ms;8份大旧快照刷新列表与HTTP读取并发回归通过。290份实际会话只读元数据探针无正文块读取和写盘。
|
||||
- 线上重启后真实Firefox点击三个现有会话,分别352/430/184ms显示,当前运行正文恢复且工具详情完整。
|
||||
- 追加并发刷新列表的连续9次真实点击,120~462ms全部显示,无浏览器错误;生产历史和未读未被测试修改(测试浏览器阻断实时订阅,另用鉴权WS只发list_sessions)。
|
||||
- 290份实际会话元数据冷读1978ms;相同进程后续两次列表47/19ms,修订缓存避免每次重新解析清单。
|
||||
15
.planning/session-switch-live-failure/progress.md
Normal file
15
.planning/session-switch-live-failure/progress.md
Normal file
@@ -0,0 +1,15 @@
|
||||
# 工作进度
|
||||
|
||||
- 2026-10-18:用户反馈HTTP改造发布后仍失败;重新打开问题,不再沿用此前完成结论。
|
||||
- 已检查线上脚本与源码一致、新GET路由存在;这些只作为版本证据。
|
||||
- 开始准备生产历史隔离副本和真实浏览器复现场景。
|
||||
|
||||
- 已实现 HTTP 历史/运行快照及订阅工具概要,新增鉴权详情读取,浏览器折叠详情懒建。进入隔离回归;尚未上线。
|
||||
|
||||
- API/真实Firefox回归通过;100个大工具首屏39KB,32KB/s传输下2.3秒显示,工具详情完整且归档后原引用可读。实际最大会话副本由6305982字符降至251096字符,显示416ms。尚未重启/发布。
|
||||
|
||||
- 2026-10-19线上已激活概要化版本,但真实页面仍未通过:请求session-load-1792376826855在02:27:06发出,服务端02:28:25才进入处理并记39ms。存在服务端处理前长等待,恢复实现阶段;不得报完成。
|
||||
- 已修复CPU采样定位的列表解析阻塞,并通过元数据单测、session-preview-metadata并发回归和Firefox完整切换回归(/tmp/cc-web-session-http-xd0sGW)。完整历史大套件60秒到期未跑完,不计全通过。
|
||||
- 运行状态已确认仅当前对话,进入重启与线上实际点击验证。
|
||||
- 线上已重启,真实点击与连续9次并发列表刷新验证通过,分别见/tmp/ccweb-switch-live-AdoSFT/evidence.json及/tmp/ccweb-switch-live-3DL94a/evidence.json。最大会话、当前运行会话及完整工具详情均正常。
|
||||
- 已重新打包Bun baseline单可执行包,MCP初始化冒烟通过。发布包SHA256:ef5801d70fd04737c7c149335967a59b36f2039ab89b1e1bc5612ef997a15d6f。
|
||||
21
.planning/session-switch-live-failure/task_plan.md
Normal file
21
.planning/session-switch-live-failure/task_plan.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# 继续修复会话切换失败
|
||||
|
||||
## 目标
|
||||
定位用户在 HTTP 改造发布后仍然切换失败的实际原因,验证完整的点击、请求、接收、显示和实时订阅链路。
|
||||
|
||||
## 阶段
|
||||
1. [completed] 复现现场会话切换失败并定位阻塞阶段。
|
||||
2. [completed] 修复已复现的根因并覆盖对应回归。
|
||||
3. [completed] 验证实际点击切换与运行态恢复并记录上线条件。
|
||||
|
||||
## 约束
|
||||
- 禁止子代理,不修改其他任务尚未提交的改动。
|
||||
- 不修改生产会话历史;复现使用隔离副本。
|
||||
- 不把 HTTP 200、代码生效或打包通过视作用户问题解决。
|
||||
- 重启前确认除当前对话外无其他运行会话。
|
||||
- 单次测试最多60秒;沿用用户此前打包、提交全部修改并推送的授权,在修复与验证后交付。
|
||||
|
||||
## 已定位
|
||||
- 线上请求在进入HTTP处理函数前排队约79秒,CPU采样指向WebSocket会话列表的快照尾部重复解析。
|
||||
- 修复:归档列表只读元数据,旧快照尾部单次扫描;按磁盘修订缓存列表字段,不重建历史快照。
|
||||
- 已通过高密度嵌套字段、截断边界、并发列表与HTTP切换、真实Firefox回归;线上真实点击3次及并发列表刷新连续切换9次均通过。
|
||||
Reference in New Issue
Block a user