Skip to content

Commit aaff5be

Browse files
committed
Make the P2PGossipSync UtxoLookup exchangable without &mut self
Because a `UtxoLookup` implementation is likely to need a reference to the `PeerManager` which contains a reference to the `P2PGossipSync`, it is likely to be impossible to get a mutable reference to the `P2PGossipSync` by the time we want to add a `UtxoLookup` without a ton of boilerplate and trait wrapping. Instead, we simply place the `UtxoLookup` in a `RwLock`, allowing us to modify it without a mutable self reference. The lifetime bounds updates in tests required in this commit are entirely unclear to me, but do allow tests to continue building, so somehow make rustc happier.
1 parent bf62a49 commit aaff5be

File tree

3 files changed

+12
-12
lines changed

3 files changed

+12
-12
lines changed

lightning/src/ln/functional_test_utils.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -534,11 +534,11 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
534534
}
535535
}
536536

537-
pub fn create_chan_between_nodes<'a, 'b, 'c, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
537+
pub fn create_chan_between_nodes<'a, 'b, 'c: 'd, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
538538
create_chan_between_nodes_with_value(node_a, node_b, 100000, 10001)
539539
}
540540

541-
pub fn create_chan_between_nodes_with_value<'a, 'b, 'c, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
541+
pub fn create_chan_between_nodes_with_value<'a, 'b, 'c: 'd, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64) -> (msgs::ChannelAnnouncement, msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
542542
let (channel_ready, channel_id, tx) = create_chan_between_nodes_with_value_a(node_a, node_b, channel_value, push_msat);
543543
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(node_a, node_b, &channel_ready);
544544
(announcement, as_update, bs_update, channel_id, tx)
@@ -1078,7 +1078,7 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
10781078
}), channel_id)
10791079
}
10801080

1081-
pub fn create_chan_between_nodes_with_value_confirm<'a, 'b, 'c, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, tx: &Transaction) -> ((msgs::ChannelReady, msgs::AnnouncementSignatures), [u8; 32]) {
1081+
pub fn create_chan_between_nodes_with_value_confirm<'a, 'b, 'c: 'd, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, tx: &Transaction) -> ((msgs::ChannelReady, msgs::AnnouncementSignatures), [u8; 32]) {
10821082
let conf_height = core::cmp::max(node_a.best_block_info().1 + 1, node_b.best_block_info().1 + 1);
10831083
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx, conf_height);
10841084
confirm_transaction_at(node_a, tx, conf_height);
@@ -1087,7 +1087,7 @@ pub fn create_chan_between_nodes_with_value_confirm<'a, 'b, 'c, 'd>(node_a: &'a
10871087
create_chan_between_nodes_with_value_confirm_second(node_b, node_a)
10881088
}
10891089

1090-
pub fn create_chan_between_nodes_with_value_a<'a, 'b, 'c, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64) -> ((msgs::ChannelReady, msgs::AnnouncementSignatures), [u8; 32], Transaction) {
1090+
pub fn create_chan_between_nodes_with_value_a<'a, 'b, 'c: 'd, 'd>(node_a: &'a Node<'b, 'c, 'd>, node_b: &'a Node<'b, 'c, 'd>, channel_value: u64, push_msat: u64) -> ((msgs::ChannelReady, msgs::AnnouncementSignatures), [u8; 32], Transaction) {
10911091
let tx = create_chan_between_nodes_with_value_init(node_a, node_b, channel_value, push_msat);
10921092
let (msgs, chan_id) = create_chan_between_nodes_with_value_confirm(node_a, node_b, &tx);
10931093
(msgs, chan_id, tx)
@@ -1127,11 +1127,11 @@ pub fn create_chan_between_nodes_with_value_b<'a, 'b, 'c>(node_a: &Node<'a, 'b,
11271127
((*announcement).clone(), as_update, bs_update)
11281128
}
11291129

1130-
pub fn create_announced_chan_between_nodes<'a, 'b, 'c, 'd>(nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
1130+
pub fn create_announced_chan_between_nodes<'a, 'b, 'c: 'd, 'd>(nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
11311131
create_announced_chan_between_nodes_with_value(nodes, a, b, 100000, 10001)
11321132
}
11331133

1134-
pub fn create_announced_chan_between_nodes_with_value<'a, 'b, 'c, 'd>(nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize, channel_value: u64, push_msat: u64) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
1134+
pub fn create_announced_chan_between_nodes_with_value<'a, 'b, 'c: 'd, 'd>(nodes: &'a Vec<Node<'b, 'c, 'd>>, a: usize, b: usize, channel_value: u64, push_msat: u64) -> (msgs::ChannelUpdate, msgs::ChannelUpdate, [u8; 32], Transaction) {
11351135
let chan_announcement = create_chan_between_nodes_with_value(&nodes[a], &nodes[b], channel_value, push_msat);
11361136
update_nodes_with_chan_announce(nodes, a, b, &chan_announcement.0, &chan_announcement.1, &chan_announcement.2);
11371137
(chan_announcement.1, chan_announcement.2, chan_announcement.3, chan_announcement.4)

lightning/src/routing/gossip.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ pub struct P2PGossipSync<G: Deref<Target=NetworkGraph<L>>, U: Deref, L: Deref>
254254
where U::Target: UtxoLookup, L::Target: Logger
255255
{
256256
network_graph: G,
257-
utxo_lookup: Option<U>,
257+
utxo_lookup: RwLock<Option<U>>,
258258
#[cfg(feature = "std")]
259259
full_syncs_requested: AtomicUsize,
260260
pending_events: Mutex<Vec<MessageSendEvent>>,
@@ -273,7 +273,7 @@ where U::Target: UtxoLookup, L::Target: Logger
273273
network_graph,
274274
#[cfg(feature = "std")]
275275
full_syncs_requested: AtomicUsize::new(0),
276-
utxo_lookup,
276+
utxo_lookup: RwLock::new(utxo_lookup),
277277
pending_events: Mutex::new(vec![]),
278278
logger,
279279
}
@@ -282,8 +282,8 @@ where U::Target: UtxoLookup, L::Target: Logger
282282
/// Adds a provider used to check new announcements. Does not affect
283283
/// existing announcements unless they are updated.
284284
/// Add, update or remove the provider would replace the current one.
285-
pub fn add_utxo_lookup(&mut self, utxo_lookup: Option<U>) {
286-
self.utxo_lookup = utxo_lookup;
285+
pub fn add_utxo_lookup(&self, utxo_lookup: Option<U>) {
286+
*self.utxo_lookup.write().unwrap() = utxo_lookup;
287287
}
288288

289289
/// Gets a reference to the underlying [`NetworkGraph`] which was provided in
@@ -415,7 +415,7 @@ where U::Target: UtxoLookup, L::Target: Logger
415415
}
416416

417417
fn handle_channel_announcement(&self, msg: &msgs::ChannelAnnouncement) -> Result<bool, LightningError> {
418-
self.network_graph.update_channel_from_announcement(msg, &self.utxo_lookup)?;
418+
self.network_graph.update_channel_from_announcement(msg, &*self.utxo_lookup.read().unwrap())?;
419419
Ok(msg.contents.excess_data.len() <= MAX_EXCESS_BYTES_FOR_RELAY)
420420
}
421421

lightning/src/routing/router.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3495,7 +3495,7 @@ mod tests {
34953495
fn available_amount_while_routing_test() {
34963496
// Tests whether we choose the correct available channel amount while routing.
34973497

3498-
let (secp_ctx, network_graph, mut gossip_sync, chain_monitor, logger) = build_graph();
3498+
let (secp_ctx, network_graph, gossip_sync, chain_monitor, logger) = build_graph();
34993499
let (our_privkey, our_id, privkeys, nodes) = get_nodes(&secp_ctx);
35003500
let scorer = ln_test_utils::TestScorer::new();
35013501
let keys_manager = ln_test_utils::TestKeysInterface::new(&[0u8; 32], Network::Testnet);

0 commit comments

Comments
 (0)