JianFeeeee
8884cf9962
fix(io): 并发判据自带串话 —— 32 个 goroutine 抢 26 个 key
## 缺陷(既有,实测在本次改动之前的基线上同样复现)
`TestConsumeToolBlocksFor_ConcurrentNoCrossTalk` 约 1/8 概率假红:
.go:105: call E 期望 [block-4-E],实际 []
根因在判据**自己**:
const n = 32
id := string(rune('A' + i%26)) // ← 字母只有 26 个
i=0 与 i=26 都得到 'A',i=1 与 i=27 都得 'B' …… 共 6 个 id 各被两个
goroutine 共用。两者共享同一个 key:后 Set 覆盖先 Set 的、先 Consume
拿到空或别人的值。
所以它想验证"不同 key 不串话",却让多个 goroutine 抢同一个 key ——
**判据违反了它自己想验证的前提**。这不是 `SetToolBlocksFor` /
`ConsumeToolBlocksFor` 的并发缺陷(共用 key 本就该覆盖)。
## 修法
id := "call-" + strconv.Itoa(i) // 唯一
实测:修改前 12 次内命中 1 次;修改后连跑 20 次 0 失败。
## 补两条判据把前提本身钉住
TestConsumeToolBlocksFor_KeysAreIsolated
一次性写 64 个**互不相同**的 key,逐个读回必须各得其所。
不涉及并发 ⇒ 失败一定是真缺陷,不会偶发。
TestConsumeToolBlocksFor_ConsumeIsOneShot
读一次后清空(block 是一次性的)。
变异:删掉 `delete(m.toolPendingBlocks, callID)` ⇒ 实测红:
★ 二次消费应得空(block 是一次性的),实际 [b]
## 为什么这条值得单独修
一个 1/8 概率假红的判据,实际效果等于**没有判据**:
它在 CI 里红了几次之后,所有人都会学会"重跑一次"。
而这正是本仓"长红 ⇒ 整道门失效"教训的一个变体。
## 验证
go build ./... PASS
go vet ./... PASS
gofmt -l 干净
go test ./... -count=1 65 包全过,0 FAIL
该判据连跑 20 次 0 失败(修改前 12 次中 1 次)
2026-11-04 19:24:22 +08:00
..
2026-11-04 19:24:22 +08:00
2026-11-04 18:26:46 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 11:57:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-22 20:49:44 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:56:47 +08:00
2026-10-21 12:17:19 +08:00
2026-10-17 19:18:24 +08:00
2026-11-04 08:21:15 +08:00
2026-10-29 23:53:48 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 11:57:48 +08:00
2026-10-27 15:53:49 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 16:34:46 +08:00
2026-10-26 20:55:25 +08:00
2026-10-26 20:55:25 +08:00
2026-11-04 11:57:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-11-03 08:46:46 +08:00
2026-11-04 11:57:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 11:57:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 18:11:06 +08:00
2026-10-25 21:39:12 +08:00
2026-10-30 17:00:47 +08:00
2026-10-25 13:48:35 +08:00
2026-11-03 14:37:53 +08:00
2026-11-04 11:57:48 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-25 15:55:26 +08:00
2026-10-25 15:55:26 +08:00
2026-10-29 23:53:48 +08:00
2026-10-25 15:55:26 +08:00
2026-11-04 11:57:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-26 20:55:25 +08:00
2026-10-27 12:16:06 +08:00
2026-11-04 15:58:22 +08:00
2026-11-04 15:58:22 +08:00
2026-10-21 12:17:19 +08:00
2026-10-27 15:40:43 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-10-21 12:17:19 +08:00
2026-10-25 17:03:09 +08:00
2026-10-26 20:55:25 +08:00
2026-11-04 11:57:48 +08:00
2026-10-22 22:42:02 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-02 21:54:35 +08:00
2026-11-02 21:54:35 +08:00
2026-11-03 14:37:53 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 11:57:48 +08:00
2026-10-26 20:55:25 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 16:34:46 +08:00
2026-11-04 16:34:46 +08:00
2026-10-29 23:53:48 +08:00
2026-10-30 17:00:47 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 14:15:33 +08:00
2026-10-29 23:53:48 +08:00
2026-10-26 20:55:25 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 11:23:05 +08:00
2026-11-04 11:23:05 +08:00
2026-10-23 15:51:02 +08:00
2026-10-27 11:49:26 +08:00
2026-11-04 08:21:15 +08:00
2026-10-23 15:51:02 +08:00
2026-10-21 12:17:19 +08:00
2026-10-06 09:22:12 +08:00
2026-10-29 23:53:48 +08:00
2026-10-31 11:39:13 +08:00
2026-10-23 15:51:02 +08:00
2026-11-04 14:15:33 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 11:57:48 +08:00
2026-10-31 06:35:32 +08:00
2026-11-04 11:23:05 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 16:53:13 +08:00
2026-10-30 17:00:47 +08:00
2026-10-30 17:00:47 +08:00
2026-10-31 19:16:58 +08:00
2026-10-30 17:00:47 +08:00
2026-10-30 17:00:47 +08:00
2026-11-04 08:21:15 +08:00
2026-10-31 10:03:43 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 16:53:13 +08:00
2026-10-25 18:25:37 +08:00
2026-10-29 23:53:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-23 15:51:02 +08:00
2026-09-13 08:59:15 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-26 20:55:25 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-09-13 07:00:51 +08:00
2026-10-24 14:34:24 +08:00
2026-10-21 12:17:19 +08:00
2026-10-27 15:58:55 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-11-03 09:20:04 +08:00
2026-10-31 07:14:09 +08:00
2026-11-04 11:57:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 08:35:23 +08:00
2026-10-26 20:55:25 +08:00
2026-11-04 11:57:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-29 23:53:48 +08:00
2026-11-03 08:46:46 +08:00
2026-10-21 12:17:19 +08:00
2026-10-25 10:10:21 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 16:24:49 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 18:11:06 +08:00
2026-10-29 23:53:48 +08:00
2026-11-04 14:02:58 +08:00
2026-11-04 08:21:15 +08:00
2026-10-23 15:51:02 +08:00
2026-10-29 23:53:48 +08:00
2026-10-26 20:55:25 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-11-04 11:57:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-29 23:53:48 +08:00
2026-10-29 23:53:48 +08:00
2026-10-23 15:51:02 +08:00
2026-10-21 12:17:19 +08:00
2026-10-05 11:25:20 +08:00
2026-11-04 11:57:48 +08:00
2026-10-25 20:16:16 +08:00
2026-10-25 20:16:16 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 18:11:06 +08:00
2026-10-29 23:53:48 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-10-21 12:17:19 +08:00
2026-11-04 08:21:15 +08:00
2026-11-04 08:35:23 +08:00