diff --git a/p2p/p2p-test-utils/src/lib.rs b/p2p/p2p-test-utils/src/lib.rs index da94327676..ed2a08f7ce 100644 --- a/p2p/p2p-test-utils/src/lib.rs +++ b/p2p/p2p-test-utils/src/lib.rs @@ -31,6 +31,7 @@ use logging::log; use mempool::{MempoolConfig, MempoolHandle}; use subsystem::{ManagerJoinHandle, ShutdownTrigger}; use test_utils::mock_time_getter::mocked_time_getter_milliseconds; +use tokio::sync::mpsc; use utils::atomics::SeqCstAtomicU64; use crate::panic_handling::get_panic_notification; @@ -219,3 +220,15 @@ macro_rules! expect_no_recv { $crate::expect_no_future_val!($receiver.recv()) }; } + +pub async fn wait_for_recv(receiver: &mut mpsc::UnboundedReceiver, value: &T) { + let wait_loop = async { + loop { + if receiver.recv().await.unwrap() == *value { + break; + } + } + }; + + expect_future_val!(wait_loop); +} diff --git a/p2p/src/peer_manager/mod.rs b/p2p/src/peer_manager/mod.rs index 587bcc8461..5298443fe1 100644 --- a/p2p/src/peer_manager/mod.rs +++ b/p2p/src/peer_manager/mod.rs @@ -66,6 +66,7 @@ use crate::{ ConnectivityService, NetworkingService, }, peer_manager_event::PeerDisconnectionDbAction, + sync::sync_status::PeerBlockSyncStatus, types::{ peer_address::{PeerAddress, PeerAddressIp4, PeerAddressIp6}, peer_id::PeerId, @@ -833,6 +834,7 @@ where if let Some(peer_id) = peers_eviction::select_for_eviction_block_relay( self.eviction_candidates(PeerRole::OutboundBlockRelay), &self.p2p_config.peer_manager_config, + self.time_getter.get_time(), ) { log::info!("block relay peer {peer_id} is selected for eviction"); self.disconnect(peer_id, PeerDisconnectionDbAction::Keep, None); @@ -844,6 +846,7 @@ where if let Some(peer_id) = peers_eviction::select_for_eviction_full_relay( self.eviction_candidates(PeerRole::OutboundFullRelay), &self.p2p_config.peer_manager_config, + self.time_getter.get_time(), ) { log::info!("full relay peer {peer_id} is selected for eviction"); self.disconnect(peer_id, PeerDisconnectionDbAction::Keep, None); @@ -943,6 +946,7 @@ where discovered_own_address, last_tip_block_time: None, last_tx_time: None, + block_sync_status: PeerBlockSyncStatus::new(), }; Self::send_own_address_to_peer(&mut self.peer_connectivity_handle, &peer); @@ -1250,7 +1254,7 @@ where // TODO: in bitcoin they also try to create an extra outbound full relay connection // to an address in a reachable network in which there are no outbound full relay or // manual connections (see CConnman::MaybePickPreferredNetwork for reference). - // See the TODO section of https://github.com/mintlayer/mintlayer-core/issues/832 + // See https://github.com/mintlayer/mintlayer-core/issues/1433 for address in &new_full_relay_conn_addresses { let addr_group = AddressGroup::from_peer_address(&address.as_peer_address()); @@ -1495,6 +1499,15 @@ where peer.last_tx_time = Some(self.time_getter.get_time()); } } + PeerManagerEvent::PeerBlockSyncStatusUpdate { + peer_id, + new_status: status, + } => { + if let Some(peer) = self.peers.get_mut(&peer_id) { + log::debug!("Block sync status update received from peer {peer_id}, new status is {status:?}"); + peer.block_sync_status = status; + } + } PeerManagerEvent::GetPeerCount(response_sender) => { response_sender.send(self.active_peer_count()); } diff --git a/p2p/src/peer_manager/peer_context.rs b/p2p/src/peer_manager/peer_context.rs index b7d29d6ee1..d8a012a739 100644 --- a/p2p/src/peer_manager/peer_context.rs +++ b/p2p/src/peer_manager/peer_context.rs @@ -21,6 +21,7 @@ use utils::{bloom_filters::rolling_bloom_filter::RollingBloomFilter, set_flag::S use crate::{ net::types::{PeerInfo, PeerRole}, + sync::sync_status::PeerBlockSyncStatus, utils::rate_limiter::RateLimiter, }; @@ -75,4 +76,7 @@ pub struct PeerContext { pub last_tip_block_time: Option