process_request_vote.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. use crate::{Raft, RequestVoteArgs, RequestVoteReply, State};
  2. impl<Command> Raft<Command> {
  3. pub fn process_request_vote(
  4. &self,
  5. args: RequestVoteArgs,
  6. ) -> RequestVoteReply {
  7. // Note: do not change this to `let _ = ...`.
  8. let _guard = self.daemon_env.for_scope();
  9. let mut rf = self.inner_state.lock();
  10. let term = rf.current_term;
  11. if args.prevote {
  12. let last_log = rf.log.last_index_term();
  13. let longer_log = args.last_log_term > last_log.term
  14. || (args.last_log_term == last_log.term
  15. && args.last_log_index >= last_log.index);
  16. return RequestVoteReply {
  17. term: args.term,
  18. vote_granted: args.term >= term && longer_log,
  19. };
  20. }
  21. #[allow(clippy::comparison_chain)]
  22. if args.term < term {
  23. return RequestVoteReply {
  24. term,
  25. vote_granted: false,
  26. };
  27. } else if args.term > term {
  28. rf.current_term = args.term;
  29. rf.voted_for = None;
  30. rf.state = State::Follower;
  31. self.election.reset_election_timer();
  32. self.persister.save_term_vote(&rf);
  33. }
  34. let voted_for = rf.voted_for;
  35. let last_log = rf.log.last_index_term();
  36. if (voted_for.is_none() || voted_for == Some(args.candidate_id))
  37. && (args.last_log_term > last_log.term
  38. || (args.last_log_term == last_log.term
  39. && args.last_log_index >= last_log.index))
  40. {
  41. rf.voted_for = Some(args.candidate_id);
  42. // It is possible that we have set a timer above when updating the
  43. // current term. It does not hurt to update the timer again.
  44. // We do need to persist, though.
  45. self.election.reset_election_timer();
  46. self.persister.save_term_vote(&rf);
  47. RequestVoteReply {
  48. term: args.term,
  49. vote_granted: true,
  50. }
  51. } else {
  52. RequestVoteReply {
  53. term: args.term,
  54. vote_granted: false,
  55. }
  56. }
  57. }
  58. }