Page 192 - 《软件学报》2021年第6期
P. 192
1766 Journal of Software 软件学报 Vol.32, No.6, June 2021
serverVars==〈〈currentTerm,currentState,votedFor,sync,end〉〉
VARIABLE halfElections,elections
electionVars==〈〈halfElections,elections〉〉
vars==〈〈messages,log,serverVars,syncTrack,electionVars〉〉
----------------------------------------------------------------------------------
ParallelRaft-CE 的主要动作包括:
• UpdateTerm(i):s 收到消息 m,若 m.mterm>currentTerm[i],那么 i 升级任期(currentTerm′[i]=m.mterm),转变
为从节点(currentState′[i]=Follower),并将投票的记录置空(votedFor′[i]=Nil),因为 i 在新的任期还没有
为任何节点投票.在 ParallelRaft-CE 中,节点收到任何请求都需要检查任期.当消息的任期大于节点的
任期时,节点执行 UpdateTerm,之后再响应请求;当消息的任期与节点任期相同时,节点直接处理请求;
当消息的任期小于节点任期时,节点拒绝任何请求,并将自己的任期回复给发送者;
• RequestVote(i):i 发起选举.与 ParallelRaft-SE(Multi-Paxos)不同的是,i 需要将自己的同步号(sync[i])发送
给其他节点;
• HandleRequestVoteRequest(i):收到选举请求 m 的节点 i 比较任期(currentTerm[i])和 m.mterm)与同步号
(sync[i]和 m.msync).当 m.mterm=currentTerm[i]且 sync[i]≥m.msync 且 i 在本任期内还没有同意其他节
点的选举请求,i 同意选举请求,并将自己的日志中任期为 m.msync 的项以及 i 可以接受的任期为
m.msync 的日志项的最大编号(end[i][m.msync])发送给选举发起者.
---------------------------------------------------------------------------------------------
UpdateTerm(i)==
/\\E m\in messages:
/\m.mterm>currentTerm[i]
/\\/m.mdest=i
\/m.mdest=Nil
/\currentTerm′=[currentTerm EXCEPT ![i]=m.mterm]
/\currentState′=[currentState EXCEPT ![i]=Follower]
/\votedFor′=[votedFor EXCEPT ![i]=Nil]
/\UNCHANGED 〈〈messages,sync,log,syncTrack,electionVars,end〉〉
RequestVote(i)==
/\currentState[i]=Candidate
/\Send([mtype6RequestVoteRequest,
mterm6currentTerm[i],
msync6sync[i],
msource6i,
mdest6Nil])
/\UNCHANGED 〈〈serverVars,syncTrack,log,electionVars〉〉
HandleRequestVoteRequest(i)==
/\\E m\in messages: