Skip to content

Commit 9b4d2c0

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 9b4d2c0

7 files changed

+78
-25
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3282,7 +3282,10 @@ 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.
3286+
connect_dummy_node(&nodes[1]);
32853287
check_closed_broadcast(&nodes[1], 1, true);
3288+
disconnect_dummy_node(&nodes[1]);
32863289
check_closed_event(&nodes[1], 1, ClosureReason::CommitmentTxConfirmed, false, &[nodes[0].node.get_our_node_id()], 100000);
32873290
} else {
32883291
// While we forwarded the payment a while ago, we don't want to process events too early or
@@ -3395,7 +3398,9 @@ fn do_test_reload_mon_update_completion_actions(close_during_reload: bool) {
33953398
// (as learned about during the on-reload block connection).
33963399
nodes[0].node.force_close_broadcasting_latest_txn(&chan_id_ab, &nodes[1].node.get_our_node_id()).unwrap();
33973400
check_added_monitors!(nodes[0], 1);
3401+
connect_dummy_node(&nodes[0]);
33983402
check_closed_broadcast!(nodes[0], true);
3403+
disconnect_dummy_node(&nodes[0]);
33993404
check_closed_event(&nodes[0], 1, ClosureReason::HolderForceClosed, false, &[nodes[1].node.get_our_node_id()], 100_000);
34003405
let as_closing_tx = nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().split_off(0);
34013406
mine_transaction_without_consistency_checks(&nodes[1], &as_closing_tx[0]);
@@ -3410,7 +3415,9 @@ fn do_test_reload_mon_update_completion_actions(close_during_reload: bool) {
34103415
Event::ChannelClosed { .. } => {},
34113416
_ => panic!(),
34123417
}
3418+
connect_dummy_node(&nodes[1]);
34133419
check_closed_broadcast!(nodes[1], true);
3420+
disconnect_dummy_node(&nodes[1]);
34143421
}
34153422

34163423
// Once we run event processing the monitor should free, check that it was indeed the B<->C

lightning/src/ln/channelmanager.rs

Lines changed: 26 additions & 13 deletions
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
}
@@ -8450,6 +8460,8 @@ where
84508460
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
84518461
let peer_state = &mut *peer_state_lock;
84528462
let pending_msg_events = &mut peer_state.pending_msg_events;
8463+
let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
8464+
84538465
peer_state.channel_by_id.retain(|_, phase| {
84548466
match phase {
84558467
// Retain unfunded channels.
@@ -8522,7 +8534,7 @@ where
85228534
let reason_message = format!("{}", reason);
85238535
failed_channels.push(channel.context.force_shutdown(true, reason));
85248536
if let Ok(update) = self.get_channel_update_for_broadcast(&channel) {
8525-
pending_msg_events.push(events::MessageSendEvent::BroadcastChannelUpdate {
8537+
pending_broadcast_messages.push(events::MessageSendEvent::BroadcastChannelUpdate {
85268538
msg: update
85278539
});
85288540
}
@@ -8969,7 +8981,9 @@ where
89698981
// Gossip
89708982
&events::MessageSendEvent::SendChannelAnnouncement { .. } => false,
89718983
&events::MessageSendEvent::BroadcastChannelAnnouncement { .. } => true,
8972-
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => true,
8984+
// [`ChannelManager::pending_broadcast_events`] holds the [`BroadcastChannelUpdate`]
8985+
// This check here is to ensure exhaustivity.
8986+
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => false,
89738987
&events::MessageSendEvent::BroadcastNodeAnnouncement { .. } => true,
89748988
&events::MessageSendEvent::SendChannelUpdate { .. } => false,
89758989
&events::MessageSendEvent::SendChannelRangeQuery { .. } => false,
@@ -11880,7 +11894,6 @@ mod tests {
1188011894
assert_eq!(nodes_0_lock.len(), 1);
1188111895
assert!(nodes_0_lock.contains_key(&funding_output));
1188211896
}
11883-
1188411897
{
1188511898
// At this stage, `nodes[1]` has proposed a fee for the closing transaction in the
1188611899
// `handle_closing_signed` call above. As `nodes[1]` has not yet received the signature

lightning/src/ln/functional_test_utils.rs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3039,6 +3039,26 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
30393039
nodes
30403040
}
30413041

3042+
pub fn connect_dummy_node<'a, 'b: 'a, 'c: 'b>(node: &Node<'a, 'b, 'c>) {
3043+
let node_id_dummy = PublicKey::from_slice(&[2; 33]).unwrap();
3044+
3045+
let mut dummy_init_features = InitFeatures::empty();
3046+
dummy_init_features.set_static_remote_key_required();
3047+
3048+
let init_dummy = msgs::Init {
3049+
features: dummy_init_features,
3050+
networks: None,
3051+
remote_network_address: None
3052+
};
3053+
3054+
node.node.peer_connected(&node_id_dummy, &init_dummy, true).unwrap();
3055+
node.onion_messenger.peer_connected(&node_id_dummy, &init_dummy, true).unwrap();
3056+
}
3057+
3058+
pub fn disconnect_dummy_node<'a, 'b: 'a, 'c: 'b>(node: &Node<'a, 'b, 'c>) {
3059+
node.node.peer_disconnected(&PublicKey::from_slice(&[2; 33]).unwrap());
3060+
}
3061+
30423062
// Note that the following only works for CLTV values up to 128
30433063
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT: usize = 137; // Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
30443064
pub const ACCEPTED_HTLC_SCRIPT_WEIGHT_ANCHORS: usize = 140; // Here we have a diff due to HTLC CLTV expiry being < 2^15 in test
@@ -3152,13 +3172,13 @@ pub fn check_preimage_claim<'a, 'b, 'c>(node: &Node<'a, 'b, 'c>, prev_txn: &Vec<
31523172
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) {
31533173
let events_1 = nodes[a].node.get_and_clear_pending_msg_events();
31543174
assert_eq!(events_1.len(), 2);
3155-
let as_update = match events_1[0] {
3175+
let as_update = match events_1[1] {
31563176
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
31573177
msg.clone()
31583178
},
31593179
_ => panic!("Unexpected event"),
31603180
};
3161-
match events_1[1] {
3181+
match events_1[0] {
31623182
MessageSendEvent::HandleError { node_id, action: msgs::ErrorAction::SendErrorMessage { ref msg } } => {
31633183
assert_eq!(node_id, nodes[b].node.get_our_node_id());
31643184
assert_eq!(msg.data, expected_error);
@@ -3178,14 +3198,14 @@ pub fn handle_announce_close_broadcast_events<'a, 'b, 'c>(nodes: &Vec<Node<'a, '
31783198

31793199
let events_2 = nodes[b].node.get_and_clear_pending_msg_events();
31803200
assert_eq!(events_2.len(), if needs_err_handle { 1 } else { 2 });
3181-
let bs_update = match events_2[0] {
3201+
let bs_update = match events_2.last().unwrap() {
31823202
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
31833203
msg.clone()
31843204
},
31853205
_ => panic!("Unexpected event"),
31863206
};
31873207
if !needs_err_handle {
3188-
match events_2[1] {
3208+
match events_2[0] {
31893209
MessageSendEvent::HandleError { node_id, action: msgs::ErrorAction::SendErrorMessage { ref msg } } => {
31903210
assert_eq!(node_id, nodes[a].node.get_our_node_id());
31913211
assert_eq!(msg.data, expected_error);

lightning/src/ln/functional_tests.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2272,7 +2272,9 @@ fn channel_monitor_network_test() {
22722272
// Simple case with no pending HTLCs:
22732273
nodes[1].node.force_close_broadcasting_latest_txn(&chan_1.2, &nodes[0].node.get_our_node_id()).unwrap();
22742274
check_added_monitors!(nodes[1], 1);
2275+
connect_dummy_node(&nodes[1]);
22752276
check_closed_broadcast!(nodes[1], true);
2277+
disconnect_dummy_node(&nodes[1]);
22762278
check_closed_event!(nodes[1], 1, ClosureReason::HolderForceClosed, [nodes[0].node.get_our_node_id()], 100000);
22772279
{
22782280
let mut node_txn = test_txn_broadcast(&nodes[1], &chan_1, None, HTLCType::NONE);
@@ -2371,13 +2373,13 @@ fn channel_monitor_network_test() {
23712373
connect_blocks(&nodes[3], TEST_FINAL_CLTV + LATENCY_GRACE_PERIOD_BLOCKS + 1);
23722374
let events = nodes[3].node.get_and_clear_pending_msg_events();
23732375
assert_eq!(events.len(), 2);
2374-
let close_chan_update_1 = match events[0] {
2376+
let close_chan_update_1 = match events[1] {
23752377
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
23762378
msg.clone()
23772379
},
23782380
_ => panic!("Unexpected event"),
23792381
};
2380-
match events[1] {
2382+
match events[0] {
23812383
MessageSendEvent::HandleError { action: ErrorAction::DisconnectPeer { .. }, node_id } => {
23822384
assert_eq!(node_id, nodes[4].node.get_our_node_id());
23832385
},
@@ -2403,13 +2405,13 @@ fn channel_monitor_network_test() {
24032405
connect_blocks(&nodes[4], TEST_FINAL_CLTV - CLTV_CLAIM_BUFFER + 2);
24042406
let events = nodes[4].node.get_and_clear_pending_msg_events();
24052407
assert_eq!(events.len(), 2);
2406-
let close_chan_update_2 = match events[0] {
2408+
let close_chan_update_2 = match events[1] {
24072409
MessageSendEvent::BroadcastChannelUpdate { ref msg } => {
24082410
msg.clone()
24092411
},
24102412
_ => panic!("Unexpected event"),
24112413
};
2412-
match events[1] {
2414+
match events[0] {
24132415
MessageSendEvent::HandleError { action: ErrorAction::DisconnectPeer { .. }, node_id } => {
24142416
assert_eq!(node_id, nodes[3].node.get_our_node_id());
24152417
},
@@ -4605,7 +4607,7 @@ fn test_static_spendable_outputs_preimage_tx() {
46054607
MessageSendEvent::UpdateHTLCs { .. } => {},
46064608
_ => panic!("Unexpected event"),
46074609
}
4608-
match events[1] {
4610+
match events[2] {
46094611
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
46104612
_ => panic!("Unexepected event"),
46114613
}
@@ -4648,7 +4650,7 @@ fn test_static_spendable_outputs_timeout_tx() {
46484650
mine_transaction(&nodes[1], &commitment_tx[0]);
46494651
check_added_monitors!(nodes[1], 1);
46504652
let events = nodes[1].node.get_and_clear_pending_msg_events();
4651-
match events[0] {
4653+
match events[1] {
46524654
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
46534655
_ => panic!("Unexpected event"),
46544656
}
@@ -5062,7 +5064,7 @@ fn test_duplicate_payment_hash_one_failure_one_success() {
50625064
MessageSendEvent::UpdateHTLCs { .. } => {},
50635065
_ => panic!("Unexpected event"),
50645066
}
5065-
match events[1] {
5067+
match events[2] {
50665068
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
50675069
_ => panic!("Unexepected event"),
50685070
}
@@ -5140,7 +5142,7 @@ fn test_dynamic_spendable_outputs_local_htlc_success_tx() {
51405142
MessageSendEvent::UpdateHTLCs { .. } => {},
51415143
_ => panic!("Unexpected event"),
51425144
}
5143-
match events[1] {
5145+
match events[2] {
51445146
MessageSendEvent::BroadcastChannelUpdate { .. } => {},
51455147
_ => panic!("Unexepected event"),
51465148
}
@@ -7321,6 +7323,9 @@ fn test_announce_disable_channels() {
73217323
let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
73227324
let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
73237325

7326+
// Connect a dummy node for proper future events broadcasting
7327+
connect_dummy_node(&nodes[0]);
7328+
73247329
create_announced_chan_between_nodes(&nodes, 0, 1);
73257330
create_announced_chan_between_nodes(&nodes, 1, 0);
73267331
create_announced_chan_between_nodes(&nodes, 0, 1);

lightning/src/ln/monitor_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2683,7 +2683,9 @@ fn do_test_anchors_monitor_fixes_counterparty_payment_script_on_reload(confirm_c
26832683
reload_node!(nodes[1], user_config, &nodes[1].node.encode(), &[&serialized_monitor], persister, chain_monitor, node_deserialized);
26842684
let commitment_tx_conf_height = block_from_scid(&mine_transaction(&nodes[1], &commitment_tx));
26852685
check_added_monitors(&nodes[1], 1);
2686+
connect_dummy_node(&nodes[1]);
26862687
check_closed_broadcast(&nodes[1], 1, true);
2688+
disconnect_dummy_node(&nodes[1]);
26872689
commitment_tx_conf_height
26882690
};
26892691
check_closed_event!(&nodes[1], 1, ClosureReason::CommitmentTxConfirmed, false,

lightning/src/ln/payment_tests.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,6 +1046,10 @@ fn do_test_dup_htlc_onchain_fails_on_reload(persist_manager_post_event: bool, co
10461046
let nodes_0_deserialized;
10471047
let mut nodes = create_network(2, &node_cfgs, &node_chanmgrs);
10481048

1049+
// Connect a dummy node for proper future events broadcasting
1050+
connect_dummy_node(&nodes[0]);
1051+
connect_dummy_node(&nodes[1]);
1052+
10491053
let (_, _, chan_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
10501054

10511055
// Route a payment, but force-close the channel before the HTLC fulfill message arrives at

lightning/src/ln/reorg_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,9 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
352352
check_added_monitors!(nodes[0], 1);
353353
let expected_err = "Funding transaction was un-confirmed. Locked at 6 confs, now have 0 confs.";
354354
if reorg_after_reload || !reload_node {
355+
connect_dummy_node(&nodes[0]);
355356
handle_announce_close_broadcast_events(&nodes, 0, 1, true, "Channel closed because of an exception: Funding transaction was un-confirmed. Locked at 6 confs, now have 0 confs.");
357+
disconnect_dummy_node(&nodes[0]);
356358
check_added_monitors!(nodes[1], 1);
357359
check_closed_event!(nodes[1], 1, ClosureReason::CounterpartyForceClosed { peer_msg: UntrustedString(format!("Channel closed because of an exception: {}", expected_err)) }
358360
, [nodes[0].node.get_our_node_id()], 100000);

0 commit comments

Comments
 (0)