Skip to content

Commit e51a789

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 b401b32 commit e51a789

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
@@ -561,11 +561,11 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
561561
}
562562
}
563563

564-
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) {
564+
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) {
565565
create_chan_between_nodes_with_value(node_a, node_b, 100000, 10001)
566566
}
567567

568-
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) {
568+
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) {
569569
let (channel_ready, channel_id, tx) = create_chan_between_nodes_with_value_a(node_a, node_b, channel_value, push_msat);
570570
let (announcement, as_update, bs_update) = create_chan_between_nodes_with_value_b(node_a, node_b, &channel_ready);
571571
(announcement, as_update, bs_update, channel_id, tx)
@@ -1169,7 +1169,7 @@ pub fn create_chan_between_nodes_with_value_confirm_second<'a, 'b, 'c>(node_recv
11691169
}), channel_id)
11701170
}
11711171

1172-
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]) {
1172+
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]) {
11731173
let conf_height = core::cmp::max(node_a.best_block_info().1 + 1, node_b.best_block_info().1 + 1);
11741174
create_chan_between_nodes_with_value_confirm_first(node_a, node_b, tx, conf_height);
11751175
confirm_transaction_at(node_a, tx, conf_height);
@@ -1178,7 +1178,7 @@ pub fn create_chan_between_nodes_with_value_confirm<'a, 'b, 'c, 'd>(node_a: &'a
11781178
create_chan_between_nodes_with_value_confirm_second(node_b, node_a)
11791179
}
11801180

1181-
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) {
1181+
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) {
11821182
let tx = create_chan_between_nodes_with_value_init(node_a, node_b, channel_value, push_msat);
11831183
let (msgs, chan_id) = create_chan_between_nodes_with_value_confirm(node_a, node_b, &tx);
11841184
(msgs, chan_id, tx)
@@ -1218,11 +1218,11 @@ pub fn create_chan_between_nodes_with_value_b<'a, 'b, 'c>(node_a: &Node<'a, 'b,
12181218
((*announcement).clone(), as_update, bs_update)
12191219
}
12201220

1221-
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) {
1221+
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) {
12221222
create_announced_chan_between_nodes_with_value(nodes, a, b, 100000, 10001)
12231223
}
12241224

1225-
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) {
1225+
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) {
12261226
let chan_announcement = create_chan_between_nodes_with_value(&nodes[a], &nodes[b], channel_value, push_msat);
12271227
update_nodes_with_chan_announce(nodes, a, b, &chan_announcement.0, &chan_announcement.1, &chan_announcement.2);
12281228
(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
@@ -443,7 +443,7 @@ where U::Target: UtxoLookup, L::Target: Logger
443443
}
444444

445445
fn handle_channel_announcement(&self, msg: &msgs::ChannelAnnouncement) -> Result<bool, LightningError> {
446-
self.network_graph.update_channel_from_announcement(msg, &self.utxo_lookup)?;
446+
self.network_graph.update_channel_from_announcement(msg, &*self.utxo_lookup.read().unwrap())?;
447447
Ok(msg.contents.excess_data.len() <= MAX_EXCESS_BYTES_FOR_RELAY)
448448
}
449449

lightning/src/routing/router.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3897,7 +3897,7 @@ mod tests {
38973897
fn available_amount_while_routing_test() {
38983898
// Tests whether we choose the correct available channel amount while routing.
38993899

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

0 commit comments

Comments
 (0)