use crate::node::{
api::cmds::Cmd,
core::{Node, Proposal},
Result,
};
use std::{collections::BTreeSet, net::SocketAddr};
use xor_name::XorName;
impl Node {
pub(crate) async fn handle_peer_lost(&self, addr: &SocketAddr) -> Result<Vec<Cmd>> {
let name = if let Some(peer) = self.network_knowledge.find_member_by_addr(addr).await {
debug!("Lost known peer {}", peer);
peer.name()
} else {
trace!("Lost unknown peer {}", addr);
return Ok(vec![]);
};
if self.is_not_elder().await {
return Ok(vec![]);
}
self.log_comm_issue(name).await?;
let cmds = vec![Cmd::StartConnectivityTest(name)];
Ok(cmds)
}
pub(crate) async fn cast_offline_proposals(
&self,
names: &BTreeSet<XorName>,
) -> Result<Vec<Cmd>> {
let elders: Vec<_> = self
.network_knowledge
.authority_provider()
.await
.elders()
.filter(|peer| !names.contains(&peer.name()))
.cloned()
.collect();
let mut result: Vec<Cmd> = Vec::new();
for name in names.iter() {
if let Some(info) = self.network_knowledge.get_section_member(name).await {
let info = info.leave()?;
if let Ok(cmds) = self
.send_proposal(elders.clone(), Proposal::Offline(info))
.await
{
result.extend(cmds);
}
}
}
Ok(result)
}
}