Repository navigation
[PR] fix: invariant judge 4MiB body cap — skip parsing on overflow, no more OOM vector for oversized requests (#4021) | fix: 不变量裁判 4MiB body 上限 —— 超限跳过不解析,超大请求不再有 OOM 向量(#4021) - #4023
Conversation
…rsized advisory input (#4003 P2)
📦 Built Package ArtifactBranch: Option A — Install this exact build (recommended)npm install -g billion-context@0.0.4810-pr.4023.927500dThis exact version is immutable and reproducible. The rolling Option B — Download artifact
tar xzf billion-context-pr4023.tgz
npm install -g packageInstall instructions are refreshed on each push. |
[bot] 🏷 (ai: vllm-qwen/qwen3.8-27b) 查重: 不重复 —— 按失败签名(invariant judge / JUDGE_BODY_CAP / body cap)检索 open+closed issues 与 PRs:只有本 PR 修复的原始 issue #4021,没有其他在途或已合并的条目修同一缺陷(#3866/#3944 是该裁判的功能引入与 GA,#3985 是 echo 归一化的另一处修复,均已合入,机制不同)。 标签: bug, scope/kernel, p1 —— 缺陷修复(裁判诊断层缺 body 上限);对象是 bili 自身的上下文管理诊断面,不绑定具体客户端故不打客户端标;p1 理由:#3128 放开 5GiB 请求预算后,单个超大请求在这里走整 body JSON.parse,属「内存涨到进程死亡」类向量,且常规 1–5MiB body 每请求都付 CPU 税。 开始独立审核(方向 / 回归 / 代码 / 测试 / diff),结论稍后按八问体例回复。 |
…ty bodies are not "over cap"
(ai: vllm-qwen/qwen3.8-27b) 审核结论:可合。 独立审核完成(方向 / 回归 / 代码 / 测试 / diff 全过);审核中发现两处小问题已按「小问题直接修」推到分支上(见下)。 八问:
审核中顺手修的两处小问题(PR 分支上的附加 commit,各自独立绿):
测试有效性:新增回归断言有牙——5MiB body 里藏了 "REWRITTEN BY DEFECT" 标记,cap 失效一旦去解析就会判红被抓;跳过级别钉在 debug(不是 warn);Buffer/字符串双路径;小 body 照常判红的 sanity 检查证明 cap 没弄坏裁判。基线(原 head)27/27 绿,我的两个 commit 后仍 27/27,tsc --noEmit 干净。全量套件判定以远程 CI 为准。 diff 整洁度:原 PR 2 文件 +59/-0,加我两个 commit 后仍只有 src/invariant-judge.ts 与 tests/invariant-judge.test.ts,每一行都与本 PR 目的相关,无无关改动、无格式 churn。 自动合并门槛(§7.4):机械条件满足(单模块 fix:、有回归测试、干净 diff、引用 Fixes #4021、不触 config schema/持久化/wire/kernel/update.ts)——合并动作归你。 关联发现:发送咽喉点还有一处同域的未封顶整 body parse(src/server/relay.ts:639,seam 取证,喂估算/消息计数/#3803 指纹)——机械照搬 cap 会回退 #3803 的尾字段可见性设计,已在 #4021 登记为 checklist 项并给出 A/B/C 选项(推荐 A),等你拍板,未混入本 PR。 CI:新 head b1946db 上 gate 已绿,guard/test 分片在排队(hermetic runner 并发受限),完成后我补一条结果。 |
(ai: vllm-qwen/qwen3.8-27b) CI 结果跟进(上条八问回复承诺的收尾)b1946db 的全量 CI 已跑完:42 项检查 = 25 绿 / 12 skip / 5 个测试分片红。我把 5 个红分片的原始日志全部拉下来逐一对过: 5 个红分片的真实失败全部是同一对既有测试(#3769 会话记录读回家族),与本 PR 改动无关:
判定「与 PR 无关」的硬证据:
本 PR 自身在 CI 里的表现: invariant-judge 相关测试在所有跑到它的分片全部通过(含新增 cap 回归 处置:
|
Fixes #4021(现象/根因见 issue 正文)。
改动(src/invariant-judge.ts)
JUDGE_BODY_CAP = 4 MiB模块常量(注释写明依据:seam 取证SEAM_BODY_CAP = 512KiB的「部分取证,静默跳过」纪律;[Bug/Enhancement] Codex 超过 100 MiB 的请求在 ACP 处理前断开:希望返回明确 413 并支持配置字节预算(#2606 后续) #3128 的 5GiB 预算下无上限 parse 是 OOM/阻塞向量)。刻意不加配置 knob —— 与 SEAM_BODY_CAP 同为常量,操作者真有诉求再议配置面(避免未经 owner 拍板的配置面扩张)。maybeRunInvariantJudge(主道)与maybeJudgeContinuity(loop 轮 2+)入口统一withinJudgeCap门:字符串按Buffer.byteLength,Buffer 按长度;超限 → debug 一行(带阈值,「advisory layer, [PR] review: v0.1.202 → master full-regression anchor (ci:full) #4003 cap」)+ 直接返回,零 verdict 零异常。验证
tests/invariant-judge.test.ts新增回归:5MiB 字符串 body 零 verdict、跳过日志落在 debug(不是 warn)、Buffer 同路径、连续性车道 prev/next 任一超限即跳、小 body 照常判红(裁判未坏)。27/27 绿。tsc --noEmit干净。不触 wire/协议/kernel;纯诊断层加固,且方向只会少做事(超限跳过),不会改变任何判定结果。