知识卡片

flush操作维护克隆链的持久化顺序依赖

专业/工作 · 244.c.3.b

内容

把一个脏对象从 cache pool 回刷到 data pool 之前,必须先确保它所有更早版本的克隆对象([[快照写操作用seq比较驱动的COW规则|clones 列表]]中版本号更小的那些)已经处于 clean 状态——例如某对象的克隆序列是 [1,4,5,8],当前要 flush 版本 5,就必须先保证版本 1、4 都已经安全落盘,否则直接返回 EBUSY 或缺失错误拒绝这次 flush。这是因为克隆对象之间存在 [[RBD克隆靠CopyUp延迟复制父镜像数据|写时复制的依赖链]]——后面的版本在语义上”继承”自前面的版本,如果乱序回刷、新版本先于旧版本落盘,一旦此时发生故障,data pool 上就会出现一个新版本存在但它所依赖的旧版本却缺失的不一致状态。凡是存在链式依赖的数据,持久化顺序必须尊重这条依赖链,不能因为回刷是异步后台任务就放松这个约束。

参考来源

《Ceph源码分析》第13章《Ceph自动分层存储》