Commit bdef95c
stats 那条间歇红坐实了:判据抢在缓存落地之前读 —— 改成轮询,而硬编码 0 那一族照样红
`tests/stats/run.sh` [3/5] 的 `cache.entries` 那条,在完整门禁里三次红过一次、单跑从没红过。
## 根因(读源码 + 注入坐实,⛔ 不是推理)
产品在**响应体写完之后**才存缓存:`crates/fulcrum-server/src/lib.rs` 里
`write_response_body(Bytes::new(), true)` 在前、`store_if_allowed` 在后 ——
这是有意的,缓存写入不该挂在客户端的延迟路径上。上游夹具带 `Content-Length`
⇒ curl 在最后一个体字节到达时就退出了,而判据紧接着走 admin socket 读 `/stats`,
中间没有任何等待 ⇒ 机器满载时读到 `entries=0`。
★ 在那两行之间注入 300 ms ⇒ 旧判据 **100% 红**,报文与门禁里那次逐字相同;
还原(sha256 与字节备份逐字相同)⇒ 回绿。
佐证:`tests/cache/run.sh` 判缓存一律靠再发一次请求看 `X-Fulcrum-Cache: HIT`,
天然隔着一整个客户端往返 ⇒ 全仓只有这一格在响应刚回来就走旁路读缓存状态。
## 修法:在原断言之前轮询,⛔ 产品一行不改
最多 50 次 × 0.1 秒;循环里只取数不判定(用 `capture`,不用 `capture_ok`,
否则每轮没等到都记一笔失败);判定仍是原来那几行断言,一个字节没动。
⚠ 放弃的是「存入变慢、但慢不过 5 秒」那一族 —— 那从来不是这条判据的目标;
「把 cache 硬编码成 `{entries:0}`」那一族照样判红。
## 判据(四个方向全部本机实测;注入 → 跑 → 还原串成一条命令,挂 trap 保证还原)
· NC-C 存入前延迟 300 ms ⇒ 新判据 `GATE_RC=0`,**第 4 次读**才看到条目落地(轮询真的在等)
· NC-A 永不存入(`captured.filter(|_| black_box(false))`)⇒ `GATE_RC=1`,读满 50 次仍未落地,
报文「期望「1」实际「0」」与旧判据逐字相同(判别力没丢)
· 干净基线 ⇒ `GATE_RC=0`,第 1 次就读到
· 四趟日志里都有新鲜的 `Compiling fulcrum-server`;终态 `lib.rs` sha256 与备份逐字相同,源码零注入残留
· `LINT_ONLY=1`:shellcheck 53 个脚本全过
· 完整门禁 `bash tests/m0/docker-run.sh`:`GATE_RC=0`(6438 行,0 个 `✗`);
单测 28 个二进制 884 条全绿,**我们自己的 crates/ 0 条 ignored**(零跳过);
vendor 那 2 条失败与 10 条 ignored 与官方原版 0.8.1 逐项相同;
stats 那一格在完整门禁的负载下第 1 次就读到
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent 2c9fbef commit bdef95c
1 file changed
Lines changed: 28 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
370 | 370 | | |
371 | 371 | | |
372 | 372 | | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
373 | 401 | | |
374 | 402 | | |
375 | 403 | | |
| |||
0 commit comments