跳转至

Redis MessageStore 集成测试隔离诊断

Bug 摘要

隔离验收中的 cargo test --workspace 偶发使 reserved_故障恢复_状态失败点与异值冲突 在恢复扫描时报 MessageStoreError::CorruptRecord。生产实现没有随机写坏提交记录;失败来自同一测试二进制内并发执行的故障注入用例。

已验证假设

  1. 假设:提交记录编码或恢复扫描存在非确定性损坏。
  2. 证据:相同实现此前在独立 Redis 上通过全部 MessageStore 向量;本次失败发生在全 workspace 并发测试。
  3. 结果:否定。没有证据表明 canonical commit 自身被写坏。
  4. 假设:故障注入测试污染全局恢复索引。
  5. 证据:恢复索引损坏不得被静默跳过 直接向全局 msgrecover:{commit} 写入不存在对应 commit hash 的成员;原实现不清理该成员,也没有与同文件其他 Tokio 测试串行。
  6. 结果:确认。并发的正常恢复扫描会按契约读到该成员并返回 CorruptRecord。

根因

  • 直接原因:正常恢复扫描与故障注入在同一个 Redis DB、同一个全局 ZSET 上重叠。
  • 根本原因:测试只为业务键生成唯一 tenant,却把全局恢复索引误当成可按 tenant 隔离的状态;故障注入用例既缺少并发隔离,也缺少清理。

修复方案

在 redis_message_store 集成测试文件内使用一个异步互斥锁串行化共享 Redis 状态,并让故障注入测试在取得扫描结果后、执行断言前显式 ZREM 自己写入的坏成员。生产恢复扫描遇到任何损坏即失败的行为不变。

影响文件

  • crates/qim-store/tests/redis_message_store.rs

回归风险

风险低。变更仅影响测试调度和测试数据清理;代价是该文件的九个 Redis 用例串行执行,换取确定性。其他测试文件仍使用唯一业务 ID,不新增生产锁或运行时分支。