forked from lx/netapp
Full mesh peering strategy uses our local address if necessary
This commit is contained in:
parent
48d6a72ebd
commit
dfb0ebb8e1
2 changed files with 30 additions and 5 deletions
|
@ -1,4 +1,5 @@
|
|||
use std::io::Write;
|
||||
use std::net::SocketAddr;
|
||||
|
||||
use log::info;
|
||||
|
||||
|
@ -65,6 +66,11 @@ async fn main() {
|
|||
info!("Node private key: {}", hex::encode(&privkey));
|
||||
info!("Node public key: {}", hex::encode(&privkey.public_key()));
|
||||
|
||||
let public_addr = opt.public_addr.map(|x| x.parse().unwrap());
|
||||
let listen_addr: SocketAddr = opt.listen_addr.parse().unwrap();
|
||||
info!("Node public address: {:?}", public_addr);
|
||||
info!("Node listen address: {}", listen_addr);
|
||||
|
||||
let netapp = NetApp::new(netid.clone(), privkey.clone());
|
||||
|
||||
let mut bootstrap_peers = vec![];
|
||||
|
@ -72,9 +78,11 @@ async fn main() {
|
|||
bootstrap_peers.push(parse_peer_addr(peer).expect("Invalid peer address"));
|
||||
}
|
||||
|
||||
let peering = FullMeshPeeringStrategy::new(netapp.clone(), bootstrap_peers);
|
||||
|
||||
let listen_addr = opt.listen_addr.parse().unwrap();
|
||||
let peering = FullMeshPeeringStrategy::new(
|
||||
netapp.clone(),
|
||||
bootstrap_peers,
|
||||
public_addr.map(|a| SocketAddr::new(a, listen_addr.port())),
|
||||
);
|
||||
|
||||
info!("Add more peers to this mesh by running: fullmesh -n {} -l 127.0.0.1:$((1000 + $RANDOM)) -b {}@{}",
|
||||
hex::encode(&netid),
|
||||
|
@ -83,7 +91,6 @@ async fn main() {
|
|||
|
||||
let watch_cancel = netapp::util::watch_ctrl_c();
|
||||
|
||||
let public_addr = opt.public_addr.map(|x| x.parse().unwrap());
|
||||
tokio::join!(
|
||||
netapp.listen(listen_addr, public_addr, watch_cancel.clone()),
|
||||
peering.run(watch_cancel),
|
||||
|
|
|
@ -163,7 +163,11 @@ impl FullMeshPeeringStrategy {
|
|||
/// The strategy will not be run until `.run()` is called and awaited.
|
||||
/// Once that happens, the peering strategy will try to connect
|
||||
/// to all of the nodes specified in the bootstrap list.
|
||||
pub fn new(netapp: Arc<NetApp>, bootstrap_list: Vec<(NodeID, SocketAddr)>) -> Arc<Self> {
|
||||
pub fn new(
|
||||
netapp: Arc<NetApp>,
|
||||
bootstrap_list: Vec<(NodeID, SocketAddr)>,
|
||||
our_addr: Option<SocketAddr>,
|
||||
) -> Arc<Self> {
|
||||
let mut known_hosts = KnownHosts::new();
|
||||
for (id, addr) in bootstrap_list {
|
||||
if id != netapp.id {
|
||||
|
@ -179,6 +183,18 @@ impl FullMeshPeeringStrategy {
|
|||
}
|
||||
}
|
||||
|
||||
if let Some(addr) = our_addr {
|
||||
known_hosts.list.insert(
|
||||
netapp.id,
|
||||
PeerInfoInternal {
|
||||
addr,
|
||||
state: PeerConnState::Ourself,
|
||||
last_seen: None,
|
||||
ping: VecDeque::new(),
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
let strat = Arc::new(Self {
|
||||
netapp: netapp.clone(),
|
||||
known_hosts: RwLock::new(known_hosts),
|
||||
|
@ -188,6 +204,8 @@ impl FullMeshPeeringStrategy {
|
|||
peer_list_endpoint: netapp.endpoint("__netapp/peering/fullmesh.rs/PeerList".into()),
|
||||
});
|
||||
|
||||
strat.update_public_peer_list(&strat.known_hosts.read().unwrap());
|
||||
|
||||
strat.ping_endpoint.set_handler(strat.clone());
|
||||
strat.peer_list_endpoint.set_handler(strat.clone());
|
||||
|
||||
|
|
Loading…
Reference in a new issue