bcachefs 的快照实现

这段时间在断断续续地看 bcachefs 的相关内容,这里记录一下快照的实现细节。

数据结构

简要介绍一下涉及的主要数据结构。

copy-on-write(COW) b+tree(参考资料 1)

这是 bcachefs 的核心数据结构,其中的每个节点都比较大,典型的节点大小是 256KB。之所以用这么大的节点,是因为对节点的修改方式是 append-only 的(术语叫 log-structured)。如果要删除其中的某个 item,并不是把它直接从树中删除,而是在节点最后追加一个类型为 KEY_TYPE_whiteout 的相同 key 的 item。这样当查找该 item 的时候,找到这个带有 KEY_TYPE_whiteout 的 key 时,就知道该元素被删除了,从而跳过该 item 的处理。当节点满了之后可能需要分裂并引发对从当前节点到根节点的修改,这时就是常规的 COW 操作了(参考资料 2)。因为节点都比较大,同时对于链路上的节点大部分是 append 操作,不会引发 COW,因此并不会导致太多的写放大。

对于文件系统中的组成部分,如 inode/dirent/extent 等,会分别存放在各自的 COW b+tree …

阅读全文…