mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-09-22 06:40:21 +08:00
上游请求经 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