use crate::ChangeMembers;
use crate::Membership;
use crate::MembershipState;
use crate::errors::ChangeMembershipError;
use crate::errors::InProgress;
use crate::node::Node;
use crate::node::NodeId;
use crate::vote::RaftCommittedLeaderId;
pub(crate) struct ChangeHandler<'m, CLID, NID, N>
where
CLID: RaftCommittedLeaderId,
NID: NodeId,
N: Node,
{
pub(crate) state: &'m MembershipState<CLID, NID, N>,
}
impl<CLID, NID, N> ChangeHandler<'_, CLID, NID, N>
where
CLID: RaftCommittedLeaderId,
NID: NodeId,
N: Node,
{
pub(crate) fn apply(
&self,
change: ChangeMembers<NID, N>,
retain: bool,
) -> Result<Membership<NID, N>, ChangeMembershipError<CLID, NID>> {
self.ensure_committed()?;
let new_membership = self.state.effective().membership().clone().change(change, retain)?;
Ok(new_membership)
}
pub(crate) fn ensure_committed(&self) -> Result<(), InProgress<CLID>> {
let effective = self.state.effective();
let committed = self.state.committed();
if effective.log_id() == committed.log_id() {
Ok(())
} else {
Err(InProgress {
committed: committed.log_id().clone(),
membership_log_id: effective.log_id().clone(),
})
}
}
}