use nodedb_raft::{
AppendEntriesRequest, AppendEntriesResponse, InstallSnapshotRequest, InstallSnapshotResponse,
RequestVoteRequest, RequestVoteResponse,
};
use crate::error::{ClusterError, Result};
use super::core::MultiRaft;
impl MultiRaft {
pub fn handle_append_entries(
&mut self,
req: &AppendEntriesRequest,
) -> Result<AppendEntriesResponse> {
let node = self
.groups
.get_mut(&req.group_id)
.ok_or(ClusterError::GroupNotFound {
group_id: req.group_id,
})?;
Ok(node.handle_append_entries(req))
}
pub fn handle_request_vote(&mut self, req: &RequestVoteRequest) -> Result<RequestVoteResponse> {
let node = self
.groups
.get_mut(&req.group_id)
.ok_or(ClusterError::GroupNotFound {
group_id: req.group_id,
})?;
Ok(node.handle_request_vote(req))
}
pub fn handle_install_snapshot(
&mut self,
req: &InstallSnapshotRequest,
) -> Result<InstallSnapshotResponse> {
let node = self
.groups
.get_mut(&req.group_id)
.ok_or(ClusterError::GroupNotFound {
group_id: req.group_id,
})?;
Ok(node.handle_install_snapshot(req))
}
pub fn snapshot_metadata(&self, group_id: u64) -> Result<(u64, u64, u64)> {
let node = self
.groups
.get(&group_id)
.ok_or(ClusterError::GroupNotFound { group_id })?;
Ok((
node.current_term(),
node.log_snapshot_index(),
node.log_snapshot_term(),
))
}
pub fn handle_append_entries_response(
&mut self,
group_id: u64,
peer: u64,
resp: &AppendEntriesResponse,
) -> Result<()> {
let node = self
.groups
.get_mut(&group_id)
.ok_or(ClusterError::GroupNotFound { group_id })?;
node.handle_append_entries_response(peer, resp);
Ok(())
}
pub fn handle_request_vote_response(
&mut self,
group_id: u64,
peer: u64,
resp: &RequestVoteResponse,
) -> Result<()> {
let node = self
.groups
.get_mut(&group_id)
.ok_or(ClusterError::GroupNotFound { group_id })?;
node.handle_request_vote_response(peer, resp);
Ok(())
}
pub fn advance_applied(&mut self, group_id: u64, applied_to: u64) -> Result<()> {
let node = self
.groups
.get_mut(&group_id)
.ok_or(ClusterError::GroupNotFound { group_id })?;
node.advance_applied(applied_to);
Ok(())
}
pub fn match_index_for(&self, group_id: u64, peer: u64) -> Option<u64> {
self.groups.get(&group_id)?.match_index_for(peer)
}
pub fn last_applied(&self, group_id: u64) -> Option<u64> {
self.groups.get(&group_id).map(|n| n.last_applied())
}
pub fn applied_indices(&self) -> Vec<(u64, u64)> {
self.groups
.iter()
.map(|(gid, node)| (*gid, node.last_applied()))
.collect()
}
}