@@ -31,7 +31,10 @@ use crate::{
3131 disconnection_reason:: DisconnectionReason ,
3232 error:: { ConnectionValidationError , P2pError , PeerError , ProtocolError } ,
3333 message:: { BlockSyncMessage , TransactionSyncMessage , WillDisconnectMessage } ,
34- net:: default_backend:: types:: { BackendEvent , PeerEvent } ,
34+ net:: {
35+ default_backend:: types:: { BackendEvent , PeerEvent } ,
36+ types:: PeerManagerMessageExt ,
37+ } ,
3538 protocol:: { choose_common_protocol_version, ProtocolVersion , SupportedProtocolVersion } ,
3639 types:: peer_id:: PeerId ,
3740} ;
@@ -80,6 +83,10 @@ pub struct Peer<T: TransportSocket> {
8083
8184 /// Time getter
8285 time_getter : TimeGetter ,
86+
87+ /// Will be set to true once at least one BlockSyncMessage or TransactionSyncMessage has been
88+ /// received from the peer.
89+ sync_message_received : bool ,
8390}
8491
8592impl < T > Peer < T >
@@ -112,6 +119,7 @@ where
112119 node_protocol_version,
113120 time_getter,
114121 common_protocol_version : None ,
122+ sync_message_received : false ,
115123 }
116124 }
117125
@@ -390,17 +398,17 @@ where
390398 // Note: the channels used by this function to propagate messages to other parts of p2p
391399 // must be bounded; this is important to prevent DoS attacks.
392400 async fn handle_socket_msg (
401+ & mut self ,
393402 peer_id : PeerId ,
394403 msg : Message ,
395- peer_event_sender : & mut mpsc:: Sender < PeerEvent > ,
396- block_sync_msg_sender : & mut mpsc:: Sender < BlockSyncMessage > ,
397- transaction_sync_msg_sender : & mut mpsc:: Sender < TransactionSyncMessage > ,
404+ block_sync_msg_sender : & mpsc:: Sender < BlockSyncMessage > ,
405+ transaction_sync_msg_sender : & mpsc:: Sender < TransactionSyncMessage > ,
398406 ) -> crate :: Result < ( ) > {
399407 match msg. categorize ( ) {
400408 CategorizedMessage :: Handshake ( _) => {
401409 log:: error!( "Peer {peer_id} sent unexpected handshake message" ) ;
402410
403- peer_event_sender
411+ self . peer_event_sender
404412 . send ( PeerEvent :: Misbehaved {
405413 error : P2pError :: ProtocolError ( ProtocolError :: UnexpectedMessage (
406414 "Unexpected handshake message" . to_owned ( ) ,
@@ -409,11 +417,35 @@ where
409417 . await ?;
410418 }
411419 CategorizedMessage :: PeerManagerMessage ( msg) => {
412- peer_event_sender. send ( PeerEvent :: MessageReceived { message : msg } ) . await ?
420+ self . peer_event_sender
421+ . send ( PeerEvent :: MessageReceived (
422+ PeerManagerMessageExt :: PeerManagerMessage ( msg) ,
423+ ) )
424+ . await ?
425+ }
426+ CategorizedMessage :: BlockSyncMessage ( msg) => {
427+ if !self . sync_message_received {
428+ self . peer_event_sender
429+ . send ( PeerEvent :: MessageReceived (
430+ PeerManagerMessageExt :: FirstSyncMessageReceived ,
431+ ) )
432+ . await ?;
433+ self . sync_message_received = true ;
434+ }
435+
436+ block_sync_msg_sender. send ( msg) . await ?;
413437 }
414- CategorizedMessage :: BlockSyncMessage ( msg) => block_sync_msg_sender. send ( msg) . await ?,
415438 CategorizedMessage :: TransactionSyncMessage ( msg) => {
416- transaction_sync_msg_sender. send ( msg) . await ?
439+ if !self . sync_message_received {
440+ self . peer_event_sender
441+ . send ( PeerEvent :: MessageReceived (
442+ PeerManagerMessageExt :: FirstSyncMessageReceived ,
443+ ) )
444+ . await ?;
445+ self . sync_message_received = true ;
446+ }
447+
448+ transaction_sync_msg_sender. send ( msg) . await ?;
417449 }
418450 }
419451
@@ -486,12 +518,11 @@ where
486518 event = self . socket. recv( ) , if sync_msg_senders_opt. is_some( ) => match event {
487519 Ok ( message) => {
488520 let sync_msg_senders = sync_msg_senders_opt. as_mut( ) . expect( "sync_msg_senders_opt is some" ) ;
489- Self :: handle_socket_msg(
521+ self . handle_socket_msg(
490522 self . peer_id,
491523 message,
492- & mut self . peer_event_sender,
493- & mut sync_msg_senders. 0 ,
494- & mut sync_msg_senders. 1 ,
524+ & sync_msg_senders. 0 ,
525+ & sync_msg_senders. 1 ,
495526 ) . await ?;
496527 }
497528 Err ( err) => {
0 commit comments