![74d8744e255cf074227af50c7ce9c89c.png](https://img-blog.csdnimg.cn/img_convert/74d8744e255cf074227af50c7ce9c89c.png)
1. MIT6.824_Lab2_Raft_PartB
在这个部分我们想要实现 Raft 保持一致的、复制的操作日志。在 Leader 中对Start()
的调用开启向日志中添加一个新操作的过程;同时将这个新操作使用AppendEntries
RPC发送给其他服务器。
实现 leader 和 follower 代码完成日志项的添加。这涉及到实现
start()
,补充 AppendEntries RPC 结构体,发送请求,充实AppendEntry RPC处理程序以及更新leader 的commitIndex。
SmallPond/MIT6.824_2018github.com
![e52a40ae61534f801bf01c7a6c2a7a8d.png](https://img-blog.csdnimg.cn/img_convert/e52a40ae61534f801bf01c7a6c2a7a8d.png)
1.1. FAILS
TestBasicAgree2B
创建了5个 server, nCommitted
求得有多少服务器认为日志项已经提交。
- 不明白为什么一直无法通过 2B 的第一个test,而且拿其他大佬的
raft.go
代码直接过来跑也是无法通过。但是其跑其对应的测试代码是可以通过的。仔细对比发现可能是config.go
中的start1
函数不一样导致的(还有在Start中忘记使用AppendEntries
RPC将新操作发送给其他服务器)。 在调试的过程中我的代码不小心被覆盖找不回来了(大哭..Debug D到疯,实在是不想再重写一遍(~~也感觉找不出到达时哪里出现了问题~~无法通过BasicAgree其中一个原因是我在写入applyMsg时没有写入CommanValid=true
,也就不能在start1中将日志写入log中,导致一直读出来nCommited为0),
// config.go 中的 start1()部分代码
if m.CommandValid == false {
// ignore other types of ApplyMsg
} else if v, ok := (m.Command).(int); ok {