Redis MessageStore 集成测试隔离诊断¶
Bug 摘要¶
隔离验收中的 cargo test --workspace 偶发使
reserved_故障恢复_状态失败点与异值冲突 在恢复扫描时报
MessageStoreError::CorruptRecord。生产实现没有随机写坏提交记录;失败来自同一测试二进制内并发执行的故障注入用例。
已验证假设¶
- 假设:提交记录编码或恢复扫描存在非确定性损坏。
- 证据:相同实现此前在独立 Redis 上通过全部 MessageStore 向量;本次失败发生在全 workspace 并发测试。
- 结果:否定。没有证据表明 canonical commit 自身被写坏。
- 假设:故障注入测试污染全局恢复索引。
- 证据:
恢复索引损坏不得被静默跳过直接向全局msgrecover:{commit}写入不存在对应 commit hash 的成员;原实现不清理该成员,也没有与同文件其他 Tokio 测试串行。 - 结果:确认。并发的正常恢复扫描会按契约读到该成员并返回
CorruptRecord。
根因¶
- 直接原因:正常恢复扫描与故障注入在同一个 Redis DB、同一个全局 ZSET 上重叠。
- 根本原因:测试只为业务键生成唯一 tenant,却把全局恢复索引误当成可按 tenant 隔离的状态;故障注入用例既缺少并发隔离,也缺少清理。
修复方案¶
在 redis_message_store 集成测试文件内使用一个异步互斥锁串行化共享 Redis 状态,并让故障注入测试在取得扫描结果后、执行断言前显式 ZREM 自己写入的坏成员。生产恢复扫描遇到任何损坏即失败的行为不变。
影响文件¶
crates/qim-store/tests/redis_message_store.rs
回归风险¶
风险低。变更仅影响测试调度和测试数据清理;代价是该文件的九个 Redis 用例串行执行,换取确定性。其他测试文件仍使用唯一业务 ID,不新增生产锁或运行时分支。