设计思路
实验3b需要解决的问题:
如何判断snapshot的时机?
persister.RaftStateSize()
返回已经持久化的raft日志(连同若干个需要持久化的变量)的大小。server持续调用该函数,当返回值等于maxraftstate
的时候进行snapshot。需要处理maxraftstate==-1
的情况。snapshot时还需要传入snapshot对应的最后一条raft日志的下标,需要多维护一个变量。
snapshot包含什么?
snapshot包含KV数据库的底层map和一些用于维护一致性的变量。当服务器重启时,Persister
中保存的snapshot直接复制到server层即可。
maxraftstate
是否需要持久化到Persister
当中?
不需要,因为maxraftstate
是StartKVServer()
的参数,在启动server时被传入。
当server从applyCh
中读到snapshot时应该执行什么操作?
直接覆盖原有database即可。
如何保证指令的去重?
将maxOpIndexs
保存到snapshot当中,进行持久化。
实验3b的一些注意事项:
- snapshot中保存的字段首字母大写
代码实现
lab1-lab3完整实现代码:Starman-SWA/6.824 (github.com)