[peer_handler] Take the peers lock before getting messages to send 2021-04-peer_handler_lock
authorMatt Corallo <git@bluematt.me>
Wed, 21 Apr 2021 21:50:41 +0000 (21:50 +0000)
committerMatt Corallo <git@bluematt.me>
Wed, 21 Apr 2021 22:03:45 +0000 (22:03 +0000)
commitbfd11282131bd642d7920bf7ad9d1e59d329ccf8
tree11a3d20e24596f41ef465ca8f45ce83ffabd5e6e
parentf40e47c1ef6957ab548345162ffbd540bc7fe0a2
[peer_handler] Take the peers lock before getting messages to send

Previously, if a user simultaneously called
`PeerHandler::process_events()` from two threads, we'd race, which
ended up sending messages out-of-order in the real world.
Specifically, we first called `get_and_clear_pending_msg_events`,
then take the `peers` lock and push the messages we got into the
sending queue. Two threads may both get some set of messages to
send, but then race each other into the `peers` lock and send the
messages in random order.

Because we already hold the `peers` lock when calling most message
handler functions, we can simply take the lock before calling
`get_and_clear_pending_msg_events`, solving the race.
lightning/src/ln/peer_handler.rs