use super::*;
pub struct Effect {
pub peers: Peers,
pub state_machine: StateMachine,
pub voter: Read<Voter>,
pub driver: RaftHandle,
}
impl Effect {
pub async fn exec(self) -> Result<()> {
let log_last_index = self.state_machine.get_log_last_index().await?;
let last_membership_index = self
.state_machine
.find_last_membership_index(log_last_index)
.await?;
if let Some(last_membership_index) = last_membership_index {
let last_membership = {
let entry = self.state_machine.get_entry(last_membership_index).await?;
match Command::deserialize(&entry.command) {
Command::Snapshot { membership } => membership,
Command::ClusterConfiguration { membership } => membership,
_ => unreachable!(),
}
};
effect::set_membership::Effect {
peers: self.peers.clone(),
state_machine: self.state_machine.clone(),
voter: self.voter.clone(),
driver: self.driver.clone(),
}
.exec(last_membership, last_membership_index)
.await?;
};
Ok(())
}
}