use std::sync::Arc; use parking_lot::Mutex; use serde::Serialize; use crate::election::ElectionState; use crate::{Persister, Raft, RaftState, State, Term}; /// A closure that updates the `Term` of the `RaftState`. #[derive(Clone)] pub(crate) struct TermMarker { rf: Arc>>, election: Arc, persister: Arc, } impl TermMarker { pub fn mark(&self, term: Term) { let mut rf = self.rf.lock(); mark_term(&mut rf, &self.election, self.persister.as_ref(), term) } } impl Raft { /// Create a `TermMarker` that can be passed to tasks. pub(crate) fn term_marker(&self) -> TermMarker { TermMarker { rf: self.inner_state.clone(), election: self.election.clone(), persister: self.persister.clone(), } } } /// Update the term of the `RaftState`. pub(crate) fn mark_term( rf: &mut RaftState, election: &ElectionState, persister: &dyn Persister, term: Term, ) { if term > rf.current_term { rf.current_term = term; rf.voted_for = None; rf.state = State::Follower; election.reset_election_timer(); persister.save_state(rf.persisted_state().into()); } }