Repository navigation
Open
Description
基线与代码依据
Extensions 495414b76a37aca4d7c1022d973a8e5b9a7e92e6;Core 76d44429fdaa6a69320e21a1cb77119d0889d792。两个仓库已更新,远端均无新提交。
Line 168 in 495414b
| public void saveAll(String conversationId, List<Message> messages) { |
Line 181 in 495414b
| public void saveAll(String conversationId, List<Message> messages) { |
Line 211 in 495414b
| public void saveAll(String conversationId, List<Message> messages) { |
已复现问题
三个实现都分开执行删除和列表写入,没有原子替换边界。Redisson 还在删除旧列表后才序列化新消息。
实际 Redisson 仓库的两个独立复现:
- 两个 saveAll 各写一条快照;在 RList.delete 设置屏障,使两次删除先完成,再执行两次 addAll。最终保存两条消息,即两份快照混合,既不是完整 A,也不是完整 B。
- 新消息 metadata 包含循环引用使实际序列化器失败;旧列表已经执行 delete,保存抛错后历史为空。Jedis/Lettuce 预先序列化,但仍有 DEL/RPUSH 间的并发与故障窗口。
交付与验收
- 所有校验和序列化在破坏现有记录之前完成;serialization failure 不删除旧历史。
- 为整个快照定义 Redis 侧原子替换,读取只能看见旧或新完整快照;明确 Lua、事务或临时 key 交换的选择和 Cluster key-slot 约束。
- 覆盖并发写、写入与读取交错、空列表、序列化失败、命令失败和三客户端互读,真实 Redis 上验证。
- 原子替换不等于合并多个上层 read-modify-write;若仍采用最后写入者覆盖,明确该语义,不宣称解决所有对话并发丢更新。
- 保持或明确迁移旧列表格式、key、TTL 策略,不对旧消息进行无依据重排。
验证边界与变更约束
本次使用当前实际编译类进行可执行验证,Redis 客户端/命令边界使用 Mockito 替换,未声称已通过真实 Redis、TLS 握手或集群验收。修复需增加真实后端验证。优先局部修复;若涉及公开 API、默认行为、坐标或存量数据,说明消费者影响、兼容替代、迁移/回滚及目标版本,不等待 Agent/Workflow/Loop 全局重构。关联 #30、#34;#34 是包职责整理,本单是具体运行行为缺陷。
Metadata
Metadata
Assignees
Labels
No labels
Activity
fix(redis): publish complete snapshots atomically across clients