Pārlūkot izejas kodu

Consolidate the two ways to become a follower.

Jing Yang 3 gadi atpakaļ
vecāks
revīzija
3f57270a5d

+ 1 - 4
src/process_append_entries.rs

@@ -1,7 +1,6 @@
 use crate::daemon_env::ErrorKind;
 use crate::{
     check_or_record, AppendEntriesArgs, AppendEntriesReply, IndexTerm, Raft,
-    State,
 };
 
 // Command must be
@@ -30,9 +29,7 @@ impl<Command: Clone + serde::Serialize> Raft<Command> {
             self.persister.save_state(rf.persisted_state().into());
         }
 
-        rf.state = State::Follower;
-        rf.leader_id = args.leader_id;
-
+        rf.meet_leader(args.leader_id);
         self.election.reset_election_timer();
 
         if rf.log.start() > args.prev_log_index

+ 2 - 4
src/process_install_snapshot.rs

@@ -1,6 +1,6 @@
 use crate::check_or_record;
 use crate::daemon_env::ErrorKind;
-use crate::{InstallSnapshotArgs, InstallSnapshotReply, Raft, State};
+use crate::{InstallSnapshotArgs, InstallSnapshotReply, Raft};
 
 impl<C: Clone + serde::Serialize> Raft<C> {
     pub fn process_install_snapshot(
@@ -28,9 +28,7 @@ impl<C: Clone + serde::Serialize> Raft<C> {
             self.persister.save_state(rf.persisted_state().into());
         }
 
-        rf.state = State::Follower;
-        rf.leader_id = args.leader_id;
-
+        rf.meet_leader(args.leader_id);
         self.election.reset_election_timer();
 
         // The above code is exactly the same as AppendEntries.

+ 2 - 3
src/process_request_vote.rs

@@ -1,4 +1,4 @@
-use crate::{Raft, RequestVoteArgs, RequestVoteReply, State};
+use crate::{Raft, RequestVoteArgs, RequestVoteReply};
 
 // Command must be
 // 1. clone: they are copied to the persister.
@@ -34,8 +34,7 @@ impl<Command: Clone + serde::Serialize> Raft<Command> {
             };
         } else if args.term > term {
             rf.current_term = args.term;
-            rf.voted_for = None;
-            rf.state = State::Follower;
+            rf.step_down();
 
             self.election.reset_election_timer();
             self.persister.save_state(rf.persisted_state().into());

+ 10 - 0
src/raft_state.rs

@@ -37,6 +37,16 @@ impl<Command> RaftState<Command> {
             leader_id: me,
         }
     }
+
+    pub fn step_down(&mut self) {
+        self.voted_for = None;
+        self.state = State::Follower;
+    }
+
+    pub fn meet_leader(&mut self, leader_id: Peer) {
+        self.leader_id = leader_id;
+        self.state = State::Follower;
+    }
 }
 
 impl<Command: Clone> RaftState<Command> {

+ 2 - 3
src/term_marker.rs

@@ -4,7 +4,7 @@ use parking_lot::Mutex;
 use serde::Serialize;
 
 use crate::election::ElectionState;
-use crate::{Persister, RaftState, State, Term};
+use crate::{Persister, RaftState, Term};
 
 /// A closure that updates the `Term` of the `RaftState`.
 #[derive(Clone)]
@@ -32,8 +32,7 @@ impl<Command: Clone + Serialize> TermMarker<Command> {
         let mut rf = self.rf.lock();
         if term > rf.current_term {
             rf.current_term = term;
-            rf.voted_for = None;
-            rf.state = State::Follower;
+            rf.step_down();
 
             self.election.reset_election_timer();
             self.persister.save_state(rf.persisted_state().into());