Skip to content

Fix sequence recovery and fence Redis counter regression #69

Description

@ULookup

Target Version

3.0-dev。复核基于 origin/3.0-dev 提交 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57)。Redis 依赖故障已具备熔断与 fail-closed 基础,但计数器丢失/回退的检测和恢复仍未实现。

Evidence

  • common/dao/data_redis.hpp:681-714 的 SeqGen 在 Redis INCR 异常时返回 0/空数组;transmite/source/transmite_server.h:278-315 将其转换为 kSystemUnavailable,PR feat(cache): harden Redis resilience and multilevel caching #57 后依赖故障不会继续发布。
  • 但 SeqGen 正常执行 INCR 前不校验 MySQL 高水位或 generation;Redis key 被删除、旧快照恢复或主从切换回退时,INCR 可成功返回低值,绕过上述 fail-closed。
  • message/source/message_server.h:1239-1266 仍只在 Message 启动时回填,并传入 max_seq + 1
  • common/dao/data_redis.hpp:716-738 把 Redis 当前值提升到传入 base;随后下一次 INCR 产生 max_seq + 2,off-by-one 仍存在。
  • 回填锁超时、Redis/Lua 异常仍只记录日志并继续;readiness 不表达序号保护状态。
  • PR feat(cache): harden Redis resilience and multilevel caching #57 的 Reliability 当前只覆盖 Redis 整体停止/恢复,没有 key 丢失、计数器回退、并发恢复或启动锁竞争。

Problem or Goal

在保留 Redis 在线分配、MySQL 持久高水位的前提下,保证计数器丢失、回退、故障转移或重启后,新 conversation/user seq 永不小于已持久化高水位。允许 gap,禁止回退和复用。

Scope

  • 修正启动回填的 current-value/next-value 语义与 off-by-one。
  • 为运行期 key 缺失或回退增加 generation、高水位检测、fencing 和自动恢复。
  • 保留 PR feat(cache): harden Redis resilience and multilevel caching #57 已实现的 Redis 故障 fail-closed,并扩展到“状态可用但不可信”的场景。
  • 覆盖 conversation seq、user seq 与多实例并发恢复。
  • 将回填/fence 状态接入 readiness、指标和告警。

Non-goals

  • 不要求序号连续无间隙。
  • 不把全局 message_id 改为会话序号。
  • 不更换 Redis Cluster hash-slot 算法。
  • 不绕过 MySQL 唯一约束或以错误重试隐藏冲突。

Acceptance Criteria

  • Redis INCR 抛错时 Transmite fail-closed 并返回依赖不可用。
  • MySQL 最大值为 N 时,恢复后的第一条新序号为 N+1。
  • 运行期删除或回退 seq key 后,不会持久化小于等于 MySQL 高水位的新记录。
  • 多实例并发恢复同一 key 只产生单调、唯一结果。
  • 状态可访问但 generation/高水位无法安全判定时同样 fail-closed。
  • 回填失败或锁竞争不会静默进入 ready;readiness 表达保护状态。
  • 指标覆盖 regression、recovery、fence rejection、冲突与恢复延迟。
  • Reliability 覆盖 key 丢失、节点切换、并发恢复和启动锁竞争。

Test-first Plan

在现有 Reliability 层增加 RL-SEQ-01:先写入 MySQL 高水位 N,再删除/回退 Redis key 并并发发送,运行:

make -C tests test-reliability TEST_RUN=TestRL_SEQ_CounterLossNeverRegresses

预期 RED 是产生 1、唯一键冲突或启动回填后首值 N+2。最小 GREEN 先修正 next-value,并为运行期未知 generation 增加 fence;随后运行消息并发、幂等、同步和 BVT 回归。

Risk and Security

恢复查询必须只在不确定状态触发并防止惊群。错误 fencing 会降低可用性,错误放行会破坏顺序与唯一性;回滚不得降低任何已提升高水位。日志不得包含消息正文。

Architecture Impact

Yes。明确 Redis 在线序号与 MySQL 持久高水位之间的 generation/recovery/fence 边界。

Core-flow Impact

Yes。改变 Transmite 分配前置条件、Message 启动/readiness 和 Redis 恢复流程。

Required Skill Updates

  • 更新 technology stack,记录序号权威、generation 与恢复语义。
  • 更新 repository map,登记 recovery/readiness/metrics 入口。
  • 更新 core flows,明确允许 gap、禁止回退/复用及 fail-closed。
  • 更新 case catalog,登记 RL-SEQ-01

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions