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:
   187   188   189   190   191   192   193   194   195   196   197