5.3 加载快照
Last updated
Last updated
当节点重启或安装来自 Leader 的快照后,会进行加载快照来恢复状态机,其流程如下:
节点会将加载快照任务放进 ,等待其被执行
当任务被执行时,会打开本地快照目录,并返回 SnapshotReader
将 SnapshotReader
作为参数调用用户状态机的 on_snapshot_load
等待快照加载完成
以快照元数据中的节点配置作为参数,调用用户状态机的 on_configuration_committed
更新 applyIndex
为快照元数据中的 lastIncludedIndex
删除 logIndex<=lastIncludedIndex
的日志(细节略有出入,见以下代码解析)
将快照元数据中的节点配置设为当前节点配置
加载快照时会调用的状态机函数:
读取快照的 SnapshotReader
:
节点在重启或下载完 Leader 的快照后,会触发加载快照。这两种场景都会调用 FSMCaller::on_snapshot_load
加载快照,只不过加载快照完成后的回调函数不同:
重启:FirstSnapshotLoadDone
安装快照:InstallSnapshotDone
场景 1:节点重启
节点重启时会遍历快照存储目录,获取最新的快照目录,将其打开并返回 SnapshotReader
,然后调用 FSMCaller::on_snapshot_load
加载快照,并同步等待其加载完成:
场景 2:安装快照
队列消费函数会调用 FSMCaller::do_snapshot_load
执行加载快照任务:
FSMCaller::do_snapshot_load
是加载快照的主干函数,在该函数中主要做以下几件事,而每一件事我们将在下面详细介绍:
用户需要实现状态机的 on_snapshot_load
函数来加载快照:
get_path
接口会返回快照目录的绝对路径,所有快照的文件集都位于该目录下:
load_meta
接口会将快照元数据返回给用户:
list_files
接口会从快照元数据中返回当前快照中所有文件的相对路径:
在上面的 FSMCaller::do_snapshot_load
函数中,我们提到过,在快照加载完成后,会调用用户状态机的 on_configuration_committed
函数:
同样是在 FSMCaller::do_snapshot_load
函数中,在快照加载完成后,会设置 applyIndex
为快照元数据中的 lastIncludedIndex
:
我们上面提到了,对于节点重启和安装快照这两种不同的加载快照场景,会设置不同的回调函数,但是其最终都会调用 SnapshotExecutor::on_snapshot_load_done
来做收尾工作:
on_snapshot_load_done
会做以下几件事:
set_snapshot
主要执行以下 2 件事:
将快照元数据中的节点配置保存至 _config_manager
根据快照元数据中的 lastIncludeIndex
删除相应的日志
将快照元数据中的节点配置设置为当前节点配置。快照中的节点配置我们已经在 LogManager::set_snapshot
将其保存在 _config_manager
中了:
当节点下载完 Leader 的快照时,会调用 load_downloading_snapshot
加载快照。关于安装快照相关流程,可以参考:
on_snapshot_load
会将加载快照任务放入 ,等待其被执行: