Lab用时:3.5小时
实验分析
本实验要让Raft
在在上一个Leader Election和Log的基础上,对Raft的部分数据进行持久化,以便于能在Raft服务器发生故障后,Raft还能恢复crash之前的状态。
我们需要实现:
persist()
方法把Raft的状态数据编码成字符,存储到实验提供的persister
结构中readPersist()
方法解码persister
结构中的数据,并恢复Raft的部分状态- 选择合适的时机对Raft调用
persist()
和readPersist()
方法 - 这部分lab的测试涉及到Leader Election和Log中没检测到的一些极端条件,因此可能会需要修改部分旧代码才能跑通所有测试
结构设计
这一部分lab不涉及到新增结构。
逻辑设计
这一部分的lab非常简单,也给出了操作persister
结构的样例代码,基本上照抄即可,一共也只有十几行,不再赘述。
踩坑
TestFigure8Unreliable2C
会报apply error,参考Students’ Guide to Raft的term confusion部分,在RPC
请求回复之后,检测一下args.Term
和rf.currentTerm
是否相等,不相等的话直接return即可。rf.mu.Unlock() rf.sendRPC(i, args, reply) rf.mu.Lock() if rf.currentTerm != args.Term { return }
优化空间
尚未想出。
总结
比较简单,没什么总结。