Skip to content

Commit ada8f6c

Browse files
committed
Pass all BroadcastChannelUpdates through pending_broadcast_message pipeline
And fix the consequent test failures. 1. Resolved issues stemming from lack of peers to broadcast `msg_events`. 2. Updated handling of `BroadcastChannelUpdate` and `HandleErrorMessage`. Introduced `connect_dummy_node` and `disconnect_dummy_node` functions in functional test utils to rectify the first type of failure. Additionally, manually adjusted other tests to align with the updated `msg_events` ordering.
1 parent 6222b1f commit ada8f6c

File tree

4 files changed

+98
-27
lines changed

4 files changed

+98
-27
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

+1
Original file line numberDiff line numberDiff line change
@@ -3282,6 +3282,7 @@ fn do_test_durable_preimages_on_closed_channel(close_chans_before_reload: bool,
32823282
check_spends!(bs_preimage_tx, as_closing_tx[0]);
32833283

32843284
if !close_chans_before_reload {
3285+
// Connect a dummy node to allow broadcasting the close channel event.
32853286
check_closed_broadcast(&nodes[1], 1, true);
32863287
check_closed_event(&nodes[1], 1, ClosureReason::CommitmentTxConfirmed, false, &[nodes[0].node.get_our_node_id()], 100000);
32873288
} else {

lightning/src/ln/channelmanager.rs

+36-13
Original file line numberDiff line numberDiff line change
@@ -1980,7 +1980,8 @@ macro_rules! handle_error {
19801980
match $internal {
19811981
Ok(msg) => Ok(msg),
19821982
Err(MsgHandleErrInternal { err, shutdown_finish, .. }) => {
1983-
let mut msg_events = Vec::with_capacity(2);
1983+
let mut msg_events = Vec::with_capacity(1);
1984+
let mut broadcast_events = Vec::with_capacity(1);
19841985

19851986
if let Some((shutdown_res, update_option)) = shutdown_finish {
19861987
let counterparty_node_id = shutdown_res.counterparty_node_id;
@@ -1992,7 +1993,7 @@ macro_rules! handle_error {
19921993

19931994
$self.finish_close_channel(shutdown_res);
19941995
if let Some(update) = update_option {
1995-
msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
1996+
broadcast_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
19961997
msg: update
19971998
});
19981999
}
@@ -2008,6 +2009,11 @@ macro_rules! handle_error {
20082009
});
20092010
}
20102011

2012+
if !broadcast_events.is_empty() {
2013+
let mut pending_broadcast_messages = $self.pending_broadcast_messages.lock().unwrap();
2014+
pending_broadcast_messages.append(&mut broadcast_events);
2015+
}
2016+
20112017
if !msg_events.is_empty() {
20122018
let per_peer_state = $self.per_peer_state.read().unwrap();
20132019
if let Some(peer_state_mutex) = per_peer_state.get(&$counterparty_node_id) {
@@ -4042,6 +4048,8 @@ where
40424048
.ok_or_else(|| APIError::ChannelUnavailable { err: format!("Can't find a peer matching the passed counterparty node_id {}", counterparty_node_id) })?;
40434049
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
40444050
let peer_state = &mut *peer_state_lock;
4051+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
4052+
40454053
for channel_id in channel_ids {
40464054
if !peer_state.has_channel(channel_id) {
40474055
return Err(APIError::ChannelUnavailable {
@@ -4058,7 +4066,7 @@ where
40584066
}
40594067
if let ChannelPhase::Funded(channel) = channel_phase {
40604068
if let Ok(msg) = self.get_channel_update_for_broadcast(channel) {
4061-
peer_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate { msg });
4069+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate { msg });
40624070
} else if let Ok(msg) = self.get_channel_update_for_unicast(channel) {
40634071
peer_state.pending_msg_events.push(events::MessageSendEvent::SendChannelUpdate {
40644072
node_id: channel.context.get_counterparty_node_id(),
@@ -4938,6 +4946,7 @@ where
49384946
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
49394947
let peer_state = &mut *peer_state_lock;
49404948
let pending_msg_events = &mut peer_state.pending_msg_events;
4949+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
49414950
let counterparty_node_id = *counterparty_node_id;
49424951
peer_state.channel_by_id.retain(|chan_id, phase| {
49434952
match phase {
@@ -4968,7 +4977,7 @@ where
49684977
if n >= DISABLE_GOSSIP_TICKS {
49694978
chan.set_channel_update_status(ChannelUpdateStatus::Disabled);
49704979
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
4971-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
4980+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
49724981
msg: update
49734982
});
49744983
}
@@ -4982,7 +4991,7 @@ where
49824991
if n >= ENABLE_GOSSIP_TICKS {
49834992
chan.set_channel_update_status(ChannelUpdateStatus::Enabled);
49844993
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
4985-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
4994+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
49864995
msg: update
49874996
});
49884997
}
@@ -6641,9 +6650,8 @@ where
66416650
}
66426651
if let Some(ChannelPhase::Funded(chan)) = chan_option {
66436652
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
6644-
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
6645-
let peer_state = &mut *peer_state_lock;
6646-
peer_state.pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
6653+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
6654+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
66476655
msg: update
66486656
});
66496657
}
@@ -7299,11 +7307,12 @@ where
72997307
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
73007308
let peer_state = &mut *peer_state_lock;
73017309
let pending_msg_events = &mut peer_state.pending_msg_events;
7310+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
73027311
if let hash_map::Entry::Occupied(chan_phase_entry) = peer_state.channel_by_id.entry(channel_id) {
73037312
if let ChannelPhase::Funded(mut chan) = remove_channel_phase!(self, chan_phase_entry) {
73047313
failed_channels.push(chan.context.force_shutdown(false, ClosureReason::HolderForceClosed));
73057314
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
7306-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
7315+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
73077316
msg: update
73087317
});
73097318
}
@@ -7468,6 +7477,7 @@ where
74687477
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
74697478
let peer_state = &mut *peer_state_lock;
74707479
let pending_msg_events = &mut peer_state.pending_msg_events;
7480+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
74717481
peer_state.channel_by_id.retain(|channel_id, phase| {
74727482
match phase {
74737483
ChannelPhase::Funded(chan) => {
@@ -7488,7 +7498,7 @@ where
74887498
// We're done with this channel. We got a closing_signed and sent back
74897499
// a closing_signed with a closing transaction to broadcast.
74907500
if let Ok(update) = self.get_channel_update_for_broadcast(&chan) {
7491-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
7501+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
74927502
msg: update
74937503
});
74947504
}
@@ -8098,6 +8108,16 @@ where
80988108
self.pending_outbound_payments.clear_pending_payments()
80998109
}
81008110

8111+
/// Checks if at least one peer is connected.
8112+
pub fn is_some_peer_connected(&self) -> bool {
8113+
let peer_state = self.per_peer_state.read().unwrap();
8114+
for (_, peer_mutex) in peer_state.iter() {
8115+
let peer = peer_mutex.lock().unwrap();
8116+
if peer.is_connected { return true; }
8117+
}
8118+
false
8119+
}
8120+
81018121
/// When something which was blocking a channel from updating its [`ChannelMonitor`] (e.g. an
81028122
/// [`Event`] being handled) completes, this should be called to restore the channel to normal
81038123
/// operation. It will double-check that nothing *else* is also blocking the same channel from
@@ -8450,6 +8470,8 @@ where
84508470
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
84518471
let peer_state = &mut *peer_state_lock;
84528472
let pending_msg_events = &mut peer_state.pending_msg_events;
8473+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
8474+
84538475
peer_state.channel_by_id.retain(|_, phase| {
84548476
match phase {
84558477
// Retain unfunded channels.
@@ -8522,7 +8544,7 @@ where
85228544
let reason_message = format!("{}", reason);
85238545
failed_channels.push(channel.context.force_shutdown(true, reason));
85248546
if let Ok(update) = self.get_channel_update_for_broadcast(&channel) {
8525-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
8547+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
85268548
msg: update
85278549
});
85288550
}
@@ -8969,7 +8991,9 @@ where
89698991
// Gossip
89708992
&events::MessageSendEvent::SendChannelAnnouncement { .. } => false,
89718993
&events::MessageSendEvent::BroadcastChannelAnnouncement { .. } => true,
8972-
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => true,
8994+
// [`ChannelManager::pending_broadcast_events`] holds the [`BroadcastChannelUpdate`]
8995+
// This check here is to ensure exhaustivity.
8996+
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => false,
89738997
&events::MessageSendEvent::BroadcastNodeAnnouncement { .. } => true,
89748998
&events::MessageSendEvent::SendChannelUpdate { .. } => false,
89758999
&events::MessageSendEvent::SendChannelRangeQuery { .. } => false,
@@ -11880,7 +11904,6 @@ mod tests {
1188011904
assert_eq!(nodes_0_lock.len(), 1);
1188111905
assert!(nodes_0_lock.contains_key(&funding_output));
1188211906
}
11883-
1188411907
{
1188511908
// At this stage, `nodes[1]` has proposed a fee for the closing transaction in the
1188611909
// `handle_closing_signed` call above. As `nodes[1]` has not yet received the signature

lightning/src/ln/functional_test_utils.rs

+50-6
Original file line numberDiff line numberDiff line change
@@ -1534,8 +1534,16 @@ macro_rules! check_warn_msg {
15341534
/// Check that a channel's closing channel update has been broadcasted, and optionally
15351535
/// check whether an error message event has occurred.
15361536
pub fn check_closed_broadcast(node: &Node, num_channels: usize, with_error_msg: bool) -> Vec<msgs::ErrorMessage> {
1537+
let mut dummy_connected = false;
1538+
if !node.node.is_some_peer_connected() {
1539+
connect_dummy_node(&node);
1540+
dummy_connected = true;
1541+
}
15371542
let msg_events = node.node.get_and_clear_pending_msg_events();
15381543
assert_eq!(msg_events.len(), if with_error_msg { num_channels * 2 } else { num_channels });
1544+
if dummy_connected {
1545+
disconnect_dummy_node(&node);
1546+
}
15391547
msg_events.into_iter().filter_map(|msg_event| {
15401548
match msg_event {
15411549
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
@@ -3039,6 +3047,26 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
30393047
nodes
30403048
}
30413049

3050+
pub fn connect_dummy_node<'a, 'b: 'a, 'c: 'b>(node: &Node<'a, 'b, 'c>) {
3051+
let node_id_dummy = PublicKey::from_slice(&[2; 33]).unwrap();
3052+
3053+
let mut dummy_init_features = InitFeatures::empty();
3054+
dummy_init_features.set_static_remote_key_required();
3055+
3056+
let init_dummy = msgs::Init {
3057+
features: dummy_init_features,
3058+
networks: None,
3059+
remote_network_address: None
3060+
};
3061+
3062+
node.node.peer_connected(&node_id_dummy, &init_dummy, true).unwrap();
3063+
node.onion_messenger.peer_connected(&node_id_dummy, &init_dummy, true).unwrap();
3064+
}
3065+
3066+
pub fn disconnect_dummy_node<'a, 'b: 'a, 'c: 'b>(node: &Node<'a, 'b, 'c>) {
3067+
node.node.peer_disconnected(&PublicKey::from_slice(&[2; 33]).unwrap());
3068+
}
3069+
30423070
// Note that the following only works for CLTV values up to 128
30433071
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT: usize = 137; // Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
30443072
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT_ANCHORS: usize = 140; // Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
@@ -3150,15 +3178,20 @@ pub fn check_preimage_claim<'a, 'b, 'c>(node: &Node<'a, 'b, 'c>, prev_txn: &Vec<
31503178
}
31513179

31523180
pub fn handle_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, 'b, 'c>>, a: usize, b: usize, needs_err_handle: bool, expected_error: &str) {
3181+
let mut dummy_connected = false;
3182+
if !nodes[a].node.is_some_peer_connected() {
3183+
connect_dummy_node(&nodes[a]);
3184+
dummy_connected = true
3185+
}
31533186
let events_1 = nodes[a].node.get_and_clear_pending_msg_events();
31543187
assert_eq!(events_1.len(), 2);
3155-
let as_update = match events_1[0] {
3188+
let as_update = match events_1[1] {
31563189
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
31573190
msg.clone()
31583191
},
31593192
_ => panic!("Unexpected event"),
31603193
};
3161-
match events_1[1] {
3194+
match events_1[0] {
31623195
MessageSendEvent::HandleError { node_id, action: msgs::ErrorAction::SendErrorMessage { ref msg } } => {
31633196
assert_eq!(node_id, nodes[b].node.get_our_node_id());
31643197
assert_eq!(msg.data, expected_error);
@@ -3175,17 +3208,24 @@ pub fn handle_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, '
31753208
},
31763209
_ => panic!("Unexpected event"),
31773210
}
3178-
3211+
if dummy_connected {
3212+
disconnect_dummy_node(&nodes[a]);
3213+
dummy_connected = false;
3214+
}
3215+
if !nodes[b].node.is_some_peer_connected() {
3216+
connect_dummy_node(&nodes[b]);
3217+
dummy_connected = true;
3218+
}
31793219
let events_2 = nodes[b].node.get_and_clear_pending_msg_events();
31803220
assert_eq!(events_2.len(), if needs_err_handle { 1 } else { 2 });
3181-
let bs_update = match events_2[0] {
3221+
let bs_update = match events_2.last().unwrap() {
31823222
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
31833223
msg.clone()
31843224
},
31853225
_ => panic!("Unexpected event"),
31863226
};
31873227
if !needs_err_handle {
3188-
match events_2[1] {
3228+
match events_2[0] {
31893229
MessageSendEvent::HandleError { node_id, action: msgs::ErrorAction::SendErrorMessage { ref msg } } => {
31903230
assert_eq!(node_id, nodes[a].node.get_our_node_id());
31913231
assert_eq!(msg.data, expected_error);
@@ -3197,7 +3237,11 @@ pub fn handle_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, '
31973237
_ => panic!("Unexpected event"),
31983238
}
31993239
}
3200-
3240+
if dummy_connected {
3241+
disconnect_dummy_node(&nodes[b]);
3242+
// Commenting the assignment to remove `unused_assignments` warning.
3243+
// dummy_connected = false;
3244+
}
32013245
for node in nodes {
32023246
node.gossip_sync.handle_channel_update(&as_update).unwrap();
32033247
node.gossip_sync.handle_channel_update(&bs_update).unwrap();

lightning/src/ln/functional_tests.rs

+11-8
Original file line numberDiff line numberDiff line change
@@ -2371,13 +2371,13 @@ fn channel_monitor_network_test() {
23712371
connect_blocks(&nodes[3], TEST_FINAL_CLTV + LATENCY_GRACE_PERIOD_BLOCKS + 1);
23722372
let events = nodes[3].node.get_and_clear_pending_msg_events();
23732373
assert_eq!(events.len(), 2);
2374-
let close_chan_update_1 = match events[0] {
2374+
let close_chan_update_1 = match events[1] {
23752375
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
23762376
msg.clone()
23772377
},
23782378
_ => panic!("Unexpected event"),
23792379
};
2380-
match events[1] {
2380+
match events[0] {
23812381
MessageSendEvent::HandleError { action: ErrorAction::DisconnectPeer { .. }, node_id } => {
23822382
assert_eq!(node_id, nodes[4].node.get_our_node_id());
23832383
},
@@ -2403,13 +2403,13 @@ fn channel_monitor_network_test() {
24032403
connect_blocks(&nodes[4], TEST_FINAL_CLTV - CLTV_CLAIM_BUFFER + 2);
24042404
let events = nodes[4].node.get_and_clear_pending_msg_events();
24052405
assert_eq!(events.len(), 2);
2406-
let close_chan_update_2 = match events[0] {
2406+
let close_chan_update_2 = match events[1] {
24072407
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
24082408
msg.clone()
24092409
},
24102410
_ => panic!("Unexpected event"),
24112411
};
2412-
match events[1] {
2412+
match events[0] {
24132413
MessageSendEvent::HandleError { action: ErrorAction::DisconnectPeer { .. }, node_id } => {
24142414
assert_eq!(node_id, nodes[3].node.get_our_node_id());
24152415
},
@@ -4605,7 +4605,7 @@ fn test_static_spendable_outputs_preimage_tx() {
46054605
MessageSendEvent::UpdateHTLCs { .. } => {},
46064606
_ => panic!("Unexpected event"),
46074607
}
4608-
match events[1] {
4608+
match events[2] {
46094609
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
46104610
_ => panic!("Unexepected event"),
46114611
}
@@ -4648,7 +4648,7 @@ fn test_static_spendable_outputs_timeout_tx() {
46484648
mine_transaction(&nodes[1], &commitment_tx[0]);
46494649
check_added_monitors!(nodes[1], 1);
46504650
let events = nodes[1].node.get_and_clear_pending_msg_events();
4651-
match events[0] {
4651+
match events[1] {
46524652
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
46534653
_ => panic!("Unexpected event"),
46544654
}
@@ -5062,7 +5062,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
50625062
MessageSendEvent::UpdateHTLCs { .. } => {},
50635063
_ => panic!("Unexpected event"),
50645064
}
5065-
match events[1] {
5065+
match events[2] {
50665066
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
50675067
_ => panic!("Unexepected event"),
50685068
}
@@ -5140,7 +5140,7 @@ fn test_dynamic_spendable_outputs_local_htlc_success_tx() {
51405140
MessageSendEvent::UpdateHTLCs { .. } => {},
51415141
_ => panic!("Unexpected event"),
51425142
}
5143-
match events[1] {
5143+
match events[2] {
51445144
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
51455145
_ => panic!("Unexepected event"),
51465146
}
@@ -7321,6 +7321,9 @@ fn test_announce_disable_channels() {
73217321
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
73227322
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
73237323

7324+
// Connect a dummy node for proper future events broadcasting
7325+
connect_dummy_node(&nodes[0]);
7326+
73247327
create_announced_chan_between_nodes(&nodes, 0, 1);
73257328
create_announced_chan_between_nodes(&nodes, 1, 0);
73267329
create_announced_chan_between_nodes(&nodes, 0, 1);

0 commit comments

Comments
 (0)