知识卡片
快照写操作用seq比较驱动的COW规则
内容
每次写请求都带着客户端认为的最新快照序号(SnapContext.seq),OSD 端把它和对象自己保存的 SnapSet.seq 比较来决定怎么处理:客户端序号更旧就直接拒绝(-EOLDSNAP,逼客户端刷新后重试);相等就是正常写,不涉及快照;客户端序号更新,说明这是”做过快照之后的第一次写”,此时才触发写时复制——把当前 head 对象整体 clone 一份存为新的快照对象,登记进 clones 列表,再把新数据写入 head。这套设计的关键在于:真正复制数据的时机不是”创建快照”那一刻,而是”快照之后第一次写”那一刻,且只做一次(后续写不会重复触发 clone,因为 seq 已经追平)——把是否需要保护旧数据的判断完全收敛成一次序号比较。
参考来源
《Ceph源码分析》第9章《Ceph快照和克隆》