目錄
- Messenger
- WorkerSender
- WorkerReceiver
- 第5步:檢驗選票的epoch和version
- 第6步:處理投票
Messenger
Messenger管理接收到的消息以及待發送的消息,其源碼如下:
它的源碼比較簡單,接下來著重介紹它維護的兩個線程:WorkerSender和WorkerReceiver
WorkerSender
WorkerSender的工作是不斷從FastLeaderElection.sendqueue
中獲取待發送的選票,并將其傳遞給QuorumCnxManager去等待發送。
WorkerReceiver
WorkerReceiver的工作相對來說復雜一些,它會不斷從QuorumCnxManager獲取來自其他服務器發來的信息,并將其轉化成一個選票,然后保存到FastLeaderElection.recvqueue
中等待FastLeaderElection的選舉核心算法處理。
接下來著重分析第5步和第6步
第5步:檢驗選票的epoch和version
第6步:處理投票
在處理外部發送來的選票時,
- 如果選票來自不具有投票權的服務器,則忽略該選票,并向對方發送自己的選票
- 如果外部選票的選舉輪次epoch低于當前服務器,此時外部服務器和當前服務器都處于
LOOKING
,則向外部服務器發送自己的選票 - 如果當前服務器已經選舉出leader,而外部服務器仍在選舉中,則將自己的選票發送到外部服務器