快照

快照捕获数据库创建时的时间点视图。快照不会在数据库重新启动时持续存在。

API 使用

  • 使用GetSnapshot() API创建快照。
  • 通过设置ReadOptions::snapshot从快照读取。
  • 完成后,通过调用ReleaseSnapshot()释放与快照相关的资源。

实现

刷新/压缩

表现

快照由SnapshotImpl类的一个小对象表示。它只包含几个基本字段,比如快照拍摄的seqnum。

快照存储在DBImpl拥有的链表中。一个好处是,我们可以在获取DB互斥对象之前分配列表节点。 然后,在持有互斥对象时,我们只需要更新列表指针。此外,可以以任意顺序对快照调用ReleaseSnapshot()。 使用链表,我们可以在不移动的情况下从中间删除节点。

可伸缩性

链表的主要缺点是,它不能二进制搜索,尽管它的顺序。在刷新/压缩期间,当我们需要找出密钥可见的最早快照时,必须扫描快照列表。 当有很多快照时,这种扫描可以显著地降低刷新/压缩速度,从而导致写停止。我们注意到快照计数在数十万时存在问题。