6.824 lab3b

设计思路

实验3b需要解决的问题:

如何判断snapshot的时机?

persister.RaftStateSize()返回已经持久化的raft日志(连同若干个需要持久化的变量)的大小。server持续调用该函数,当返回值等于maxraftstate的时候进行snapshot。需要处理maxraftstate==-1的情况。snapshot时还需要传入snapshot对应的最后一条raft日志的下标,需要多维护一个变量。

snapshot包含什么?

snapshot包含KV数据库的底层map和一些用于维护一致性的变量。当服务器重启时,Persister中保存的snapshot直接复制到server层即可。

maxraftstate是否需要持久化到Persister当中?

不需要,因为maxraftstateStartKVServer()的参数,在启动server时被传入。

当server从applyCh中读到snapshot时应该执行什么操作?

直接覆盖原有database即可。

如何保证指令的去重?

maxOpIndexs保存到snapshot当中,进行持久化。

实验3b的一些注意事项:

  • snapshot中保存的字段首字母大写

代码实现

lab1-lab3完整实现代码:Starman-SWA/6.824 (github.com)