MIT 6824 Lab 2C总结
这个实验相对比较简单,只要实现persis相关的函数并且在任何rf.currentTerm
, rf.votedFor
和rf.log
有变化的地方调用persist就行。但是这种方法太繁杂,生产环境中应该不会采用这个方法
此外在2C中犯了两个错误
第一个错误是在persist相关函数中加锁,其实这个是没必要的,只要在调用persist的时候保证锁被hold就好
第二个错误其实与persist没太大关系,是属于log replication中的错误
rf.nextIndex[peer] += len(args.Entries)
但这个写法是错误的,不过竟然pass了2B的所有test cases,正确的方式应该是
rf.nextIndex[peer] = args.PrevLogIndex + len(args.Entries) + 1
由于network partition等原因,我们不能保证收到rpc时的各个状态与发送rpc时相同。所以当在收到rpc对各个状态进行更新的时候,为了保证代码的含义和我们的目的一致,要选用哪些没有变化的值来更新,一个很好的做法就是使用request中的值,因为它不会更改。相对应的,rf.nextIndex[peer]
则不是一个好的选择,因为它有可能被更改,也就带来了可能的错误