Lab用时:3.5小时

实验分析

本实验要让Raft在在上一个Leader ElectionLog的基础上,对Raft的部分数据进行持久化,以便于能在Raft服务器发生故障后,Raft还能恢复crash之前的状态。

我们需要实现:

  1. persist()方法把Raft的状态数据编码成字符,存储到实验提供的persister结构中
  2. readPersist()方法解码persister结构中的数据,并恢复Raft的部分状态
  3. 选择合适的时机对Raft调用persist()readPersist()方法
  4. 这部分lab的测试涉及到Leader ElectionLog中没检测到的一些极端条件,因此可能会需要修改部分旧代码才能跑通所有测试

结构设计

这一部分lab不涉及到新增结构。

逻辑设计

这一部分的lab非常简单,也给出了操作persister结构的样例代码,基本上照抄即可,一共也只有十几行,不再赘述。

踩坑

  1. TestFigure8Unreliable2C会报apply error,参考Students’ Guide to Raft的term confusion部分,在RPC请求回复之后,检测一下args.Termrf.currentTerm是否相等,不相等的话直接return即可。

    rf.mu.Unlock()
    rf.sendRPC(i, args, reply)
    rf.mu.Lock()
    if rf.currentTerm != args.Term {
    	return
    }
    

优化空间

尚未想出。

总结

比较简单,没什么总结。