shaw
a0593b0bf8
fix(gateway): 客户端断开后 failover 静默终止,不再误报 502 账号耗尽
上游请求经 detachUpstreamContext(WithoutCancel) 有意脱离客户端取消(保
计费),但 failover 循环仍用原始 c.Request.Context() 重新选号:客户端
断开后上游返回 520 等可 failover 错误时,重新选号必然得到 context
canceled,被误判为账号耗尽,记录并返回通用 502。
修复:客户端已断开 ⇒ failover 静默终止。
- 新增 failoverClientGone(c):请求 ctx 已取消时先停 compact 心跳
(建立 happens-before,对齐其它终结路径),响应未提交则标 499
(statusClientClosedRequest,与并发槽取消路径同惯例)
- 7 个 OpenAI 内联 failover 循环(Responses/Messages/chat_completions/
embeddings/images/grok_media/alpha_search)加双 guard:换号前 +
选号失败分支入口;guard 位于 ReportOpenAIAccountScheduleResult(false)
之后、RecordOpenAIAccountSwitch/池模式重试之前,账号健康副作用
(service 层 detached ctx)不受影响
- FailoverState.HandleFailoverError/HandleSelectionExhausted 入口加
ctx.Err() 检查返回 FailoverCanceled,取消不再改动 failover 状态;
全部 10 个 FailoverCanceled 分支统一调用 failoverClientGone 归类 499
- 上游 detach 与计费设计不变;真实上游 520 事件仍完整落 ops
(面板显示码 COALESCE(upstream_status_code,status_code)=520,
错误率/告警口径不变)
测试:新增 openai_responses_failover_cancel_test.go 复现 issue 场景
(520+取消 ⇒ 不切号、499、无 502 终态)+ 在线客户端对照(正常切换、
耗尽 502);failover_loop_test.go 补入口取消用例并修正取消语义断言。
Fixes #4257
2026-07-15 09:29:05 +08:00
..
2026-07-14 14:55:30 +08:00
2026-07-13 11:10:33 +08:00
2026-05-26 10:49:20 +08:00
2026-02-02 22:13:50 +08:00
2026-06-02 00:46:50 +08:00
2026-04-22 13:19:28 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-05-19 15:27:47 +08:00
2026-06-11 18:55:27 +08:00
2026-06-11 18:55:27 +08:00
2026-06-11 18:55:27 +08:00
2026-05-20 13:25:45 +08:00
2026-06-30 01:11:51 +08:00
2026-06-30 01:11:51 +08:00
2026-04-22 12:30:00 +08:00
2026-06-19 21:17:45 +08:00
2026-06-11 18:55:27 +08:00
2026-05-21 15:19:29 +08:00
2026-05-21 15:19:29 +08:00
2026-06-11 18:55:27 +08:00
2026-05-26 10:49:20 +08:00
2026-05-26 10:49:20 +08:00
2026-06-11 18:55:27 +08:00
2026-07-01 17:46:12 +08:00
2026-07-01 17:46:12 +08:00
2026-07-07 18:53:56 +08:00
2026-04-21 00:21:29 +08:00
2026-05-28 10:03:41 +00:00
2026-06-16 11:41:54 +08:00
2026-05-07 09:14:47 +08:00
2026-07-13 09:12:44 +08:00
2026-07-13 10:50:42 +08:00
2026-07-15 09:29:05 +08:00
2026-07-15 09:29:05 +08:00
2026-05-26 10:49:20 +08:00
2026-07-14 14:55:30 +08:00
2026-07-15 09:29:05 +08:00
2026-06-09 22:46:06 +08:00
2026-06-11 20:46:47 +08:00
2026-07-15 09:29:05 +08:00
2026-03-15 16:21:49 +08:00
2026-07-13 11:35:46 +08:00
2026-07-03 21:02:31 +08:00
2026-07-15 09:29:05 +08:00
2026-02-07 22:14:07 +08:00
2026-07-13 15:32:42 +08:00
2026-07-06 16:45:15 +08:00
2026-07-14 14:55:30 +08:00
2026-07-14 14:55:30 +08:00
2026-07-05 08:35:34 +08:00
2026-02-07 17:12:15 +08:00
2026-04-01 02:20:13 +08:00
2026-07-15 09:29:05 +08:00
2026-07-01 11:43:35 +08:00
2026-07-15 09:29:05 +08:00
2026-07-04 05:30:50 +08:00
2026-02-23 12:45:37 +08:00
2026-02-23 12:45:37 +08:00
2026-05-26 10:49:20 +08:00
2026-05-05 03:26:54 +08:00
2026-02-12 19:01:09 +08:00
2026-07-13 10:11:34 +08:00
2026-07-13 10:11:34 +08:00
2026-07-15 09:29:05 +08:00
2026-07-15 09:29:05 +08:00
2026-07-13 20:36:37 +08:00
2026-07-13 20:36:37 +08:00
2026-07-15 09:29:05 +08:00
2026-07-11 12:51:53 +08:00
2026-04-25 05:26:33 +00:00
2026-07-13 10:11:34 +08:00
2026-07-14 14:55:30 +08:00
2026-07-14 14:55:30 +08:00
2026-06-12 01:47:01 +08:00
2026-03-15 22:13:42 +08:00
2026-07-13 17:57:08 +08:00
2026-07-15 09:29:05 +08:00
2026-05-28 22:44:25 +08:00
2026-05-05 03:26:54 +08:00
2026-06-26 10:36:09 +08:00
2026-07-15 09:29:05 +08:00
2026-06-28 11:13:09 +08:00
2026-07-15 09:29:05 +08:00
2026-06-03 14:18:12 +08:00
2026-06-03 14:18:12 +08:00
2026-07-12 04:53:41 +08:00
2026-06-05 14:00:57 +08:00
2026-06-12 01:47:01 +08:00
2026-07-08 02:51:51 +00:00
2026-07-14 14:55:30 +08:00
2026-05-12 15:21:31 +08:00
2026-06-10 14:16:51 +08:00
2026-07-13 15:22:39 +08:00
2026-07-13 15:22:39 +08:00
2026-05-11 11:17:26 +08:00
2026-05-11 11:17:26 +08:00
2026-07-09 11:15:52 +08:00
2026-07-07 13:53:39 +08:00
2026-07-07 13:53:39 +08:00
2026-04-21 20:36:10 +08:00
2026-07-02 16:11:07 +08:00
2026-05-25 18:16:46 +08:00
2026-07-07 10:20:23 +08:00
2026-05-20 13:25:45 +08:00
2026-06-05 14:00:57 +08:00
2026-07-08 13:50:49 +08:00
2026-04-09 18:14:28 +08:00
2026-07-08 13:50:49 +08:00
2026-05-28 22:44:25 +08:00
2026-05-30 17:52:18 +08:00
2026-05-26 10:49:20 +08:00
2026-03-03 01:05:11 +08:00
2026-05-26 10:49:20 +08:00
2026-07-14 12:24:42 +08:00