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]).