@@ -1381,6 +1381,10 @@ where
1381
1381
1382
1382
pending_offers_messages: Mutex<Vec<PendingOnionMessage<OffersMessage>>>,
1383
1383
1384
+ /// Tracks the channel_update message that were not broadcasted because
1385
+ /// we were not connected to any peers.
1386
+ pending_broadcast_messages: Mutex<Vec<MessageSendEvent>>,
1387
+
1384
1388
entropy_source: ES,
1385
1389
node_signer: NS,
1386
1390
signer_provider: SP,
@@ -2455,6 +2459,7 @@ where
2455
2459
funding_batch_states: Mutex::new(BTreeMap::new()),
2456
2460
2457
2461
pending_offers_messages: Mutex::new(Vec::new()),
2462
+ pending_broadcast_messages: Mutex::new(Vec::new()),
2458
2463
2459
2464
entropy_source,
2460
2465
node_signer,
@@ -2946,17 +2951,11 @@ where
2946
2951
}
2947
2952
};
2948
2953
if let Some(update) = update_opt {
2949
- // Try to send the `BroadcastChannelUpdate` to the peer we just force-closed on, but if
2950
- // not try to broadcast it via whatever peer we have.
2951
- let per_peer_state = self.per_peer_state.read().unwrap();
2952
- let a_peer_state_opt = per_peer_state.get(peer_node_id)
2953
- .ok_or(per_peer_state.values().next());
2954
- if let Ok(a_peer_state_mutex) = a_peer_state_opt {
2955
- let mut a_peer_state = a_peer_state_mutex.lock().unwrap();
2956
- a_peer_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
2957
- msg: update
2958
- });
2959
- }
2954
+ // If we have some Channel Update to broadcast, we cache it and broadcast it later.
2955
+ let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
2956
+ pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
2957
+ msg: update
2958
+ });
2960
2959
}
2961
2960
2962
2961
Ok(counterparty_node_id)
@@ -8194,6 +8193,7 @@ where
8194
8193
result = NotifyOption::DoPersist;
8195
8194
}
8196
8195
8196
+ let mut is_some_peer_connected = false;
8197
8197
let mut pending_events = Vec::new();
8198
8198
let per_peer_state = self.per_peer_state.read().unwrap();
8199
8199
for (_cp_id, peer_state_mutex) in per_peer_state.iter() {
@@ -8202,6 +8202,15 @@ where
8202
8202
if peer_state.pending_msg_events.len() > 0 {
8203
8203
pending_events.append(&mut peer_state.pending_msg_events);
8204
8204
}
8205
+ if peer_state.is_connected {
8206
+ is_some_peer_connected = true
8207
+ }
8208
+ }
8209
+
8210
+ // Ensure that we are connected to some peers before getting broadcast messages.
8211
+ if is_some_peer_connected {
8212
+ let mut broadcast_msgs = self.pending_broadcast_messages.lock().unwrap();
8213
+ pending_events.append(&mut broadcast_msgs);
8205
8214
}
8206
8215
8207
8216
if !pending_events.is_empty() {
@@ -11099,6 +11108,8 @@ where
11099
11108
11100
11109
pending_offers_messages: Mutex::new(Vec::new()),
11101
11110
11111
+ pending_broadcast_messages: Mutex::new(Vec::new()),
11112
+
11102
11113
entropy_source: args.entropy_source,
11103
11114
node_signer: args.node_signer,
11104
11115
signer_provider: args.signer_provider,
@@ -11630,10 +11641,10 @@ mod tests {
11630
11641
11631
11642
#[test]
11632
11643
fn test_drop_disconnected_peers_when_removing_channels() {
11633
- let chanmon_cfgs = create_chanmon_cfgs(2 );
11634
- let node_cfgs = create_node_cfgs(2 , &chanmon_cfgs);
11635
- let node_chanmgrs = create_node_chanmgrs(2 , &node_cfgs, &[None, None]);
11636
- let nodes = create_network(2 , &node_cfgs, &node_chanmgrs);
11644
+ let chanmon_cfgs = create_chanmon_cfgs(3 );
11645
+ let node_cfgs = create_node_cfgs(3 , &chanmon_cfgs);
11646
+ let node_chanmgrs = create_node_chanmgrs(3 , &node_cfgs, &[None, None, None]);
11647
+ let nodes = create_network(3 , &node_cfgs, &node_chanmgrs);
11637
11648
11638
11649
let chan = create_announced_chan_between_nodes(&nodes, 0, 1);
11639
11650
@@ -11650,15 +11661,15 @@ mod tests {
11650
11661
// disconnected and the channel between has been force closed.
11651
11662
let nodes_0_per_peer_state = nodes[0].node.per_peer_state.read().unwrap();
11652
11663
// Assert that nodes[1] isn't removed before `timer_tick_occurred` has been executed.
11653
- assert_eq!(nodes_0_per_peer_state.len(), 1 );
11664
+ assert_eq!(nodes_0_per_peer_state.len(), 2 );
11654
11665
assert!(nodes_0_per_peer_state.get(&nodes[1].node.get_our_node_id()).is_some());
11655
11666
}
11656
11667
11657
11668
nodes[0].node.timer_tick_occurred();
11658
11669
11659
11670
{
11660
11671
// Assert that nodes[1] has now been removed.
11661
- assert_eq!(nodes[0].node.per_peer_state.read().unwrap().len(), 0 );
11672
+ assert_eq!(nodes[0].node.per_peer_state.read().unwrap().len(), 1 );
11662
11673
}
11663
11674
}
11664
11675
@@ -12362,11 +12373,11 @@ mod tests {
12362
12373
12363
12374
#[test]
12364
12375
fn test_trigger_lnd_force_close() {
12365
- let chanmon_cfg = create_chanmon_cfgs(2 );
12366
- let node_cfg = create_node_cfgs(2 , &chanmon_cfg);
12376
+ let chanmon_cfg = create_chanmon_cfgs(3 );
12377
+ let node_cfg = create_node_cfgs(3 , &chanmon_cfg);
12367
12378
let user_config = test_default_channel_config();
12368
- let node_chanmgr = create_node_chanmgrs(2 , &node_cfg, &[Some(user_config), Some(user_config)]);
12369
- let nodes = create_network(2 , &node_cfg, &node_chanmgr);
12379
+ let node_chanmgr = create_node_chanmgrs(3 , &node_cfg, &[Some(user_config), Some(user_config), Some(user_config)]);
12380
+ let nodes = create_network(3 , &node_cfg, &node_chanmgr);
12370
12381
12371
12382
// Open a channel, immediately disconnect each other, and broadcast Alice's latest state.
12372
12383
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
0 commit comments