@@ -3421,8 +3421,7 @@ fn test_durable_preimages_on_closed_channel() {
3421
3421
do_test_durable_preimages_on_closed_channel ( false , false , false ) ;
3422
3422
}
3423
3423
3424
- #[ test]
3425
- fn test_reload_mon_update_completion_actions ( ) {
3424
+ fn do_test_reload_mon_update_completion_actions ( close_during_reload : bool ) {
3426
3425
// Test that if a `ChannelMonitorUpdate` completes but a `ChannelManager` isn't serialized
3427
3426
// before restart we run the monitor update completion action on startup.
3428
3427
let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
@@ -3481,12 +3480,32 @@ fn test_reload_mon_update_completion_actions() {
3481
3480
let manager_b = nodes[ 1 ] . node . encode ( ) ;
3482
3481
reload_node ! ( nodes[ 1 ] , & manager_b, & [ & mon_ab, & mon_bc] , persister, new_chain_monitor, nodes_1_deserialized) ;
3483
3482
3483
+ if close_during_reload {
3484
+ // Test that we still free the B<->C channel if the A<->B channel closed while we reloaded
3485
+ // (as learned about during the on-reload block connection).
3486
+ nodes[ 0 ] . node . force_close_broadcasting_latest_txn ( & chan_id_ab, & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
3487
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3488
+ check_closed_broadcast ! ( nodes[ 0 ] , true ) ;
3489
+ check_closed_event ( & nodes[ 0 ] , 1 , ClosureReason :: HolderForceClosed , false , & [ nodes[ 1 ] . node . get_our_node_id ( ) ] , 100_000 ) ;
3490
+ let as_closing_tx = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
3491
+ mine_transaction_without_checks ( & nodes[ 1 ] , & as_closing_tx[ 0 ] ) ;
3492
+ }
3493
+
3484
3494
let bc_update_id = nodes[ 1 ] . chain_monitor . latest_monitor_update_id . lock ( ) . unwrap ( ) . get ( & chan_id_bc) . unwrap ( ) . 2 ;
3485
- expect_payment_forwarded ! ( nodes[ 1 ] , nodes[ 0 ] , nodes[ 2 ] , Some ( 1000 ) , false , false ) ;
3495
+ let mut events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
3496
+ assert_eq ! ( events. len( ) , if close_during_reload { 2 } else { 1 } ) ;
3497
+ expect_payment_forwarded ( events. pop ( ) . unwrap ( ) , & nodes[ 1 ] , & nodes[ 0 ] , & nodes[ 2 ] , Some ( 1000 ) , close_during_reload, false ) ;
3498
+ if close_during_reload {
3499
+ match events[ 0 ] {
3500
+ Event :: ChannelClosed { .. } => { } ,
3501
+ _ => panic ! ( ) ,
3502
+ }
3503
+ check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
3504
+ }
3486
3505
3487
3506
// Once we run event processing the monitor should free, check that it was indeed the B<->C
3488
3507
// channel which was updated.
3489
- check_added_monitors ( & nodes[ 1 ] , 1 ) ;
3508
+ check_added_monitors ( & nodes[ 1 ] , if close_during_reload { 2 } else { 1 } ) ;
3490
3509
let post_ev_bc_update_id = nodes[ 1 ] . chain_monitor . latest_monitor_update_id . lock ( ) . unwrap ( ) . get ( & chan_id_bc) . unwrap ( ) . 2 ;
3491
3510
assert ! ( bc_update_id != post_ev_bc_update_id) ;
3492
3511
@@ -3496,3 +3515,9 @@ fn test_reload_mon_update_completion_actions() {
3496
3515
reconnect_nodes ( ReconnectArgs :: new ( & nodes[ 1 ] , & nodes[ 2 ] ) ) ;
3497
3516
send_payment ( & nodes[ 1 ] , & [ & nodes[ 2 ] ] , 100_000 ) ;
3498
3517
}
3518
+
3519
+ #[ test]
3520
+ fn test_reload_mon_update_completion_actions ( ) {
3521
+ do_test_reload_mon_update_completion_actions ( true ) ;
3522
+ do_test_reload_mon_update_completion_actions ( false ) ;
3523
+ }
0 commit comments