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