Skip to content

Commit 6ab8b00

Browse files
committed
f only remove the redundant blocker, not all identical blockers
1 parent d39d279 commit 6ab8b00

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3432,8 +3432,7 @@ fn test_reload_mon_update_completion_actions() {
34323432
do_test_reload_mon_update_completion_actions(false);
34333433
}
34343434

3435-
#[test]
3436-
fn test_glacial_peer_cant_hang() {
3435+
fn do_test_glacial_peer_cant_hang(hold_chan_a: bool) {
34373436
// Test that if a peer manages to send an `update_fulfill_htlc` message without a
34383437
// `commitment_signed`, disconnects, then replays the `update_fulfill_htlc` message it doesn't
34393438
// result in a channel hang. This was previously broken as the `DuplicateClaim` case wasn't
@@ -3457,13 +3456,19 @@ fn test_glacial_peer_cant_hang() {
34573456
expect_payment_claimed!(nodes[2], payment_hash, 1_000_000);
34583457

34593458
let cs_updates = get_htlc_update_msgs(&nodes[2], &nodes[1].node.get_our_node_id());
3459+
if hold_chan_a {
3460+
// The first update will be on the A <-> B channel, which we allow to complete.
3461+
chanmon_cfgs[1].persister.set_update_ret(ChannelMonitorUpdateStatus::InProgress);
3462+
}
34603463
nodes[1].node.handle_update_fulfill_htlc(&nodes[2].node.get_our_node_id(), &cs_updates.update_fulfill_htlcs[0]);
3461-
34623464
check_added_monitors(&nodes[1], 1);
3463-
let bs_updates = get_htlc_update_msgs(&nodes[1], &nodes[0].node.get_our_node_id());
3464-
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
3465-
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false);
3466-
expect_payment_sent!(nodes[0], payment_preimage);
3465+
3466+
if !hold_chan_a {
3467+
let bs_updates = get_htlc_update_msgs(&nodes[1], &nodes[0].node.get_our_node_id());
3468+
nodes[0].node.handle_update_fulfill_htlc(&nodes[1].node.get_our_node_id(), &bs_updates.update_fulfill_htlcs[0]);
3469+
commitment_signed_dance!(nodes[0], nodes[1], bs_updates.commitment_signed, false);
3470+
expect_payment_sent!(&nodes[0], payment_preimage);
3471+
}
34673472

34683473
nodes[1].node.peer_disconnected(&nodes[2].node.get_our_node_id());
34693474
nodes[2].node.peer_disconnected(&nodes[1].node.get_our_node_id());
@@ -3472,7 +3477,26 @@ fn test_glacial_peer_cant_hang() {
34723477
reconnect.pending_htlc_claims = (1, 0);
34733478
reconnect_nodes(reconnect);
34743479

3475-
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
3480+
if !hold_chan_a {
3481+
expect_payment_forwarded!(nodes[1], nodes[0], nodes[2], Some(1000), false, false);
3482+
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
3483+
} else {
3484+
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
3485+
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
34763486

3477-
send_payment(&nodes[0], &[&nodes[1], &nodes[2]], 100_000);
3487+
let (route, payment_hash_2, _, payment_secret_2) = get_route_and_payment_hash!(&nodes[1], nodes[2], 1_000_000);
3488+
3489+
nodes[1].node.send_payment_with_route(&route, payment_hash_2,
3490+
RecipientOnionFields::secret_only(payment_secret_2), PaymentId(payment_hash_2.0)).unwrap();
3491+
check_added_monitors(&nodes[1], 0);
3492+
3493+
assert!(nodes[1].node.get_and_clear_pending_events().is_empty());
3494+
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
3495+
}
3496+
}
3497+
3498+
#[test]
3499+
fn test_glacial_peer_cant_hang() {
3500+
do_test_glacial_peer_cant_hang(false);
3501+
do_test_glacial_peer_cant_hang(true);
34783502
}

lightning/src/ln/channelmanager.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5485,8 +5485,12 @@ where
54855485
{
54865486
let mut found_blocker = false;
54875487
blockers.retain(|iter| {
5488+
// Note that we could actually be blocked, in
5489+
// which case we need to only remove the one
5490+
// blocker which was added duplicatively.
5491+
let first_blocker = !found_blocker;
54885492
if *iter == blocker { found_blocker = true; }
5489-
*iter != blocker
5493+
*iter != blocker || !first_blocker
54905494
});
54915495
debug_assert!(found_blocker);
54925496
}

0 commit comments

Comments
 (0)