@@ -3410,20 +3410,29 @@ fn test_inbound_reload_without_init_mon() {
3410
3410
do_test_inbound_reload_without_init_mon ( false , false ) ;
3411
3411
}
3412
3412
3413
- #[ test]
3414
- fn test_blocked_chan_preimage_release ( ) {
3413
+ #[ derive( PartialEq , Eq ) ]
3414
+ enum BlockedUpdateComplMode {
3415
+ Async ,
3416
+ AtReload ,
3417
+ Sync ,
3418
+ }
3419
+
3420
+ fn do_test_blocked_chan_preimage_release ( completion_mode : BlockedUpdateComplMode ) {
3415
3421
// Test that even if a channel's `ChannelMonitorUpdate` flow is blocked waiting on an event to
3416
3422
// be handled HTLC preimage `ChannelMonitorUpdate`s will still go out.
3417
3423
let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
3418
3424
let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
3425
+ let persister;
3426
+ let new_chain_mon;
3419
3427
let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
3428
+ let nodes_1_reload;
3420
3429
let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
3421
3430
3422
3431
let node_a_id = nodes[ 0 ] . node . get_our_node_id ( ) ;
3423
3432
let node_b_id = nodes[ 1 ] . node . get_our_node_id ( ) ;
3424
3433
let node_c_id = nodes[ 2 ] . node . get_our_node_id ( ) ;
3425
3434
3426
- create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
3435
+ let chan_id_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) . 2 ;
3427
3436
let chan_id_2 = create_announced_chan_between_nodes ( & nodes, 1 , 2 ) . 2 ;
3428
3437
3429
3438
send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , 5_000_000 ) ;
@@ -3456,29 +3465,64 @@ fn test_blocked_chan_preimage_release() {
3456
3465
expect_payment_claimed ! ( nodes[ 0 ] , payment_hash_2, 1_000_000 ) ;
3457
3466
3458
3467
let as_htlc_fulfill_updates = get_htlc_update_msgs ! ( nodes[ 0 ] , node_b_id) ;
3468
+ if completion_mode != BlockedUpdateComplMode :: Sync {
3469
+ // We use to incorrectly handle monitor update completion in cases where we completed a
3470
+ // monitor update async or after reload. We test both based on the `completion_mode`.
3471
+ chanmon_cfgs[ 1 ] . persister . set_update_ret ( ChannelMonitorUpdateStatus :: InProgress ) ;
3472
+ }
3459
3473
nodes[ 1 ]
3460
3474
. node
3461
3475
. handle_update_fulfill_htlc ( node_a_id, & as_htlc_fulfill_updates. update_fulfill_htlcs [ 0 ] ) ;
3462
3476
check_added_monitors ( & nodes[ 1 ] , 1 ) ; // We generate only a preimage monitor update
3463
3477
assert ! ( get_monitor!( nodes[ 1 ] , chan_id_2) . get_stored_preimages( ) . contains_key( & payment_hash_2) ) ;
3464
3478
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3479
+ if completion_mode == BlockedUpdateComplMode :: AtReload {
3480
+ let node_ser = nodes[ 1 ] . node . encode ( ) ;
3481
+ let chan_mon_0 = get_monitor ! ( nodes[ 1 ] , chan_id_1) . encode ( ) ;
3482
+ let chan_mon_1 = get_monitor ! ( nodes[ 1 ] , chan_id_2) . encode ( ) ;
3483
+
3484
+ let mons = & [ & chan_mon_0[ ..] , & chan_mon_1[ ..] ] ;
3485
+ reload_node ! ( nodes[ 1 ] , & node_ser, mons, persister, new_chain_mon, nodes_1_reload) ;
3486
+
3487
+ nodes[ 0 ] . node . peer_disconnected ( node_b_id) ;
3488
+ nodes[ 2 ] . node . peer_disconnected ( node_b_id) ;
3489
+
3490
+ let mut a_b_reconnect = ReconnectArgs :: new ( & nodes[ 0 ] , & nodes[ 1 ] ) ;
3491
+ a_b_reconnect. pending_htlc_claims . 1 = 1 ;
3492
+ // Note that we will expect no final RAA monitor update in
3493
+ // `commitment_signed_dance_through_cp_raa` during the reconnect, matching the below case.
3494
+ reconnect_nodes ( a_b_reconnect) ;
3495
+ reconnect_nodes ( ReconnectArgs :: new ( & nodes[ 2 ] , & nodes[ 1 ] ) ) ;
3496
+ } else if completion_mode == BlockedUpdateComplMode :: Async {
3497
+ let ( latest_update, _) = get_latest_mon_update_id ( & nodes[ 1 ] , chan_id_2) ;
3498
+ nodes[ 1 ]
3499
+ . chain_monitor
3500
+ . chain_monitor
3501
+ . channel_monitor_updated ( chan_id_2, latest_update)
3502
+ . unwrap ( ) ;
3503
+ }
3465
3504
3466
3505
// Finish the CS dance between nodes[0] and nodes[1]. Note that until the event handling, the
3467
3506
// update_fulfill_htlc + CS is held, even though the preimage is already on disk for the
3468
3507
// channel.
3469
- nodes[ 1 ]
3470
- . node
3471
- . handle_commitment_signed_batch_test ( node_a_id, & as_htlc_fulfill_updates. commitment_signed ) ;
3472
- check_added_monitors ( & nodes[ 1 ] , 1 ) ;
3473
- let ( a, raa) = do_main_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 0 ] , false ) ;
3474
- assert ! ( a. is_none( ) ) ;
3508
+ // Note that when completing as a side effect of a reload we completed the CS dance in
3509
+ // `reconnect_nodes` above.
3510
+ if completion_mode != BlockedUpdateComplMode :: AtReload {
3511
+ nodes[ 1 ] . node . handle_commitment_signed_batch_test (
3512
+ node_a_id,
3513
+ & as_htlc_fulfill_updates. commitment_signed ,
3514
+ ) ;
3515
+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
3516
+ let ( a, raa) = do_main_commitment_signed_dance ( & nodes[ 1 ] , & nodes[ 0 ] , false ) ;
3517
+ assert ! ( a. is_none( ) ) ;
3475
3518
3476
- nodes[ 1 ] . node . handle_revoke_and_ack ( node_a_id, & raa) ;
3477
- check_added_monitors ( & nodes[ 1 ] , 0 ) ;
3478
- assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3519
+ nodes[ 1 ] . node . handle_revoke_and_ack ( node_a_id, & raa) ;
3520
+ check_added_monitors ( & nodes[ 1 ] , 0 ) ;
3521
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3522
+ }
3479
3523
3480
3524
let events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
3481
- assert_eq ! ( events. len( ) , 3 ) ;
3525
+ assert_eq ! ( events. len( ) , 3 , "{events:?}" ) ;
3482
3526
if let Event :: PaymentSent { .. } = events[ 0 ] {
3483
3527
} else {
3484
3528
panic ! ( ) ;
@@ -3508,6 +3552,13 @@ fn test_blocked_chan_preimage_release() {
3508
3552
expect_payment_sent ( & nodes[ 2 ] , payment_preimage_2, None , true , true ) ;
3509
3553
}
3510
3554
3555
+ #[ test]
3556
+ fn test_blocked_chan_preimage_release ( ) {
3557
+ do_test_blocked_chan_preimage_release ( BlockedUpdateComplMode :: AtReload ) ;
3558
+ do_test_blocked_chan_preimage_release ( BlockedUpdateComplMode :: Sync ) ;
3559
+ do_test_blocked_chan_preimage_release ( BlockedUpdateComplMode :: Async ) ;
3560
+ }
3561
+
3511
3562
fn do_test_inverted_mon_completion_order (
3512
3563
with_latest_manager : bool , complete_bc_commitment_dance : bool ,
3513
3564
) {
0 commit comments