diff --git a/zebra-network/src/peer/connector.rs b/zebra-network/src/peer/connector.rs index 2733cc233..66de3e599 100644 --- a/zebra-network/src/peer/connector.rs +++ b/zebra-network/src/peer/connector.rs @@ -162,12 +162,12 @@ where debug!("constructing PeerClient, spawning PeerServer"); - let (tx, rx) = mpsc::channel(0); + let (server_tx, server_rx) = mpsc::channel(0); let slot = ErrorSlot::default(); let client = PeerClient { span: connection_span.clone(), - server_tx: tx, + server_tx: server_tx.clone(), error_slot: slot.clone(), }; @@ -176,7 +176,7 @@ where let server = PeerServer { state: ServerState::AwaitingRequest, svc: internal_service, - client_rx: rx, + client_rx: server_rx, error_slot: slot, peer_tx, request_timer: None, @@ -208,12 +208,29 @@ where .boxed(), ); - // client.ready().await?; + tokio::spawn(async move { + use futures::channel::oneshot; - tokio::spawn( - Interval::new_interval(Duration::from_secs(60)) - .for_each(|_| client.call(Request::Ping(Nonce::default()))), - ); + use super::client::ClientRequest; + + let mut server_tx = server_tx; + + let mut interval_stream = Interval::new_interval(Duration::from_secs(60)); + + loop { + interval_stream.next().await; + + // We discard the server handle because our + // heartbeat `Ping`s are a special case, and we + // don't actually care about the response here. + let (request_tx, _) = oneshot::channel(); + let msg = ClientRequest(Request::Ping(Nonce::default()), request_tx); + + if server_tx.send(msg).await.is_err() { + return; + } + } + }); Ok(client) }; diff --git a/zebra-network/src/protocol/internal.rs b/zebra-network/src/protocol/internal.rs index 622f01b02..34a1ed227 100644 --- a/zebra-network/src/protocol/internal.rs +++ b/zebra-network/src/protocol/internal.rs @@ -16,6 +16,9 @@ pub enum Request { /// Advertises peers to the remote server. PushPeers(Vec), /// Heartbeats triggered on peer connection start. + // This is included as a bit of a hack, it should only be used + // internally for connection management. You should not expect to + // be firing or handling `Ping` requests or `Pong` responses. Ping(Nonce), }