知识卡片
空快照靠定位最近的后继clone对象实现零拷贝读取
内容
如果连续做了几次快照但中间没有发生写操作(比如序号 1、3、6 的快照,只有第 1 次和第 6 次之间发生过写),中间那次快照(序号 3)根本没有对应的 clone 对象——因为 [[快照写操作用seq比较驱动的COW规则|clone 只在快照之后第一次写时才触发]]。读取序号 3 的快照时,查找逻辑是在 clones 列表里找到第一个大于等于 3 的序号(即 6 对应的 clone 对象 obj1_6 存的是快照 3 时刻的数据),直接返回这个更晚创建、但数据恰好没变过的 clone 对象。这是”没有变化就不需要额外存一份”的自然推论:既然连续多个快照之间数据完全相同,就没必要在存储上真的区分它们,只需要在查找时正确算出该去哪个已有的对象里取数据。
参考来源
《Ceph源码分析》第9章《Ceph快照和克隆》