跳转至

一个快照会捕获在创建的时间点的 DB 的一致性视图。快照在 DB 重启之后将消失。

API 使用

  • 通过 GetSnapshot API 创建一个快照
  • 通过设置 ReadOptions::snapshot 来读取快照的内容
  • 当读取结束,调用 ReleaseSnapshot 释放相关资源

实现

Flush/compaction Representation

一个快照相当于一个 SnapshotImpl 类的小型对象。他只持有部分简单的字段,比如快照生成的时候的 seqnum。

Snapshot 会存储在一个 DBImpl 持有的链表里。其中一个好处是,我们可以在获取 DB 互斥锁钱分配好这个链表的节点。然后在持有互斥锁的时候,我们只需要更新链表指针。更进一步,ReleaseSnapshot 可以对所有的快照以任意顺序被调用。使用链表,我们不需要移动所有节点就可以删除一个节点了。

伸缩性

使用链表的唯一问题是,尽管他是顺序排列的,他还是不可以使用二分查找。在 flush/comapction 的时候,如果我们需要找到一个 key 在最早的哪个 snapshot 中是可见的,我们必须煮个扫描快照链表。当许多快照存在的时候,这个扫描会非常明显的拖慢 flush/compaction 到一个写失速的点。我们在有成百上千个快照的时候就观察到了这种问题。