@@ -1591,15 +1591,37 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1591
1591
}
1592
1592
1593
1593
/// Process an incoming message and return a decision (ok, lightning error, peer handling error) regarding the next action with the peer
1594
+ ///
1594
1595
/// Returns the message back if it needs to be broadcasted to all other peers.
1595
1596
fn handle_message (
1596
1597
& self ,
1597
1598
peer_mutex : & Mutex < Peer > ,
1598
- mut peer_lock : MutexGuard < Peer > ,
1599
- message : wire:: Message < <<CMH as core :: ops :: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage >
1600
- ) -> Result < Option < wire:: Message < <<CMH as core :: ops :: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > > , MessageHandlingError > {
1599
+ peer_lock : MutexGuard < Peer > ,
1600
+ message : wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage >
1601
+ ) -> Result < Option < wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > > , MessageHandlingError > {
1601
1602
let their_node_id = peer_lock. their_node_id . clone ( ) . expect ( "We know the peer's public key by the time we receive messages" ) . 0 ;
1602
1603
let logger = WithContext :: from ( & self . logger , Some ( their_node_id) , None ) ;
1604
+
1605
+ let message = match self . do_handle_message_holding_peer_lock ( peer_lock, message, & their_node_id, & logger) ? {
1606
+ Some ( processed_message) => processed_message,
1607
+ None => return Ok ( None ) ,
1608
+ } ;
1609
+
1610
+ self . do_handle_message_without_peer_lock ( peer_mutex, message, & their_node_id, & logger)
1611
+ }
1612
+
1613
+ // Conducts all message processing that requires us to hold the `peer_lock`.
1614
+ //
1615
+ // Returns `None` if the message was fully processed and otherwise returns the message back to
1616
+ // allow it to be subsequently processed by `do_handle_message_without_peer_lock`.
1617
+ fn do_handle_message_holding_peer_lock < ' a > (
1618
+ & self ,
1619
+ mut peer_lock : MutexGuard < Peer > ,
1620
+ message : wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > ,
1621
+ their_node_id : & PublicKey ,
1622
+ logger : & WithContext < ' a , L >
1623
+ ) -> Result < Option < wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > > , MessageHandlingError >
1624
+ {
1603
1625
peer_lock. received_message_since_timer_tick = true ;
1604
1626
1605
1627
// Need an Init as first message
@@ -1680,8 +1702,20 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1680
1702
peer_lock. received_channel_announce_since_backlogged = true ;
1681
1703
}
1682
1704
1683
- mem:: drop ( peer_lock) ;
1705
+ Ok ( Some ( message) )
1706
+ }
1684
1707
1708
+ // Conducts all message processing that doesn't require us to hold the `peer_lock`.
1709
+ //
1710
+ // Returns the message back if it needs to be broadcasted to all other peers.
1711
+ fn do_handle_message_without_peer_lock < ' a > (
1712
+ & self ,
1713
+ peer_mutex : & Mutex < Peer > ,
1714
+ message : wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > ,
1715
+ their_node_id : & PublicKey ,
1716
+ logger : & WithContext < ' a , L >
1717
+ ) -> Result < Option < wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > > , MessageHandlingError >
1718
+ {
1685
1719
if is_gossip_msg ( message. type_id ( ) ) {
1686
1720
log_gossip ! ( logger, "Received message {:?} from {}" , message, log_pubkey!( their_node_id) ) ;
1687
1721
} else {
@@ -1883,7 +1917,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1883
1917
Ok ( should_forward)
1884
1918
}
1885
1919
1886
- fn forward_broadcast_msg ( & self , peers : & HashMap < Descriptor , Mutex < Peer > > , msg : & wire:: Message < <<CMH as core :: ops :: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > , except_node : Option < & PublicKey > ) {
1920
+ fn forward_broadcast_msg ( & self , peers : & HashMap < Descriptor , Mutex < Peer > > , msg : & wire:: Message < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > , except_node : Option < & PublicKey > ) {
1887
1921
match msg {
1888
1922
wire:: Message :: ChannelAnnouncement ( ref msg) => {
1889
1923
log_gossip ! ( self . logger, "Sending message to all peers except {:?} or the announced channel's counterparties: {:?}" , except_node, msg) ;
@@ -2275,7 +2309,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2275
2309
// We do not have the peers write lock, so we just store that we're
2276
2310
// about to disconnect the peer and do it after we finish
2277
2311
// processing most messages.
2278
- let msg = msg. map ( |msg| wire:: Message :: < <<CMH as core :: ops :: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > :: Error ( msg) ) ;
2312
+ let msg = msg. map ( |msg| wire:: Message :: < <<CMH as Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > :: Error ( msg) ) ;
2279
2313
peers_to_disconnect. insert ( node_id, msg) ;
2280
2314
} ,
2281
2315
msgs:: ErrorAction :: DisconnectPeerWithWarning { msg } => {
0 commit comments