Page 195 - 《软件学报》2021年第6期
P. 195

谷晓松  等:支持乱序执行的 Raft 协议                                                           1769


                 IN
                   /\Send([mtype6RequestSyncRequest,
                        mterm6currentTerm[i],msync6s,
                        mstart6start,mend6end,
                        mentries6IF start=−1 THEN Nil ELSE
                                          [n\in start..end6log[i][n]],
                        msource6i,mdest6Nil])
               /\ UNCHANGED 〈〈serverVars,logVars,electionVars,syncTrack〉〉

             HandleRequestSyncRequest(i)==
               /\\E m\in messages:
                   LET j==m.msource
                       grant==/\m.mterm=currentTerm[i]
                               /\m.msync=sync[i]
                   IN
                 /\m.mtype=RequestSyncRequest
                 /\m.mterm\leq currentTerm[i]
                 /\j/=i
                 /\\//\grant
                   /\log′=[log EXCEPT ![i]=[n\in Index6
                    IF n<m.mstart THEN log[i][n]
                    ELSE IF n\in m.mstart..m.mend
                      THEN m.mentries[n]
                    ELSE [term6−1,date6−1,
                          value6Nil,committed6FALSE]]]
                 /\endPoint′=[endPoint EXCEPT ![i][sync[i]]=〈〈currentTerm[i],m.mend〉〉]
                   \//\\neg grant
                    /\UNCHANGED 〈〈log,endPoint〉〉
                 /\Send([mtype6RequestSyncResponse,mterm6currentTerm[i],
                      msyncGranted6grant,msync6sync[i],
                      mstart6m.mstart,mend6m.mend,
                      msource6i,mdest6j])
               /\UNCHANGED 〈〈currentTerm,currentState,sync,votedFor
             ------------------------------------------------------------------------------------------------
             •   HandleRequestSyncResponse(i):i 为主节点或主节点候选者时,收到节点 p 的 RequestSyncResponse 消息
                m.若 m 是确认消息(m.msyncGranted=TRUE),且 p 的同步号小于 i 的同步号(m.msync<sync[i]),则 s 向 p
                发送 UpdateSyncRequest 请求,通知 p 升级到下一个同步号.下一个同步号的选举方法如上文所述.若 m
                是否定消息,则 i 修改 syncTrack[i][p](syncTrack′[i][p]=m.msync);
             •   UpdateSync(i):状态为主节点候选者的节点 i,如果存在一个多数派的节点完成对任期为 sync[i]的日志
                项的同步,且 i 收到它们的确认(RequestSyncResponse 消息),那么 s 向这些节点发送 UpdateSyncRequest
                消息,通知它们升级同步号为 i 的任期(currentTerm[i]).
   190   191   192   193   194   195   196   197   198   199   200