Skip to content

Commit

Permalink
Merge pull request #30 from shinnya/fix-request-vote-unreply
Browse files Browse the repository at this point in the history
Pass `pending_vote` to Follower::new as an argument explicitly
  • Loading branch information
shinnya authored May 8, 2019
2 parents 66bfca3 + 698cbab commit df7ece9
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 12 deletions.
17 changes: 10 additions & 7 deletions src/node_state/common/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,15 +190,19 @@ where
}

/// `Follower`状態に遷移する.
pub fn transit_to_follower(&mut self, followee: NodeId) -> RoleState<IO> {
pub fn transit_to_follower(
&mut self,
followee: NodeId,
pending_vote: Option<MessageHeader>,
) -> RoleState<IO> {
self.metrics.transit_to_follower_total.increment();
let new_ballot = Ballot {
term: self.local_node.ballot.term,
voted_for: followee,
};
self.set_ballot(new_ballot);
self.set_role(Role::Follower);
RoleState::Follower(Follower::new(self))
RoleState::Follower(Follower::new(self, pending_vote))
}

/// 次のメッセージ送信に使用されるシーケンス番号を返す.
Expand Down Expand Up @@ -309,8 +313,7 @@ where
if m.log_tail.is_newer_or_equal_than(self.history.tail()) {
// 送信者(候補者)のログは十分に新しいので、その人を支持する
let candidate = m.header.sender.clone();
self.unread_message = Some(Message::RequestVoteCall(m));
self.transit_to_follower(candidate)
self.transit_to_follower(candidate, Some(m.header))
} else {
// ローカルログの方が新しいので、自分で立候補する
self.transit_to_candidate()
Expand All @@ -319,12 +322,12 @@ where
// 新リーダが当選していたので、その人のフォロワーとなる
let leader = message.header().sender.clone();
self.unread_message = Some(message);
self.transit_to_follower(leader)
self.transit_to_follower(leader, None)
} else if self.local_node.role == Role::Leader {
self.transit_to_candidate()
} else {
let local = self.local_node.id.clone();
self.transit_to_follower(local)
self.transit_to_follower(local, None)
};
HandleMessageResult::Handled(Some(next_state))
} else if message.header().term < self.local_node.ballot.term {
Expand All @@ -345,7 +348,7 @@ where
// リーダが確定したので、フォロー先を変更する
let leader = message.header().sender.clone();
self.unread_message = Some(message);
let next = self.transit_to_follower(leader);
let next = self.transit_to_follower(leader, None);
HandleMessageResult::Handled(Some(next))
}
_ => HandleMessageResult::Unhandled(message), // 個別のロールに処理を任せる
Expand Down
5 changes: 3 additions & 2 deletions src/node_state/follower/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ pub struct FollowerInit<IO: Io> {
pending_vote: Option<MessageHeader>,
}
impl<IO: Io> FollowerInit<IO> {
pub fn new(common: &mut Common<IO>) -> Self {
pub fn new(common: &mut Common<IO>, pending_vote: Option<MessageHeader>) -> Self {
let future = common.save_ballot();
FollowerInit {
future,
pending_vote: None,
pending_vote,
}
}
pub fn handle_message(
Expand All @@ -30,6 +30,7 @@ impl<IO: Io> FollowerInit<IO> {
) -> Result<NextState<IO>> {
match message {
Message::RequestVoteCall(m) => {
// pending_vote can be overwritten here because the latest vote should be used.
self.pending_vote = Some(m.header);
}
Message::AppendEntriesCall(m) => {
Expand Down
6 changes: 3 additions & 3 deletions src/node_state/follower/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use self::init::FollowerInit;
use self::snapshot::FollowerSnapshot;
use super::{Common, NextState};
use election::Role;
use message::Message;
use message::{Message, MessageHeader};
use {Io, Result};

mod append;
Expand Down Expand Up @@ -32,9 +32,9 @@ pub enum Follower<IO: Io> {
Snapshot(FollowerSnapshot<IO>),
}
impl<IO: Io> Follower<IO> {
pub fn new(common: &mut Common<IO>) -> Self {
pub fn new(common: &mut Common<IO>, pending_vote: Option<MessageHeader>) -> Self {
common.set_timeout(Role::Follower);
let follower = FollowerInit::new(common);
let follower = FollowerInit::new(common, pending_vote);
Follower::Init(follower)
}
pub fn handle_timeout(&mut self, common: &mut Common<IO>) -> Result<NextState<IO>> {
Expand Down

0 comments on commit df7ece9

Please sign in to comment.