Lab2A
常用命令
批量测试
python3 dstest.py InitialElection ReElection -r
方便展示日志
python3 dslogs.py ./20221212_114239/InitialElection_1.log -c 3
TODO
-
用命令 VERBOSE=1 go test -run 2A|python3 dslogs.py 测试
-
看论文的图2,尤其是发送和接收 RequestVote RPCs,与选举有关的状态
![img]()
-
在 raft.go 中实现图2中与选举有关的 struct state,定义一个保存log entry信息的struct
- 2A 必须的 struct state
state int // 节点状态 follow candidate leader
currentTerm int // 当前Term
votedFor []int // 从哪些 server 收到的选票
lastHeartBeat time.Time -
实现 RequestVoteArgs 和 RequestVoteReply,修改Make()函数创建一个后台线程,该线程在一定时间没有收到leader发送的心跳就会发起选举 RequestVote()
实现 ticker() 要加锁!!!
-
定义一个AppendEntries RPC struct 实现心跳,leader定期发送,AppendEntriesRPC方法来重置选举超时
-
每个节点不要同时发生选举
-
leader 每秒发送心跳不要超过10次
-
在旧的leader故障的时候5秒内选出新的leader
-
编写延迟执行代码
-
实现 GetState()
记录一些坑
-
s0 leader与s1 s2网络连接断开,s2超时开始选举,状态变为condition,向自己投票,voterfor变为s2,s1也开始超时选举,状态变为condition,向s2发送投票请求,s2收到投票请求后重置心跳时间,因为已经向自己投过票了,所以不再向s1投票,s1超时重置选举,接着向s2发起投票请求,s2继续拒绝.进入死循环.
![img]()
-
rpc的reply要放到循环里,不然会报 Decoding into a non-default variable/field warning
历时一个月断断续续终于把2A完成了




浙公网安备 33010602011771号