From: Matt Corallo Date: Wed, 10 Jan 2024 22:24:43 +0000 (+0000) Subject: Drop `PeerManager` type bound on `UtxoLookup` entirely X-Git-Tag: v0.0.120~8^2 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=refs%2Fheads%2F2024-01-pm-dyn-ref;p=rust-lightning Drop `PeerManager` type bound on `UtxoLookup` entirely In 67659677d4fdb6bf418d66dfa37c61706425232b we relaxed the bounds set on `UtxoLookup` to enable those using `RoutingMessageHandler` other than `P2PGossipSync` to use `UtxoLookup`. Sadly, because this requires having a concrete `PeerManager` type which does *not* use `UtxoLookup` in the `RoutingMessageHandler` type, this broke users who were directly using `P2PGossipSync`. We could split `UtxoLookup` into two, with different bounds, for the two use-cases, but instead here we simply switch to storing a reference to the `PeerManager` via a `dyn Fn` which allows us to wake the `PeerManager` when we need to. Fixes #2813 --- diff --git a/lightning-block-sync/src/gossip.rs b/lightning-block-sync/src/gossip.rs index 591b02987..9cd404967 100644 --- a/lightning-block-sync/src/gossip.rs +++ b/lightning-block-sync/src/gossip.rs @@ -132,14 +132,12 @@ impl< pub struct GossipVerifier where Blocks::Target: UtxoSource, L::Target: Logger, - APM::Target: APeerManager, { source: Blocks, - peer_manager: APM, + peer_manager_wake: Arc, gossiper: Arc>, Self, L>>, spawn: S, block_cache: Arc>>, @@ -150,19 +148,20 @@ const BLOCK_CACHE_SIZE: usize = 5; impl GossipVerifier where +> GossipVerifier where Blocks::Target: UtxoSource, L::Target: Logger, - APM::Target: APeerManager, { /// Constructs a new [`GossipVerifier`]. /// /// This is expected to be given to a [`P2PGossipSync`] (initially constructed with `None` for /// the UTXO lookup) via [`P2PGossipSync::add_utxo_lookup`]. - pub fn new(source: Blocks, spawn: S, gossiper: Arc>, Self, L>>, peer_manager: APM) -> Self { + pub fn new( + source: Blocks, spawn: S, gossiper: Arc>, Self, L>>, peer_manager: APM + ) -> Self where APM::Target: APeerManager { + let peer_manager_wake = Arc::new(move || peer_manager.as_ref().process_events()); Self { - source, spawn, gossiper, peer_manager, + source, spawn, gossiper, peer_manager_wake, block_cache: Arc::new(Mutex::new(VecDeque::with_capacity(BLOCK_CACHE_SIZE))), } } @@ -252,11 +251,9 @@ impl Deref for GossipVerifier where +> Deref for GossipVerifier where Blocks::Target: UtxoSource, L::Target: Logger, - APM::Target: APeerManager, { type Target = Self; fn deref(&self) -> &Self { self } @@ -266,11 +263,9 @@ impl UtxoLookup for GossipVerifier where +> UtxoLookup for GossipVerifier where Blocks::Target: UtxoSource, L::Target: Logger, - APM::Target: APeerManager, { fn get_utxo(&self, _chain_hash: &ChainHash, short_channel_id: u64) -> UtxoResult { let res = UtxoFuture::new(); @@ -278,11 +273,11 @@ impl