]> git.bitcoin.ninja Git - rust-lightning/commit
Validate `channel_update` signatures without holding a graph lock 2024-09-unlocked-checksig
authorMatt Corallo <git@bluematt.me>
Wed, 11 Sep 2024 23:36:29 +0000 (23:36 +0000)
committerMatt Corallo <git@bluematt.me>
Mon, 23 Sep 2024 03:48:29 +0000 (03:48 +0000)
commit131849f383336debac86b80a403cc6e64376529a
treed588632c4aed91906ec7294a038275c312b06f29
parent0b7838b59de357bce02d86fc840a3906be8d189f
Validate `channel_update` signatures without holding a graph lock

We often process many gossip messages in parallel across different
peer connections, making the `NetworkGraph` mutexes fairly
contention-sensitive (not to mention the potential that we want to
send a payment and need to find a path to do so).

Because we need to look up a node's public key to validate a
signature on `channel_update` messages, we always need to take a
`NetworkGraph::channels` lock before we can validate the message.

For simplicity, and to avoid taking a lock twice, we'd always
validated the `channel_update` signature while holding the same
lock, but here we address the contention issues by doing a
`channel_update` validation in three stages.

First we take a read lock on `NetworkGraph::channels` and check if
the `channel_update` is new, then release the lock and validate the
message signature, and finally take a write lock, (re-check if the
`channel_update` is new) and update the graph.
lightning/src/routing/gossip.rs