理解raft算法RequestVote RPC

问题描述 投票:0回答:1

我正在尝试阅读本文的第 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: 发送(成功) 别的 发送失败()

我在这里遗漏了什么吗?

python distributed-computing raft
1个回答
0
投票

来自文档:

Raft 通过比较两个日志中的哪个日志是最新的 日志中最后条目的索引和任期。如果日志最后 词条不同的条目,则词条较晚的日志更多 最新。如果日志以相同的术语结尾,则以哪个日志为准 越长越新。

你的代码漏了一个检查,它应该有三个检查:

  1. 如果在给定的期限内还没有投票(你有那个)
  2. 检查任期是否更大(你有这个)
  3. 如果项相同,那么你必须比较日志的长度(这是缺失的部分)

附注 我假设 send(success) 也会更新此关注者针对给定术语的 votedFor 值,并且如果有更大的术语可用,则有代码会重置 votedFor

© www.soinside.com 2019 - 2024. All rights reserved.