use crate::RaftState;
use crate::RaftTypeConfig;
use crate::ServerState;
use crate::engine::EngineConfig;
#[cfg(test)]
mod update_server_state_test;
pub(crate) struct ServerStateHandler<'st, C>
where C: RaftTypeConfig
{
pub(crate) config: &'st EngineConfig<C>,
pub(crate) state: &'st mut RaftState<C>,
}
impl<C> ServerStateHandler<'_, C>
where C: RaftTypeConfig
{
pub(crate) fn update_server_state_if_changed(&mut self) {
let server_state = self.state.calc_server_state(&self.config.id);
tracing::debug!(
"check server state: id: {}, prev: {:?}, curr: {:?}",
self.config.id,
self.state.server_state,
server_state
);
if self.state.server_state == server_state {
return;
}
let was_leader = self.state.server_state == ServerState::Leader;
let is_leader = server_state == ServerState::Leader;
if !was_leader && is_leader {
tracing::info!("id={} becomes leader", &self.config.id);
} else if was_leader && !is_leader {
tracing::info!("id={} steps down from leader", &self.config.id);
} else {
}
self.state.server_state = server_state;
}
}