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号
浙公网安备 33010602011771号