From 9afadd98f7a05f0f5cd0edcdce0c55ded6f864f4 Mon Sep 17 00:00:00 2001 From: satoru Date: Sun, 19 Dec 2021 19:29:11 +0800 Subject: [PATCH] fix #34, record abandoned reason for conflicting entry logs --- little_raft/src/replica.rs | 7 +++++++ little_raft/src/state_machine.rs | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/little_raft/src/replica.rs b/little_raft/src/replica.rs index 12ea91e..aa36bdd 100644 --- a/little_raft/src/replica.rs +++ b/little_raft/src/replica.rs @@ -534,9 +534,16 @@ where return; } + let mut state_machine = self.state_machine.lock().unwrap(); for entry in entries { // Drop local inconsistent logs. if entry.index < self.log.len() && entry.term != self.log[entry.index].term { + for i in entry.index..self.log.len() { + state_machine.register_transition_state( + self.log[i].transition.get_id(), + TransitionState::Abandoned(TransitionAbandonedReason::ConflictingEntry) + ); + } self.log.truncate(entry.index); } diff --git a/little_raft/src/state_machine.rs b/little_raft/src/state_machine.rs index 4b7ee83..da185dd 100644 --- a/little_raft/src/state_machine.rs +++ b/little_raft/src/state_machine.rs @@ -26,6 +26,10 @@ pub enum TransitionAbandonedReason { // NotLeader transitions have been abandoned because the replica is not // the cluster leader. NotLeader, + + // ConflictingEntry entry logs in followers that are inconsistent with the + // leader's. + ConflictingEntry, } /// StateMachineTransition describes a user-defined transition that can be