use std::sync::{Arc, Mutex, Weak};
use async_trait::async_trait;
use crate::multi_raft::MultiRaft;
use crate::rebalancer::driver::ElectionGate;
pub struct MultiRaftElectionGate {
multi_raft: Weak<Mutex<MultiRaft>>,
}
impl MultiRaftElectionGate {
pub fn new(multi_raft: &Arc<Mutex<MultiRaft>>) -> Self {
Self {
multi_raft: Arc::downgrade(multi_raft),
}
}
}
#[async_trait]
impl ElectionGate for MultiRaftElectionGate {
async fn any_group_electing(&self) -> bool {
let Some(arc) = self.multi_raft.upgrade() else {
return false;
};
let guard = arc.lock().unwrap_or_else(|p| p.into_inner());
guard
.group_statuses()
.iter()
.any(|s| s.role.contains("Candidate"))
}
}
#[cfg(test)]
mod tests {
use super::*;
fn _assert_send_sync<T: Send + Sync>() {}
#[test]
fn multiraft_election_gate_is_send_sync() {
_assert_send_sync::<MultiRaftElectionGate>();
}
}