@@ -3426,3 +3426,104 @@ fn test_durable_preimages_on_closed_channel() {
3426
3426
do_test_durable_preimages_on_closed_channel ( false , false , true ) ;
3427
3427
do_test_durable_preimages_on_closed_channel ( false , false , false ) ;
3428
3428
}
3429
+
3430
+ fn do_test_reload_mon_update_completion_actions ( close_during_reload : bool ) {
3431
+ // Test that if a `ChannelMonitorUpdate` completes but a `ChannelManager` isn't serialized
3432
+ // before restart we run the monitor update completion action on startup.
3433
+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
3434
+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
3435
+
3436
+ let persister;
3437
+ let new_chain_monitor;
3438
+ let nodes_1_deserialized;
3439
+
3440
+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
3441
+ let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
3442
+
3443
+ let chan_id_ab = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) . 2 ;
3444
+ let chan_id_bc = create_announced_chan_between_nodes ( & nodes, 1 , 2 ) . 2 ;
3445
+
3446
+ // Route a payment from A, through B, to C, then claim it on C. Once we pass B the
3447
+ // `update_fulfill_htlc` we have a monitor update for both of B's channels. We complete the
3448
+ // commitment signed dance on the B<->C channel but leave the A<->B monitor update pending,
3449
+ // then reload B. At that point, the final monitor update on the B<->C channel is still pending
3450
+ // because it can't fly until the preimage is persisted on the A<->B monitor.
3451
+ let ( payment_preimage, payment_hash, _) = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , 1_000_000 ) ;
3452
+
3453
+ nodes[ 2 ] . node . claim_funds ( payment_preimage) ;
3454
+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
3455
+ expect_payment_claimed ! ( nodes[ 2 ] , payment_hash, 1_000_000 ) ;
3456
+
3457
+ chanmon_cfgs[ 1 ] . persister . set_update_ret ( ChannelMonitorUpdateStatus :: InProgress ) ;
3458
+ let cs_updates = get_htlc_update_msgs ( & nodes[ 2 ] , & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
3459
+ nodes[ 1 ] . node . handle_update_fulfill_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , & cs_updates. update_fulfill_htlcs [ 0 ] ) ;
3460
+
3461
+ // B generates a new monitor update for the A <-> B channel, but doesn't send the new messages
3462
+ // for it since the monitor update is marked in-progress.
3463
+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
3464
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
3465
+
3466
+ // Now step the Commitment Signed Dance between B and C and check that after the final RAA B
3467
+ // doesn't let the preimage-removing monitor update fly.
3468
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 2 ] . node . get_our_node_id ( ) , & cs_updates. commitment_signed ) ;
3469
+ check_added_monitors ( & nodes[ 1 ] , 1 ) ;
3470
+ let ( bs_raa, bs_cs) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 2 ] . node. get_our_node_id( ) ) ;
3471
+
3472
+ nodes[ 2 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_raa) ;
3473
+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
3474
+ nodes[ 2 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_cs) ;
3475
+ check_added_monitors ( & nodes[ 2 ] , 1 ) ;
3476
+
3477
+ let cs_final_raa = get_event_msg ! ( nodes[ 2 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
3478
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 2 ] . node . get_our_node_id ( ) , & cs_final_raa) ;
3479
+ check_added_monitors ( & nodes[ 1 ] , 0 ) ;
3480
+
3481
+ // Finally, reload node B and check that after we call `process_pending_events` once we realize
3482
+ // we've completed the A<->B preimage-including monitor update and so can release the B<->C
3483
+ // preimage-removing monitor update.
3484
+ let mon_ab = get_monitor ! ( nodes[ 1 ] , chan_id_ab) . encode ( ) ;
3485
+ let mon_bc = get_monitor ! ( nodes[ 1 ] , chan_id_bc) . encode ( ) ;
3486
+ let manager_b = nodes[ 1 ] . node . encode ( ) ;
3487
+ reload_node ! ( nodes[ 1 ] , & manager_b, & [ & mon_ab, & mon_bc] , persister, new_chain_monitor, nodes_1_deserialized) ;
3488
+
3489
+ if close_during_reload {
3490
+ // Test that we still free the B<->C channel if the A<->B channel closed while we reloaded
3491
+ // (as learned about during the on-reload block connection).
3492
+ nodes[ 0 ] . node . force_close_broadcasting_latest_txn ( & chan_id_ab, & nodes[ 1 ] . node . get_our_node_id ( ) ) . unwrap ( ) ;
3493
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
3494
+ check_closed_broadcast ! ( nodes[ 0 ] , true ) ;
3495
+ check_closed_event ( & nodes[ 0 ] , 1 , ClosureReason :: HolderForceClosed , false , & [ nodes[ 1 ] . node . get_our_node_id ( ) ] , 100_000 ) ;
3496
+ let as_closing_tx = nodes[ 0 ] . tx_broadcaster . txn_broadcasted . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
3497
+ mine_transaction_without_consistency_checks ( & nodes[ 1 ] , & as_closing_tx[ 0 ] ) ;
3498
+ }
3499
+
3500
+ let bc_update_id = nodes[ 1 ] . chain_monitor . latest_monitor_update_id . lock ( ) . unwrap ( ) . get ( & chan_id_bc) . unwrap ( ) . 2 ;
3501
+ let mut events = nodes[ 1 ] . node . get_and_clear_pending_events ( ) ;
3502
+ assert_eq ! ( events. len( ) , if close_during_reload { 2 } else { 1 } ) ;
3503
+ expect_payment_forwarded ( events. pop ( ) . unwrap ( ) , & nodes[ 1 ] , & nodes[ 0 ] , & nodes[ 2 ] , Some ( 1000 ) , close_during_reload, false ) ;
3504
+ if close_during_reload {
3505
+ match events[ 0 ] {
3506
+ Event :: ChannelClosed { .. } => { } ,
3507
+ _ => panic ! ( ) ,
3508
+ }
3509
+ check_closed_broadcast ! ( nodes[ 1 ] , true ) ;
3510
+ }
3511
+
3512
+ // Once we run event processing the monitor should free, check that it was indeed the B<->C
3513
+ // channel which was updated.
3514
+ check_added_monitors ( & nodes[ 1 ] , if close_during_reload { 2 } else { 1 } ) ;
3515
+ let post_ev_bc_update_id = nodes[ 1 ] . chain_monitor . latest_monitor_update_id . lock ( ) . unwrap ( ) . get ( & chan_id_bc) . unwrap ( ) . 2 ;
3516
+ assert ! ( bc_update_id != post_ev_bc_update_id) ;
3517
+
3518
+ // Finally, check that there's nothing left to do on B<->C reconnect and the channel operates
3519
+ // fine.
3520
+ nodes[ 2 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
3521
+ reconnect_nodes ( ReconnectArgs :: new ( & nodes[ 1 ] , & nodes[ 2 ] ) ) ;
3522
+ send_payment ( & nodes[ 1 ] , & [ & nodes[ 2 ] ] , 100_000 ) ;
3523
+ }
3524
+
3525
+ #[ test]
3526
+ fn test_reload_mon_update_completion_actions ( ) {
3527
+ do_test_reload_mon_update_completion_actions ( true ) ;
3528
+ do_test_reload_mon_update_completion_actions ( false ) ;
3529
+ }
0 commit comments