Skip to content

Make membership cache invalidation failures repairable #71

Description

@ULookup

Target Version

3.0-dev。复核基于 origin/3.0-dev 提交 a75fc8721b99e5c0b4421d0c58b5618bbe71ff31(PR #57)。该 PR 加强了 Redis 熔断、成员快照版本校验和 L1/L2 防旧回填,但 MySQL 写后失效的 durable repair 仍缺失。

Evidence

  • common/dao/data_redis.hpp:922-958 在 Redis 异常时返回 unknown version/unstable snapshot,warm_if_version 使用 Lua 防止旧 warm 覆盖新版本;这是有价值的读取侧防护。
  • conversation/source/conversation_server.h:209,296,320,388,427 仍在 MySQL 成员变更后调用 invalidate_members_cache_
  • conversation/source/conversation_server.h:897-901 不检查失效结果。
  • common/dao/data_redis.hpp:1027-1038Members::invalidate 返回 void,Redis/Lua 异常只记录日志;没有 pending repair、重试所有者或成功响应后的收敛证据。
  • Add/remove 增量方法同样吞掉异常;读取侧 unknown-version 防护不能替代 MySQL commit 后丢失的版本推进。
  • 当前 Reliability 仅注入 Redis 整体故障,未覆盖 Remove/quit/dissolve 在 MySQL commit 后 Redis 失效失败、恢复及多实例旧 L1 收敛。

Problem or Goal

让成员变更后的缓存失效失败成为可检测、可重试、可收敛的状态。权限收紧操作不得因为 Redis 失效丢失而在长 TTL 内继续信任已知旧成员快照。

Scope

  • 为成员变更产生 durable pending invalidation/repair,并定义所有者、幂等键、顺序和完成条件。
  • Redis 恢复后推进版本、清除 L2,并让各实例 L1 在有界时间内失效。
  • Transmite 在 pending/unknown 状态使用安全 MySQL/RPC 校验或 fail-closed。
  • 覆盖 Add/Remove/quit/dissolve/role change。
  • 复用 PR feat(cache): harden Redis resilience and multilevel caching #57 的 breaker、unknown-version 与防旧 warm 能力,不重复实现通用熔断。

Non-goals

  • 不要求 Redis 与 MySQL 分布式事务。
  • 不把成员列表双写成两个真相源。
  • 不把所有缓存改为强一致。
  • 不修改普通用户资料缓存。

Acceptance Criteria

  • MySQL 写成功而 Redis 失效失败时产生可查询的 pending repair。
  • Redis 恢复后 repair 自动完成,所有实例旧 L1/L2 在有界时间内失效。
  • 被移除/退出用户在 pending 或 unknown 状态不能依赖旧缓存继续发送。
  • Add/Remove/quit/dissolve/role change 共享一致版本与恢复语义。
  • 指标暴露 failure、pending age、repair success/failure 和安全降级。
  • 重试幂等且不能回滚较新版本或删除新 warm 的正确数据。
  • Reliability 覆盖 MySQL commit 后 Redis 不可用、恢复和多实例 L1 收敛。

Test-first Plan

在现有 Reliability 层增加 RL-CACHE-01 并运行:

make -C tests test-reliability TEST_RUN=TestRL_CACHE_MembershipInvalidationRepair

预期 RED 是 Remove/quit 已提交后,被移除用户仍能凭旧缓存发送,且 Redis 恢复后无自动 repair。最小 GREEN 是 durable repair 与 pending 状态下的安全授权;随后运行 Conversation、Transmite、Security、缓存回归和 BVT。

Risk and Security

这是授权边界。过度 fail-open 会延长越权窗口,过度 fail-closed 会阻断合法发送;repair 必须防重复、乱序和惊群,日志/指标不得暴露完整成员列表。

Architecture Impact

Yes。Conversation 的 MySQL 写后新增可恢复失效边界,Transmite 增加 pending/unknown 授权处理;MySQL 仍是成员真相源。

Core-flow Impact

Yes。改变成员写、缓存版本、授权降级与恢复流程。

Required Skill Updates

  • 更新 technology stack,记录成员缓存一致性与降级契约。
  • 更新 repository map,登记 repair 状态与 worker 所有权。
  • 更新 core flows,补充成员写、失效、授权和恢复。
  • 更新 case catalog,登记 RL-CACHE-01 与 Security 场景。
  • 如形成通用安全降级规则,同步安全 Skill 的直接引用资料。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Severity/S1area/cache多级缓存子系统bugSomething isn't workingsecurity安全类缺陷(凭据泄露/鉴权绕过/fail-open)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions