Skip to content

Commit d156b2e

Browse files
committed
Call ChannelMessageHandler::message_received without peer lock
While `message_received` purports to be called on every message, prior to the message, doing so on `Init` messages means we have to call `message_received` while holding the per-peer mutex, which can cause some lock contention. Instead, here, we call `message_received` after processing `Init` messages (which is probably more useful anyway - the peer isn't really "connected" until we've processed the `Init` messages), allowing us to call it unlocked.
1 parent b8695b0 commit d156b2e

File tree

1 file changed

+7
-6
lines changed

1 file changed

+7
-6
lines changed

lightning/src/ln/peer_handler.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1618,14 +1618,15 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
16181618
let their_node_id = peer_lock.their_node_id.expect("We know the peer's public key by the time we receive messages").0;
16191619
let logger = WithContext::from(&self.logger, Some(their_node_id), None, None);
16201620

1621+
let unprocessed_message = self.do_handle_message_holding_peer_lock(peer_lock, message, their_node_id, &logger)?;
1622+
16211623
self.message_handler.chan_handler.message_received();
1622-
1623-
let message = match self.do_handle_message_holding_peer_lock(peer_lock, message, their_node_id, &logger)? {
1624-
Some(processed_message) => processed_message,
1625-
None => return Ok(None),
1626-
};
16271624

1628-
self.do_handle_message_without_peer_lock(peer_mutex, message, their_node_id, &logger)
1625+
if let Some(message) = unprocessed_message {
1626+
self.do_handle_message_without_peer_lock(peer_mutex, message, their_node_id, &logger)
1627+
} else {
1628+
Ok(None)
1629+
}
16291630
}
16301631

16311632
// Conducts all message processing that requires us to hold the `peer_lock`.

0 commit comments

Comments
 (0)