Skip to content

修复取消单个请求导致共享 Sidecar 误重启 - #2909

Merged
jlcodes99 merged 1 commit into
jlcodes99:mainfrom
limaomei-pixel:codex/fix-sidecar-cancel-restart
Oct 27, 2026
Merged

jlcodes99 merged 1 commit into
jlcodes99:mainfrom
limaomei-pixel:codex/fix-sidecar-cancel-restart

Conversation

@limaomei-pixel

Copy link
Copy Markdown
Contributor

问题

用户取消一个流式请求后,Sidecar 生成 HTTP 499、errorCategory: client_canceled,但 errorMessage 仍是裸 context canceled。现有 Rust 宿主的自动重启判断会将这段文字当作上游超时,重启共享 Sidecar,进而打断其他正在生成的请求。

本机日志中一个小时内出现了 15 次 status=499, category=client_canceled 触发的兜底重启。此次修复针对错误重启,不将首次网络断连也归因于这一问题。

改动

在 requestUsageTracker.finalize 的最终 HTTP 499 分支,将 usage 错误消息明确标记为 client canceled,并保留原始详情。例如 context canceled 变为 client canceled: context canceled。宿主已有对明确客户端取消消息的优先排除逻辑,因此现有宿主无需重新打包即可避免该误判。

仍然记录请求失败、499 和 client_canceled,保留已产生的账号归属及 token 用量;502/504 上游故障消息和分类维持原处理。三个文件:一处实现、一个新增回归测试和一个已有断言更新。

这是与现有宿主兼容的取消事件修复。Rust 重启分类器本身没有在本 PR 中改动。本 PR 独立于 #2871,不包含其子代理派单改动。

验证

  • 基于上游 main acc057d1fbc7d85d0aae288fdd2bc73581493d1e。
  • 原版/修改版/回滚对照:同一取消事件测试原版失败、修改通过、恢复原始源码副本后复现失败;恢复字节与基线相同。
  • 针对性测试覆盖裸 context canceled、broken pipe、空消息、先前上游失败后客户端最终取消,以及 token/账号保留和 502/504 上游故障不变。
  • 最新 main 上完整 Go Sidecar 测试通过。Windows 已有图片夹具按字节比较,测试时使用 Git 提交中的 LF 字节,之后恢复原检出字节;未重新生成测试期望。
  • 真实本机验证:在官方 1.3.73 宿主及保留此前派单修复的 Sidecar 构建上应用相同取消事件修改。两条请求并行时取消其中一条,宿主持久化记录为失败 499、client_canceled、client canceled: context canceled;另一条返回匹配的随机标记并正常收到 response.completed,Sidecar PID 保持不变。主程序及账号配置未改动。
cd sidecars/cockpit-cliproxy
go test . -run '^(TestCanceledUsageHasExplicitClientCauseForHost|TestCancellationAfterFailedAttemptPreservesTokensAndFinalCause|TestWriteExecutorError.*|TestRequestUsageTracker.*|TestErrorCategory.*)$' -count=1
go test ./... -count=1

未将真实凭据、账号配置、二进制、数据库或原始会话记录提交到仓库。云端 CI 结果以 GitHub 实际运行状态为准。

@jlcodes99
jlcodes99 merged commit a0c8483 into jlcodes99:main Oct 27, 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.

2 participants