Skip to content

Verify write-ahead unacked delivery under crash and ACK races #72

Description

@ULookup

Target Version

3.0-dev。复核基于 origin/3.0-dev 提交 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57)。write-ahead 与原子 Redis ledger 已落地,本 Issue 更新为完成系统级故障验证及修复验证发现的边界问题。

Evidence

  • push/source/push_server.h:107-151PushToUser 已在 _local_send 前逐设备调用 persist_unacked_;失败返回依赖不可用。
  • push/source/push_server.h:180-219PushBatchpush/source/push_server.h:286-320 的 MQ 本地路径也在发送前持久化;MQ 路径失败返回 NackRequeue
  • 跨实例 PushBatch 会检查 RPC 传输状态和 response.header.success 后才 ACK MQ。
  • common/dao/data_redis.hpp:1815-1840 使用相同 {uid:device} hash tag,并以单个 Lua 同时维护 ZSET、HASH、repair cursor 和 TTL,消除了半写。
  • tests/reliability/redis_failover_test.go 的 RL-05 已验证 Redis 停止时 Push 重排队、恢复后投递并存在 unacked;尚未覆盖 persist 后/send 前崩溃、send 后/ACK 前崩溃、快速 ACK 与重复消费。
  • PR feat(cache): harden Redis resilience and multilevel caching #57build/service-artifacts 检查失败,Reliability job 被跳过;上述 RL-05 没有该合入提交的绿色 CI 证据。

Problem or Goal

用可执行故障测试证明 write-ahead delivery invariant 在真实崩溃、快速 ACK、重复消费和 Redis 恢复下成立;若测试暴露状态机缺口,在同一边界内完成最小修复。

Scope

  • 保留并验证 PushToUser、PushBatch、MQ 本地/跨实例路径的 persist-before-send。
  • 覆盖 persist 后/send 前、send 后/ACK 前、ACK 与重投并发、重复 MQ 消费等崩溃点。
  • 验证 WS send 失败保留状态,Redis 故障触发明确失败或 MQ requeue。
  • 验证 ZSET/HASH/repair key/TTL 的原子性、同 slot 与 orphan repair。
  • Make delivery ACK convergence durable and trustworthy #58 的 durable ACK 收敛测试衔接,但不在本 Issue 重做 MySQL 水位线协议。

Non-goals

Acceptance Criteria

  • 三条带 user_seq 的首发路径在 WebSocket send 前登记 unacked。
  • 登记使用同 slot Lua,ZSET/HASH/TTL 不产生可观察半写。
  • Redis 登记失败不会以“已可靠投递”继续;MQ 路径会 requeue。
  • persist 后/send 前或 send 后/ACK 前停止 Push,恢复后消息仍可重传。
  • 快速 ACK、重复 MQ 消费和重复登记不会产生幽灵 unacked 或冲突记录。
  • WS send 失败保留待重传状态,并通过心跳/恢复路径最终投递。
  • RL-05 与新增崩溃矩阵在 CI 实际执行且通过,并输出 Redis/WS/ledger 证据。
  • Make delivery ACK convergence durable and trustworthy #58 的 ACK durable handoff 接入后,write-ahead 状态最终安全删除。

Test-first Plan

扩展现有 tests/reliability,先写 TestRL_PUSH_WriteAheadCrashMatrix,在每个注入点轮询 Redis ledger 与客户端去重结果。运行:

make -C tests test-reliability TEST_RUN=TestRL_PUSH_WriteAheadCrashMatrix

预期 RED 必须是某一崩溃点后消息不可重传、出现幽灵项或重复状态冲突;最小 GREEN 仅修复对应状态迁移。随后运行 RL-05、WebSocket Functional、消息 Scenario、#58 回归和 BVT。

Risk and Security

write-ahead 增加 Redis 写延迟与容量压力。测试与实现必须保持 TTL、payload 访问边界和日志脱敏;故障注入只作用于隔离环境。不能为了吞吐绕过登记原子性。

Architecture Impact

No。Push 仍拥有 WebSocket route 与 per-device unacked;本 Issue完成其状态机验证,不新增服务边界。

Core-flow Impact

Yes。验证并可能修正 Push 首发、崩溃恢复、ACK 竞态和 MQ 重投状态迁移。

Required Skill Updates

  • 更新 core flows,明确 write-ahead、MQ requeue、重传与 Make delivery ACK convergence durable and trustworthy #58 ACK handoff。
  • 更新 testing case catalog,登记 RL-05 与 crash matrix。
  • 更新 testing framework/technology stack,修正 Reliability 已可执行的事实。
  • 如新增指标或故障配置,更新 repository map。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Severity/S1area/infra跨系统基础设施bugSomething isn't workingtech-debt设计已规划但代码未对齐的实现差距

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions