|
|
@@ -17,7 +17,7 @@ use parking_lot::Mutex;
|
|
|
use rand::{thread_rng, Rng};
|
|
|
|
|
|
use crate::rpcs::RpcClient;
|
|
|
-use crate::utils::retry_rpc;
|
|
|
+use crate::utils::{retry_rpc, DropGuard};
|
|
|
|
|
|
pub mod rpcs;
|
|
|
mod utils;
|
|
|
@@ -202,6 +202,8 @@ impl Raft {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+ let _ = rf.deferred_persist();
|
|
|
+
|
|
|
if rf.current_term < args.term {
|
|
|
rf.current_term = args.term;
|
|
|
rf.voted_for = None;
|
|
|
@@ -590,6 +592,10 @@ impl RaftState {
|
|
|
// TODO: implement
|
|
|
}
|
|
|
|
|
|
+ fn deferred_persist(&self) -> impl Drop + '_ {
|
|
|
+ DropGuard::new(move || { self.persist() })
|
|
|
+ }
|
|
|
+
|
|
|
fn last_log_index_and_term(&self) -> (usize, Term) {
|
|
|
let len = self.log.len();
|
|
|
assert!(len > 0, "There should always be at least one entry in log");
|