我正在尝试阅读本文的第 4 页:https://raft.github.io/raft.pdf
我正在尝试实施 RequestVote RPC,但我很难理解“接收方实施”的第二部分。 “如果 votedFor 为空”是有道理的!但是,第二部分写着“或 candidateId 和 candidate's log is at least up-to-date as receiver's log, grant vote.”
我觉得我下面的解释是错误的
类日志条目: 术语:整数 命令:命令
日志:列表[LogEntry] = []
类请求投票: 术语:整数 candidateId: 海峡 lastLogIndex:整数 lastLogTerm:int
def on_request_vote_recieved(投票:RequestVote)->无: 如果没有投票给: 发送(成功) elif log[vote.lastLogIndex].term >= lastLogTerm: 发送(成功) 别的 发送失败()
我在这里遗漏了什么吗?
来自文档:
Raft 通过比较两个日志中的哪个日志是最新的 日志中最后条目的索引和任期。如果日志最后 词条不同的条目,则词条较晚的日志更多 最新。如果日志以相同的术语结尾,则以哪个日志为准 越长越新。
你的代码漏了一个检查,它应该有三个检查:
附注 我假设 send(success) 也会更新此关注者针对给定术语的 votedFor 值,并且如果有更大的术语可用,则有代码会重置 votedFor