@@ -1392,6 +1392,10 @@ where
1392
1392
1393
1393
pending_offers_messages: Mutex<Vec<PendingOnionMessage<OffersMessage>>>,
1394
1394
1395
+ /// Tracks the channel_update message that were not broadcasted because
1396
+ /// we were not connected to any peers.
1397
+ pending_broadcast_messages: Mutex<Vec<MessageSendEvent>>,
1398
+
1395
1399
entropy_source: ES,
1396
1400
node_signer: NS,
1397
1401
signer_provider: SP,
@@ -2466,6 +2470,7 @@ where
2466
2470
funding_batch_states: Mutex::new(BTreeMap::new()),
2467
2471
2468
2472
pending_offers_messages: Mutex::new(Vec::new()),
2473
+ pending_broadcast_messages: Mutex::new(Vec::new()),
2469
2474
2470
2475
entropy_source,
2471
2476
node_signer,
@@ -2957,17 +2962,11 @@ where
2957
2962
}
2958
2963
};
2959
2964
if let Some(update) = update_opt {
2960
- // Try to send the `BroadcastChannelUpdate` to the peer we just force-closed on, but if
2961
- // not try to broadcast it via whatever peer we have.
2962
- let per_peer_state = self.per_peer_state.read().unwrap();
2963
- let a_peer_state_opt = per_peer_state.get(peer_node_id)
2964
- .ok_or(per_peer_state.values().next());
2965
- if let Ok(a_peer_state_mutex) = a_peer_state_opt {
2966
- let mut a_peer_state = a_peer_state_mutex.lock().unwrap();
2967
- a_peer_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
2968
- msg: update
2969
- });
2970
- }
2965
+ // If we have some Channel Update to broadcast, we cache it and broadcast it later.
2966
+ let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
2967
+ pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
2968
+ msg: update
2969
+ });
2971
2970
}
2972
2971
2973
2972
Ok(counterparty_node_id)
@@ -8209,7 +8208,7 @@ where
8209
8208
/// will randomly be placed first or last in the returned array.
8210
8209
///
8211
8210
/// Note that even though `BroadcastChannelAnnouncement` and `BroadcastChannelUpdate`
8212
- /// `MessageSendEvent`s are intended to be broadcasted to all peers, they will be pleaced among
8211
+ /// `MessageSendEvent`s are intended to be broadcasted to all peers, they will be placed among
8213
8212
/// the `MessageSendEvent`s to the specific peer they were generated under.
8214
8213
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {
8215
8214
let events = RefCell::new(Vec::new());
@@ -8229,6 +8228,7 @@ where
8229
8228
result = NotifyOption::DoPersist;
8230
8229
}
8231
8230
8231
+ let mut is_some_peer_connected = false;
8232
8232
let mut pending_events = Vec::new();
8233
8233
let per_peer_state = self.per_peer_state.read().unwrap();
8234
8234
for (_cp_id, peer_state_mutex) in per_peer_state.iter() {
@@ -8237,6 +8237,15 @@ where
8237
8237
if peer_state.pending_msg_events.len() > 0 {
8238
8238
pending_events.append(&mut peer_state.pending_msg_events);
8239
8239
}
8240
+ if peer_state.is_connected {
8241
+ is_some_peer_connected = true
8242
+ }
8243
+ }
8244
+
8245
+ // Ensure that we are connected to some peers before getting broadcast messages.
8246
+ if is_some_peer_connected {
8247
+ let mut broadcast_msgs = self.pending_broadcast_messages.lock().unwrap();
8248
+ pending_events.append(&mut broadcast_msgs);
8240
8249
}
8241
8250
8242
8251
if !pending_events.is_empty() {
@@ -11149,6 +11158,8 @@ where
11149
11158
11150
11159
pending_offers_messages: Mutex::new(Vec::new()),
11151
11160
11161
+ pending_broadcast_messages: Mutex::new(Vec::new()),
11162
+
11152
11163
entropy_source: args.entropy_source,
11153
11164
node_signer: args.node_signer,
11154
11165
signer_provider: args.signer_provider,
@@ -11678,12 +11689,62 @@ mod tests {
11678
11689
}
11679
11690
}
11680
11691
11692
+ #[test]
11693
+ fn test_channel_update_cached() {
11694
+ let chanmon_cfgs = create_chanmon_cfgs(3);
11695
+ let node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
11696
+ let node_chanmgrs = create_node_chanmgrs(3, &node_cfgs, &[None, None, None]);
11697
+ let nodes = create_network(3, &node_cfgs, &node_chanmgrs);
11698
+
11699
+ let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
11700
+
11701
+ nodes[0].node.force_close_channel_with_peer(&chan.2, &nodes[1].node.get_our_node_id(), None, true).unwrap();
11702
+ check_added_monitors!(nodes[0], 1);
11703
+ check_closed_event!(nodes[0], 1, ClosureReason::HolderForceClosed, [nodes[1].node.get_our_node_id()], 100000);
11704
+
11705
+ {
11706
+ // Assert that ChannelUpdate message has been added to node[0] pending broadcast messages
11707
+ let pending_broadcast_messages= nodes[0].node.pending_broadcast_messages.lock().unwrap();
11708
+ assert_eq!(pending_broadcast_messages.len(), 1);
11709
+ }
11710
+
11711
+ // Confirm that the channel_update was not sent immediately to node[1] but was cached.
11712
+ let node_1_events = nodes[1].node.get_and_clear_pending_msg_events();
11713
+ assert_eq!(node_1_events.len(), 0);
11714
+
11715
+ // Test that we do not retrieve the pending broadcast messages when we are not connected to any peer
11716
+ nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id());
11717
+ nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id());
11718
+
11719
+ nodes[0].node.peer_disconnected(&nodes[2].node.get_our_node_id());
11720
+ nodes[2].node.peer_disconnected(&nodes[0].node.get_our_node_id());
11721
+
11722
+ let node_0_events = nodes[0].node.get_and_clear_pending_msg_events();
11723
+ assert_eq!(node_0_events.len(), 0);
11724
+
11725
+ // Now we reconnect to a peer
11726
+ nodes[0].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init {
11727
+ features: nodes[2].node.init_features(), networks: None, remote_network_address: None
11728
+ }, true).unwrap();
11729
+ nodes[2].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init {
11730
+ features: nodes[0].node.init_features(), networks: None, remote_network_address: None
11731
+ }, false).unwrap();
11732
+
11733
+ // Confirm that get_and_clear_pending_msg_events correctly captures pending broadcast messages
11734
+ let node_0_events = nodes[0].node.get_and_clear_pending_msg_events();
11735
+ assert_eq!(node_0_events.len(), 1);
11736
+ match &node_0_events[0] {
11737
+ MessageSendEvent::BroadcastChannelUpdate { .. } => (),
11738
+ _ => panic!("Unexpected event"),
11739
+ }
11740
+ }
11741
+
11681
11742
#[test]
11682
11743
fn test_drop_disconnected_peers_when_removing_channels() {
11683
- let chanmon_cfgs = create_chanmon_cfgs(2 );
11684
- let node_cfgs = create_node_cfgs(2 , &chanmon_cfgs);
11685
- let node_chanmgrs = create_node_chanmgrs(2 , &node_cfgs, &[None, None]);
11686
- let nodes = create_network(2 , &node_cfgs, &node_chanmgrs);
11744
+ let chanmon_cfgs = create_chanmon_cfgs(3 );
11745
+ let node_cfgs = create_node_cfgs(3 , &chanmon_cfgs);
11746
+ let node_chanmgrs = create_node_chanmgrs(3 , &node_cfgs, &[None, None, None]);
11747
+ let nodes = create_network(3 , &node_cfgs, &node_chanmgrs);
11687
11748
11688
11749
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
11689
11750
@@ -11700,15 +11761,15 @@ mod tests {
11700
11761
// disconnected and the channel between has been force closed.
11701
11762
let nodes_0_per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
11702
11763
// Assert that nodes[1] isn't removed before `timer_tick_occurred` has been executed.
11703
- assert_eq!(nodes_0_per_peer_state.len(), 1 );
11764
+ assert_eq!(nodes_0_per_peer_state.len(), 2 );
11704
11765
assert!(nodes_0_per_peer_state.get(&nodes[1].node.get_our_node_id()).is_some());
11705
11766
}
11706
11767
11707
11768
nodes[0].node.timer_tick_occurred();
11708
11769
11709
11770
{
11710
11771
// Assert that nodes[1] has now been removed.
11711
- assert_eq!(nodes[0].node.per_peer_state.read().unwrap().len(), 0 );
11772
+ assert_eq!(nodes[0].node.per_peer_state.read().unwrap().len(), 1 );
11712
11773
}
11713
11774
}
11714
11775
@@ -12412,11 +12473,11 @@ mod tests {
12412
12473
12413
12474
#[test]
12414
12475
fn test_trigger_lnd_force_close() {
12415
- let chanmon_cfg = create_chanmon_cfgs(2 );
12416
- let node_cfg = create_node_cfgs(2 , &chanmon_cfg);
12476
+ let chanmon_cfg = create_chanmon_cfgs(3 );
12477
+ let node_cfg = create_node_cfgs(3 , &chanmon_cfg);
12417
12478
let user_config = test_default_channel_config();
12418
- let node_chanmgr = create_node_chanmgrs(2 , &node_cfg, &[Some(user_config), Some(user_config)]);
12419
- let nodes = create_network(2 , &node_cfg, &node_chanmgr);
12479
+ let node_chanmgr = create_node_chanmgrs(3 , &node_cfg, &[Some(user_config), Some(user_config), Some(user_config)]);
12480
+ let nodes = create_network(3 , &node_cfg, &node_chanmgr);
12420
12481
12421
12482
// Open a channel, immediately disconnect each other, and broadcast Alice's latest state.
12422
12483
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
0 commit comments