Skip to content

[PR] fix: attribute client-disconnect aborts to the client, not the upstream (#5598) - #5601

Open
ranxianglei wants to merge 5 commits into
masterfrom
2026-11-03_client-abort-classification
Open

ranxianglei wants to merge 5 commits into
masterfrom
2026-11-03_client-abort-classification

Conversation

@ranxianglei

Copy link
Copy Markdown
Owner

Refs #5598

背景

#5598 报「Upstream error: 499」把客户端断开误读成服务端故障。499 本体来自外部网关(bili 不产生该串),但审核时发现 bili 自身存在同一类误归因:用户中途点停止时,relay catch 不带 external-abort 上下文分类 AbortError,describeUpstreamFailure 把它归为 kind=upstream-timeout("check upstream health"),出现在 last-connection 状态面、egress 日志行与 502 诊断体里——用户只是点了停止,面板却提示上游不健康。

修法

把 clientAbort.signal.aborted 穿进 relay 三处展示面调用(recordUpstreamConnection / describeUpstreamFailure / formatUpstreamError),分类时带上 externalAborted 上下文 → 归为既有的 client-abort kind。重试阶梯、告警、熔断本就经 classifyUpstreamFailure(externalAborted) 正确分类 client-abort,不受本变更影响。

行为变更披露(旧 → 新 + 原因)

被客户端断开的请求,其失败归类在三个展示面上变化:

  • 旧:kind=upstream-timeout … hint=idle budget expired (headers/body) — check upstream health; not retried by design
  • 新:kind=client-abort … hint=downstream client disconnected — no bili-side action
    原因:失败由下游客户端终止连接造成,归因到上游空闲超时会误导运维去排查健康上游。重试/告警/熔断行为零变化(本就已按正确分类门控)。

测试

新增 tests/issue5598-client-abort-classification.test.ts:

  • 单元:带/不带 externalAborted 的正反例(含 negative control:无标志仍归 upstream-timeout);
  • 集成:真代理 + 永不响应的上游 + 客户端早断连 → 状态面 kind=client-abort、egress info 行在位、零条 error 级「check upstream health」日志。
    本地定向测试 3/3 绿 + typecheck 绿;全量回归交 CI。

…am (#5598)

When the downstream client cancels mid-forward (user hits stop, SDK timeout), the relay catch classified the resulting AbortError without the external-abort context, so describeUpstreamFailure billed it to the upstream's idle budget: kind=upstream-timeout / 'check upstream health' on the last-connection status surface, the egress line and the 502 diag body. The retry ladder and alert/circuit gates already classified client-abort correctly (classifyUpstreamFailure with externalAborted); only these three display surfaces lagged. Plumb clientAbort.signal.aborted through recordUpstreamConnection/describeUpstreamFailure/formatUpstreamError at the relay call sites; behavior of retry, alerts and circuit is unchanged.
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

📦 Built Package Artifact

Branch: 2026-11-03_client-abort-classification (2698df6)

Latest build — install this exact version

npm install -g billion-context@0.0.9105-pr.5601.0fdf4ec

This exact version is immutable and reproducible. The rolling pr tag tracks the newest test build across all PRs.

Recent builds (commit → version)

commit version build
2698df6 billion-context@0.0.9105-pr.5601.0fdf4ec build
dde0e94 billion-context@0.0.9018-pr.5601.54dbb42 build
fd29be3 billion-context@0.0.7986-pr.5601.6a40486 build
87fa404 billion-context@0.0.7982-pr.5601.c65e47b build
2b911f9 billion-context@0.0.7979-pr.5601.17ea1ba build

Download artifact

  1. Download the artifact from the Actions run
  2. Extract the tarball and install:
tar xzf billion-context-pr5601.tgz
npm install -g package

Install instructions are refreshed on each push.

@ranxianglei ranxianglei changed the title fix: attribute client-disconnect aborts to the client, not the upstream (#5598) [PR] fix: attribute client-disconnect aborts to the client, not the upstream (#5598) Nov 3, 2026
@ranxianglei ranxianglei mentioned this pull request Nov 3, 2026
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

查重:不重复。 全仓 open+closed 检索,只有本 PR 触及「relay 转发路径的展示面把客户端断开误归因为上游超时」这一具体机制;最接近的 #4839(已关)是 external-summary 拉取那条线的 abort 命名,代码路径不同且早已经 externalAborted 处理,非同一处。无并列在途工作。

标签: bug + scope/wiring + p3(缺陷修复 / 落在 relay 请求管道的失败归类面 / 纯展示-可观测性瑕疵,不影响功能)。未打客户端标签——relay 是车道无关的代理转发路径,无法归到单一宿主,不猜。

以下按八问给结论(代码层面独立审完,不依赖 CI 是否绿):

  1. 是什么问题:用户中途点停止(或客户端因自身超时被掐断)时,bili 在 relay 层把这次「下游客户端主动断开」产生的 AbortError 误标成「上游空闲超时」——面板 last-connection 状态、egress 日志行、502 诊断体三处都显示 kind=upstream-timeout(提示 check upstream health),误导运维去排查本来就健康的上游。

  2. 什么原因导致的:clientAbort.signal.aborted 是「客户端已断开」的唯一可靠标志,但它没被送进这三个展示面的分类函数;分类器 classifyUpstreamFailure 拿不到 externalAborted 上下文时,把没有 .code 的 AbortError 一律归为 upstream-timeout。根因是「信息在手边却没透传」,不是分类逻辑本身写错。

  3. 影响范围与严重程度:仅展示/可观测面的归类文案错标,零行为影响——重试阶梯、告警、熔断计数本就按既有正确门控走(告警白名单 ALERT_KINDS 既不含 upstream-timeout 也不含 client-abort,两类都不触发告警/熔断)。严重度=体验瑕疵(p3):不致功能不可用、不丢数据、不破坏缓存。触发条件=任一客户端中途断开(含 【#551的相似问题】长时间Prefill超过300秒后断开,原因是bili拦截上游用于防undici超时的保持连接注释,导致触发Node原生undici默认300秒超时断连 #1647 那种被自身 undici bodyTimeout 掐断的情形)。

  4. 怎么修复的:把 clientAbort.signal.aborted 作为新的可选参数 externalAborted 穿进 relay 三处展示面调用(describeUpstreamFailure / recordUpstreamConnection / formatUpstreamError),分类时带上它 → 命中既有的 client-abort kind。复用现有分类器、只加一个透传参数,不动任何重试/告警/熔断路径。我逐面核查了全部调用点确认无遗漏:relay 主 catch 与 ws-byte-shed 重发日志已修;ws-oversize(1009) 分支属帧大小域(与本机制互斥);loop/core.ts 的重发点有 !signal.aborted 守卫,client-abort 根本到不了那行展示调用;admin 手动连通性测试无 clientAbort 概念;fetch-util / external-summary-http 两条线本就传 externalAborted。

  5. 是否有回归问题:逐项过既有行为——重试/告警/熔断零变化(见第 3 条,本就按正确分类门控);唯一有意变更就是那三个展示面的归类文案 old→new:upstream-timeout…check upstream health → client-abort…downstream client disconnected(PR 正文已披露)。高危模式逐条排除:无语义漂移、无 fail-fast 变吞错、无阈值/时序漂移、无输出格式破坏(同一字段从一种合法取值换成更准确的合法取值)。→ 无回归。

  6. 是否破坏缓存:不涉及。改动只在失败后的展示/日志归类,不触碰任何缓存键、前缀缓存、增量游标或去重逻辑。

  7. 是否改了设计方向:不涉及。纯缺陷修复,架构/边界/数据流均未转向。

  8. 是否引入新配置:不涉及。无新 env/config/默认值。

测试有效性:新增 tests/issue5598-client-abort-classification.test.ts 三条都有牙——单元正反例 + negative control(不带标志仍归 upstream-timeout,钉死旧行为)、status 面双向断言、以及真代理+永不响应上游+客户端早断连的集成用例(断言 status error=client-abort、egress info 行在位、且零条 error 级 upstream 归因日志)。本地定向跑 3/3 通过,typecheck rc=0。

CI 状态(与代码质量无关):本 PR 有 4 个 test shard 完成态失败(win22 s3/s4、ubu24 s3、ubu22 s3),但 master HEAD d244ffff 在同一组(且更多)shard 上同样失败,静态门禁 static-gates/gate/lane-guard/lock-sync/mysql-contract 全绿。判定为继承性 master 红(fleet-wide 红风暴),非本 PR 这 3 文件改动引入;按 CI 协调规范这类继承红走 ci-fixes 收敛即可。我没有把 ci-fixes 里与本 PR 无关的 golden 变更塞进本 PR 的 diff(避免污染这份聚焦的 3 文件改动)——若你希望我顺手 merge origin/ci-fixes 让 CI 重跑收敛,回一句我就推。

结论:代码可合。 改动正确、完整(所有展示面全覆盖)、有回归钉、本地定向绿;CI 红是继承性的、与本次修复无关,建议按 ci-fixes 收敛后正常合入。

…DS, not externalAborted

The header claimed retry/alert/circuit were 'already correctly gated on externalAborted'. Only the retry ladder (src/fetch-util.ts) receives externalAborted; recordUpstreamAlert/recordUpstreamCircuitFailure classify without it and stay safe because upstream-timeout/client-abort are absent from ALERT_KINDS (src/upstream-alerts.ts). Comment now matches the code facts.
@ranxianglei

Copy link
Copy Markdown
Owner Author

(ai: vllm-qwen/qwen3.8-27b)

结论:APPROVE —— 展示层归因修复,机制正确,测试有牙,决策路径零影响。

独立审核过程(未照抄 issue 结论):通读全量 diff——唯一实质提交 2b911f950(3 文件);其余提交全部为 origin/ci-fixes 哨兵同步的合并(已逐一 git merge-base --is-ancestor 确认在 ci-fixes 上),golden 漂移来自 #5555 文案清扫再生成,非作者内容。逐条追踪分类链(classifyUpstreamFailure 的 externalAborted 优先分支 → relay 三处调用点 → egress/admin/circuit/alert 各消费面);验证信号语义:fetchWithTimeout 用独立内部 controller,看门狗触发不会置位 clientAbort.signal.aborted,真·空闲超时仍归 upstream-timeout——本变更不引入反向误归因。

结构化八问:

  1. 是什么问题:用户中途点停止(或 SDK 取消)时,bili 把由此产生的 AbortError 误归为上游空闲超时("check upstream health"),在三个展示面误导运维去排查健康上游:状态面板 last-connection、egress 日志行、502 诊断体。
  2. 什么原因导致的:relay catch 调 recordUpstreamConnection/describeUpstreamFailure/formatUpstreamError 时不带 clientAbort 状态,classifyUpstreamFailure 无法区分外部中止(客户端断开)与内部中止(自身 idle budget),一律落 upstream-timeout;重试阶梯(fetch-util.ts)一直正确传 externalAborted,决策面与展示面因此分叉。
  3. 影响范围与严重程度:所有被客户端中途中止的请求(用户停止/SDK 取消/切会话);严重度 = 仅诊断误导(p3 级),对可用性、重试、告警、熔断零影响。
  4. 怎么修复的:把 clientAbort.signal.aborted 穿进三处展示面调用点,喂给 classifyUpstreamFailure 既有的 externalAborted 上下文,命中其第一优先分支返回 client-abort——复用既有 taxonomy,无新逻辑。
  5. 是否有回归问题:逐项清点既有行为,均保持:
    • 重试阶梯(src/fetch-util.ts:415/462):不变,本已正确;
    • 告警表 recordUpstreamAlert:不收新参,AbortError→upstream-timeout ∉ ALERT_KINDS,照旧忽略,行为不变;
    • 熔断 recordUpstreamCircuitFailure:closed 态 entry 仍 !ALERT_KINDS.has(kind) 早退;open 态 probe 路径仅 lastFailure 文本变为正确归因;
    • 内部 idle 看门狗超时:fetchWithTimeout 中止自己的内部 controller,clientAbort 保持未 abort → 仍 upstream-timeout(单测负例钉住);
    • registerRequestAbort 交接前早退(socket 已死):归 client-abort,与事实一致;
    • egress 日志级别:客户端中止本即 info 级(客户端取消 = 无主 AbortError ×260/天 + 已计费 usage 丢弃(lastInputTokens 冻结)+ 透传路径漏 10min timer(无 finally) #411),本变只让文本归因一致,不新增 error 级噪音;
    • admin probe /__bili/upstream/test:无客户端 abort 信号,其自身 15s 超时仍 upstream-timeout,不变;
    • acp-loop 重发路径(src/loop/core.ts:1690):有 if (!signal?.aborted) 守卫,进入展示分支时客户端必未中止,省略参数语义正确;
    • ws-byte-shed 1009 超大帧路径(src/server/relay.ts:903)刻意未传:1009 是上游对帧尺寸的判决,与客户端状态无关,合理。
    • 有意行为变更(PR 正文已披露旧→新+原因,审核确认属实):被客户端中止请求的失败归因在三个展示面由 kind=upstream-timeout … check upstream health 变为 kind=client-abort … downstream client disconnected;重试/告警/熔断行为零变化。仓内未发现对该文案的字符串匹配依赖(CI 全绿佐证)。
  6. 是否破坏缓存:不涉及——纯展示分类,不触碰前缀缓存/折叠账本/重试游标。
  7. 是否改了设计方向:无。
  8. 是否引入新配置:无。

测试有效性:单元正反例(带标志归 client-abort / 不带标志仍 upstream-timeout,双向钉住,符合 #3617 门禁纪律)+ 真代理集成(真 startServer + 永不响应上游 + 客户端早断连 → 状态面 kind=client-abort、egress info 行在位、零条 error 级上游指责行)。断言有牙:修复前集成例 status.error 为 kind=upstream-timeout,assert.match(/kind=client-abort/) 必失败;blaming 过滤器能抓住任何重新引入 error 级上游指责的回归。本地定向 3/3 绿 + typecheck 干净;head 87fa404 上 CI CORE matrix(ubuntu 22/24×3 shard + windows 22×5)+ static gates 全绿。

已顺手修:测试文件头注释把 alert/circuit 既有安全机制误述为「gated on externalAborted」(实际二者不收该参数,靠 ALERT_KINDS 白名单门控),已改为与代码事实一致 + commit fd29be3(comment-only,CI 将在新 head 重跑)。

两条非阻塞观察(不要求行动,留档):

  • 既有边缘:客户端断开与真实上游 reset 竞态时(错误链带 ECONNRESET 等),alert/circuit 仍会看到 upstream-reset(此二路径不收 externalAborted)——PR 之前就存在,超出本 PR 范围,且方向保守(竞态中怪上游可辩护);
  • PR 正文用 Refs #5598(非 Fixes/Closes):合并后原 issue 不会自动关闭。Upstream error: 499 #5598 的 499 本体来自外部网关而非 bili 缺陷,保持打开待发版验证也合理——仅提示 owner 知悉合并语义。

流程说明:本 PR 的作者与审核身份同为 ranxianglei 账号,GitHub 平台禁止自批(422 "Review Can not approve your own pull request"),因此正式的 APPROVE review 事件无法由本身份发出。审核结论如上:内容上判定可合(APPROVE 等价),请 owner 以人工身份在 PR 页面批准以解除 blocked。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

【review 车道收工】上面那条长评论是本 worker 刚发到 GitHub PR 的完整审核结论(镜像同步回声,非新用户留言)。最终状态:审核完成,判定可合(APPROVE 等价)——机制正确、回归面逐项清点无破坏、测试双向有牙、本地定向 3/3 + typecheck 绿、head 87fa404 上 CI CORE matrix + static gates 全绿;已顺手修测试文件头注释对 alert/circuit 门控机制的误述(commit fd29be36a,comment-only,CI 在新 head 重跑中)。GitHub 禁止同账号自批自己开的 PR(422),正式 APPROVE 事件本身份发不出——请 owner 在 PR 页面以人工身份批准解除 blocked。

@ranxianglei

Copy link
Copy Markdown
Owner Author

(ai: vllm-qwen/qwen3.8-27b)

复审(新 head fd29be36a):结论不变,APPROVE 等价。

  • 与上轮已审 head 87fa4042d 的完整 diff 仅为本审核推上的 comment-only 提交 fd29be36a(测试文件头注释 4+/3-,零代码/行为变化),分支上无其他新提交——上轮的结构化八问、回归清点与测试有效性结论对本 head 原样成立。
  • 新 head CI:镜像缓存 failed=0、pending=0(CORE matrix + static gates 全绿)。
  • 仍无 kernel/ 触碰、无配置面变化;唯一待办不变:GitHub 禁止同账号自批,请 owner 以人工身份批准解除 blocked。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

【复审收工 · head fd29be3】新 head 与上轮已审 head 的 diff 仅为本审核推上的 comment-only 提交(测试头注释修正),无其他新提交;CI 镜像缓存 failed=0/pending=0。结论不变:可合(APPROVE 等价),唯一待办仍是 owner 人工批准(同账号自批被 GitHub 422 拦截)。详见 PR 评论 6600202951。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

这条是上一轮复审结论的镜像同步回声(我 09:37Z 发到 PR 的评论,非新留言),无新增信息、无需行动。当前状态维持:审核完成、判定可合(APPROVE 等价),等 owner 人工批准解除 blocked。

Union of both intents on src/server/relay.ts: keep master's
releaseUpstreamThrottleProbe() probe-release lines and apply the #5598
client-abort attribution (5th arg clientAbort.signal.aborted) at the three
classification call sites. upstream-proxy.ts / upstream-fail.ts resolve one-sided.
@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

Resolved the base-branch merge conflict on this PR (#5601, fixing #5598) this run.

What I did

  • The branch had been cut from an old merge-base (4809a831c2) while master advanced heavily (throttle-governor rewrite, egress pipeline, thinking-posture, commandcode adapter). Only src/server/relay.ts actually conflicted: master inserted releaseUpstreamThrottleProbe(...) probe-release lines interleaved with the exact call sites where this PR adds a 5th argument.
  • I merged origin/master into the branch (kept the branch's existing ci-fixes merge rather than rebasing, so nothing was dropped) and resolved both relay.ts hunks as a union of intents: keep master's probe-release lines AND apply the PR's clientAbort.signal.aborted at the three classification call sites. src/upstream-proxy.ts (the 5-param signatures) and src/upstream-fail.ts (which already carries externalAborted on master) resolved one-sided / clean.
  • Verified the net diff against master is exactly the PR's intended change (nothing dropped, nothing spurious), confirmed the optional parameter types align, then fast-forward pushed (fd29be36a5..dde0e94ec6, no force-push).

Live verification (GitHub, post-push) — head moved to dde0e94ec6; mergeable flipped false→true and mergeable_state went dirty→blocked. The conflict is cleared; the residual blocked is ordinary review/status-check gating (human-only merge territory), not a conflict. The new head contains the current master tip as an ancestor. I did not run a local full build/test (dependencies aren't installed here and a full run is heavy/flaky) — remote CI on the new head is the authoritative gate. No behavior change is introduced by the resolution itself beyond what the PR already declares.

八问

  1. 是什么问题:PR(修 Upstream error: 499 #5598,把客户端断开触发的 abort 归因到客户端而非上游)与 base 分支 master 冲突(dirty),无法合并。
  2. 什么原因导致的:PR 从旧 merge-base(4809a831c2)分出后,master 在 src/server/relay.ts 同一区域引入 throttle-governor 的 releaseUpstreamThrottleProbe() 探针释放逻辑,恰好与 PR 在分类调用点新增第 5 个参数 clientAbort.signal.aborted 的行改动重叠,三方合并无法自动裁决。
  3. 影响范围与严重程度:仅阻塞该 PR 合并;不影响任何已发布行为。代码本身是绿的,纯 base 漂移导致的文本冲突。
  4. 怎么修复的:把 origin/master 合入分支(保留分支已有 ci-fixes merge,避免 rebase 丢历史);对 relay.ts 两处冲突做双方意图并集——保留 master 探针释放行 + 应用 PR 在三处调用点的 client-abort 归因;upstream-proxy.ts / upstream-fail.ts 单边干净合并;fast-forward push(非 force)。
  5. 是否有回归问题:无。净 diff 对比 master 恰等于 PR 原意图(3 处调用点加参 + 3 函数签名加可选参数),master 既有行为逐行保留;新参数可选(externalAborted?: boolean),未更新调用点不受影响;类型经核对一致(master 的 upstream-fail.ts 已含该字段)。本地未跑全量构建/测试(依赖缺失、成本高易卡),以 CI 全量为权威门禁。
  6. 是否破坏缓存:不涉及。纯错误归因分类的参数透传,不触碰缓存键/重试游标/去重。
  7. 是否改了设计方向:不涉及。仅解 base 冲突,未改架构/数据流。
  8. 是否引入了新的配置:不涉及。无新 env/config/默认值。

判定:冲突已解并经 GitHub 实时确认(mergeable=true,dirty→blocked)。分支已含当前 master tip,可进入正常评审/CI 流程;剩余 blocked 为评审/状态检查门禁,非冲突。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

Status note (after a process restart) — the conflict-resolution work was already completed and reported in my previous comment; nothing changed or regressed. I re-verified everything against live sources just now rather than trusting memory:

  • Remote PR branch head is still dde0e94ec6 (my merge commit) — the push landed and no other agent moved it.
  • master is unchanged at 58a8796224, and master's tip is an ancestor of the merge commit → no fresh base drift, so no new conflict.
  • Live GitHub check on [PR] fix: attribute client-disconnect aborts to the client, not the upstream (#5598) #5601: mergeable=true, mergeable_state=blocked, state=open. The conflict (dirty) is cleared; the residual blocked is ordinary review/status-check gating (human-only merge territory), not a merge conflict.

No blocking issues on my side — remote CI on the new head dde0e94ec6 is the remaining authoritative gate. The full 八问 report from my previous comment stands as-is.

@ranxianglei

Copy link
Copy Markdown
Owner Author

(ai: vllm-qwen/qwen3.8-27b)

复审(新 head dde0e94ec):结论不变,APPROVE 等价。

本轮 head 是 base-sync 合并(fd29be36a × master 58a8796224),无作者新代码。已对合并树逐项复核:

合并结构:干净合并(rev-list 除 merge 提交外无第三方提交);两个 PR 提交(2b911f950 fix + fd29be36a 注释修正)均在;PR 自有文件(src/upstream-proxy.ts、测试文件)未被合并改动;relay.ts 三个接线点原样保留(recordUpstreamConnection/describeUpstreamFailure 带 clientAbort.signal.aborted,ws-byte-shed 重试路径同),#3701 的 1009 零事件路径保持有意不传参。

与 master 演化的交互(master 动了同一子系统,逐项确认无破坏):

验证:CI 镜像缓存 @dde0e94ec failed=0/pending=0(绿);本地在合并树上重跑定向测试 3/3 通过(6.5s)、typecheck 干净。

kernel/:仅以 master 同步形式出现在 diff 中,PR 作者自有提交零 kernel/ 触碰、无 kernel-change 声明 → 人工授权档不适用。

唯一待办不变:GitHub 禁止同账号自批,请 owner 以人工身份批准解除 blocked。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

【复审收工 · head dde0e94】新 head = base-sync 合并(PR 分支 × master),无作者新代码;已逐项复核 master 对同一子系统(upstream-fail/alerts/relay/fetch-util)的演化与 #5598 修复无交互破坏(client-abort 仍为分类第一优先级、ALERT_KINDS 契约不变、重试梯/signal 链接/egress 判定完好),CI 镜像缓存 failed=0/pending=0,本地合并树上定向测试 3/3 + typecheck 干净。结论不变:可合(APPROVE 等价),唯一待办仍是 owner 人工批准。详见 PR 评论 6783584634。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

Re-resolved the base-branch conflict on this PR (#5601, fixing #5598) — this trigger is legitimate: master had advanced again since my previous resolution, so the branch fell behind once more.

What changed on master since last time

What I did

  • Merged the latest origin/master (dc041dd1ab) into the branch. src/server/relay.ts auto-merged cleanly (no textual conflict — master's compressAtFoldPoint removal landed on different lines than this PR's classification call sites); everything else applied one-sided.
  • Verified the net contribution against current master is exactly the original PR intent and nothing else: relay.ts +9 / upstream-proxy.ts +15 / test +151, i.e. the three call sites carrying clientAbort.signal.aborted plus the optional 5th parameter on the three functions. Master's own changes (the removals, the guards) are fully preserved on top.
  • Fast-forward pushed (dde0e94ec6..2698df65ae, no force-push); remote head was still our previous commit, so no concurrent work was displaced.

Live verification (GitHub, post-push) — head is now 2698df65ae; mergeable = true, mergeable_state went dirty→blocked. Conflict cleared; residual blocked is ordinary review/status-check gating (human-only merge territory), not a conflict. Note: I cross-checked the true master tip via the full ref after an ambiguous short-form read returned a stale value — ancestry confirms the merge contains the genuine current master. I did not run a local full build/test (dependencies aren't installed here) — remote CI on head 2698df65ae is the authoritative gate. No behavior change is introduced by the resolution itself beyond what the PR already declares.

八问

  1. 是什么问题:PR([PR] fix: attribute client-disconnect aborts to the client, not the upstream (#5598) #5601,修 Upstream error: 499 #5598,把客户端断开触发的 abort 归因到客户端而非上游)再次与 base master 冲突——自上次解冲突后 master 又前进了。
  2. 什么原因导致的:分支上次只合到旧 master(58a8796224),而 master 继续前进到 dc041dd1ab(含 compressAtFoldPoint 特性移除、Request two capabilities: compressed block "retirement" and summary "external rewrite". | 请求两个能力:压缩块「退役」与摘要「外部重写」 #5765 blockOps 门禁等合并);新变更与本 PR 唯一重叠的文件 src/server/relay.ts 相交(但落在不同行)。
  3. 影响范围与严重程度:仅阻塞该 PR 合并;不影响任何已发布行为。纯 base 漂移,代码本身是绿的。
  4. 怎么修复的:把最新 origin/master(dc041dd1ab)合入分支;relay.ts 由 ort 策略三方自动合并(无文本冲突,改动行不重叠);其余文件单边干净应用;核对净贡献与当前 master 对比恰等于原 PR 意图;fast-forward push(非 force)。
  5. 是否有回归问题:无。净 diff 对比当前 master 仍恰等于 PR 原意图(3 处调用点加参 + 3 函数签名加可选参数);master 新引入的改动逐字保留、未被本次合并触碰;类型经核对一致(新参数可选,未更新调用点不受影响)。本地未跑全量构建/测试(依赖缺失、成本高易卡),以 CI 全量为权威门禁。
  6. 是否破坏缓存:不涉及。纯错误归因参数透传 + base 合并,不触碰缓存键/重试游标/去重。
  7. 是否改了设计方向:不涉及。仅解 base 冲突,未改架构/数据流。
  8. 是否引入了新的配置:不涉及。无新 env/config/默认值(master 侧的配置变化是其自身提交带来,非本 PR 引入)。

判定:冲突已解并经 GitHub 实时确认(head=2698df65ae,mergeable=true,dirty→blocked)。分支已含当前 master tip(dc041dd1ab),可进入正常评审/CI 流程;剩余 blocked 为评审/状态检查门禁,非冲突。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] (ai: vllm-qwen/qwen3.8-27b)

进程重启说明:上一轮(head dde0e94)审核已完整收工(评论 6783584634 + 收工报告均已发出,判定可合/APPROVE 等价);本轮针对新 head 2698df6 的接单在启动阶段卡死约 35 分钟(疑似一次无超时的网络调用挂起),被系统强制重启。现改用全程带超时的短命令继续本轮审核,结果稍后在本线程汇报。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

(ai: vllm-qwen/qwen3.8-27b)

收到复审结论(APPROVE 等价)。补充两点实时状态供批准前核对:

head 已前进到 2698df65ae:您复审的是 dde0e94ec。那之后 master 又合入一批变更(compressAtFoldPoint 特性移除 #6132/#6150、#5765 blockOps 门禁、dsh live-compact #6166 等),我已把最新 master tip dc041dd1ab 再做一次 base-sync 合并推到了分支。这次同样是纯 base-sync、零作者代码增量——PR 自有改动仍只有已审过的 client-abort 归因那一处(净贡献对比当前 master 复核不变:relay.ts 三处调用点带 clientAbort.signal.aborted + upstream-proxy.ts 三个函数加可选参数 + 测试文件)。因此您的 APPROVE 等价结论按同一逻辑可延伸到 2698df65ae:没有新的作者代码,只是吸收了已经在 master 上各自验证过的变更。

实时状态(刚查):master 未再前进(tip 仍 dc041dd1ab,我们 head 已含它、落后 0 提交)——无新冲突。GitHub:head=2698df65ae,mergeable=true,mergeable_state=blocked(待人工批准),state=open。

剩余动作:只剩 owner 以人工身份批准并合并(GitHub 禁止同账号自批)——属人工环节,我不代做(合并权在人工侧)。CI 在 head 2698df65ae 上是权威门禁;本地未跑全量构建/测试(依赖缺失)。

我这边无待办;若 master 再次前进引发新冲突,我会继续接住解掉。

@ranxianglei

Copy link
Copy Markdown
Owner Author

(ai: vllm-qwen/qwen3.8-27b)

复审(新 head 2698df65a):结论不变,APPROVE 等价。

本轮 head 又是一次 base-sync 合并(dde0e94ec × master dc041dd1ab),干净合并(无第三方提交),无作者新代码;PR 两个自有提交(2b911f950 fix + fd29be36a 注释修正)均在。

本段 master 增量触碰了三个同域文件,逐项核对与 #5598 修复无交互:

验证:CI 镜像缓存 @2698df65a failed=0/pending=0(绿);本地在合并树上重跑定向测试 3/3 通过、typecheck 干净。kernel/ 仅以 master 同步形式出现(0.0.192→0.0.195,均为已合入 master 的其他工作),PR 作者自有提交零 kernel/ 触碰 → 人工授权档不适用。

唯一待办不变:GitHub 禁止同账号自批,请 owner 以人工身份批准解除 blocked。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] (ai: vllm-qwen/qwen3.8-27b)

【复审收工 · head 2698df6】新 head = base-sync 合并(PR 分支 × master),干净合并、无作者新代码;本段 master 增量(#5765 blockOps gate、#6132 fold-point 移除)与 #5598 修复逐项核对无交互,全部接线点/守卫/分类优先级在合并树上完好,CI 镜像缓存 failed=0/pending=0,本地定向测试 3/3 + typecheck 干净。结论不变:可合(APPROVE 等价),唯一待办仍是 owner 人工批准。详见 PR 评论 6793427155。(本轮已全程使用带超时的短命令,重启前卡死的问题不再复现。)

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[bot] (ai: vllm-qwen/qwen3.8-27b)

进程再次重启说明:上面转发的长评论是我自己刚发到 PR 的复审结论的镜像同步回声(带 upstream-sync 标记),不是新用户留言,无需处理。状态汇报:head 2698df6 的第四轮复审在重启前已完整收工——PR 评论 6793427155(逐项核对 master 增量与 #5598 修复无交互)+ 收工报告均已发出,CI 镜像缓存 failed=0/pending=0、本地定向测试 3/3 + typecheck 干净。结论不变:可合(APPROVE 等价),唯一待办仍是 owner 以人工身份批准解除 blocked(同账号自批被 GitHub 422 拦截)。本轮起该线程内不再做多余 shell 操作,避免再次卡死。

@ranxianglei

Copy link
Copy Markdown
Owner Author

🤖 Powered by ework · qwen3.8-27b

[ework] CI fix verified green ✓

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working p3 scope/wiring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant