|
|
@@ -9,7 +9,9 @@ use crate::daemon_env::Daemon;
|
|
|
use crate::term_marker::TermMarker;
|
|
|
use crate::utils::{retry_rpc, SharedSender, RPC_DEADLINE};
|
|
|
use crate::verify_authority::VerifyAuthorityDaemon;
|
|
|
-use crate::{Peer, Raft, RaftState, RemoteRaft, RequestVoteArgs, State, Term};
|
|
|
+use crate::{
|
|
|
+ Peer, Persister, Raft, RaftState, RemoteRaft, RequestVoteArgs, State, Term,
|
|
|
+};
|
|
|
|
|
|
#[derive(Default)]
|
|
|
pub(crate) struct ElectionState {
|
|
|
@@ -70,7 +72,7 @@ impl ElectionState {
|
|
|
// 3. serialize: they are converted to bytes to persist.
|
|
|
impl<Command> Raft<Command>
|
|
|
where
|
|
|
- Command: 'static + Clone + Send + serde::Serialize,
|
|
|
+ Command: 'static + Clone + Default + Send + serde::Serialize,
|
|
|
{
|
|
|
/// Runs the election timer daemon that triggers elections.
|
|
|
///
|
|
|
@@ -279,6 +281,7 @@ where
|
|
|
self.election.clone(),
|
|
|
self.new_log_entry.clone().unwrap(),
|
|
|
self.verify_authority_daemon.clone(),
|
|
|
+ self.persister.clone(),
|
|
|
));
|
|
|
Some(tx)
|
|
|
}
|
|
|
@@ -314,6 +317,7 @@ where
|
|
|
election: Arc<ElectionState>,
|
|
|
new_log_entry: SharedSender<Option<Peer>>,
|
|
|
verify_authority_daemon: VerifyAuthorityDaemon,
|
|
|
+ persister: Arc<dyn Persister>,
|
|
|
) {
|
|
|
let quorum = votes.len() >> 1;
|
|
|
let mut vote_count = 0;
|
|
|
@@ -374,6 +378,14 @@ where
|
|
|
// done, since we are holding the raft lock.
|
|
|
verify_authority_daemon.reset_state(term);
|
|
|
|
|
|
+ if rf.commit_index != rf.log.last_index_term().index {
|
|
|
+ rf.sentinel_commit_index =
|
|
|
+ rf.log.add_command(term, Default::default());
|
|
|
+ persister.save_state(rf.persisted_state().into());
|
|
|
+ } else {
|
|
|
+ rf.sentinel_commit_index = rf.commit_index;
|
|
|
+ }
|
|
|
+
|
|
|
// Sync all logs now.
|
|
|
let _ = new_log_entry.send(None);
|
|
|
}
|