From 20f78220f35ba25c93709ae34d45ba91b44b6ff2 Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Mon, 15 Aug 2022 13:21:15 +0300
Subject: [PATCH] fix: wasn't emitting raft.demoted when not in joint state

---
 src/traft/node.rs | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/src/traft/node.rs b/src/traft/node.rs
index 9110a96d2d..ba2e62e453 100644
--- a/src/traft/node.rs
+++ b/src/traft/node.rs
@@ -563,7 +563,17 @@ fn handle_committed_conf_change(entry: traft::Entry, raw_node: &mut RawNode) {
     let raft_id = &raw_node.raft.id;
     let voters_old = Storage::voters().unwrap();
     if voters_old.contains(raft_id) && !conf_state.voters.contains(raft_id) {
-        event::broadcast_when(Event::Demoted, Event::LeaveJointState).ok();
+        #[rustfmt::skip]
+        let is_joint_state = with_joint_state_latch(|latch| {
+            // joint_state_latch is stored in `Cell` so to check it's value
+            // we must take it out and put it back in
+            latch.take().map(|l| { latch.set(Some(l)); true }).unwrap_or(false)
+        });
+        if is_joint_state {
+            event::broadcast_when(Event::Demoted, Event::LeaveJointState).ok();
+        } else {
+            event::broadcast(Event::Demoted);
+        }
     }
 
     Storage::persist_conf_state(&conf_state).unwrap();
-- 
GitLab