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()

记录一些坑

  1. s0 leader与s1 s2网络连接断开,s2超时开始选举,状态变为condition,向自己投票,voterfor变为s2,s1也开始超时选举,状态变为condition,向s2发送投票请求,s2收到投票请求后重置心跳时间,因为已经向自己投过票了,所以不再向s1投票,s1超时重置选举,接着向s2发起投票请求,s2继续拒绝.进入死循环.
    img

  2. rpc的reply要放到循环里,不然会报 Decoding into a non-default variable/field warning

历时一个月断断续续终于把2A完成了

img

posted @ 2022-11-18 16:02  autumn814  阅读(50)  评论(0)    收藏  举报