@@ -933,3 +933,72 @@ fn forwarded_payment_no_manager_persistence() {
933933 do_forwarded_payment_no_manager_persistence ( true , false ) ;
934934 do_forwarded_payment_no_manager_persistence ( false , false ) ;
935935}
936+
937+ #[ test]
938+ fn removed_payment_no_manager_persistence ( ) {
939+ // If an HTLC is failed to us on a channel, and the ChannelMonitor persistence completes, but
940+ // the corresponding ChannelManager persistence does not, we need to ensure that the HTLC is
941+ // still failed back to the previous hop even though the ChannelMonitor now no longer is aware
942+ // of the HTLC. This was previously broken as no attempt was made to figure out which HTLCs
943+ // were left dangling when a channel was force-closed due to a stale ChannelManager.
944+ let chanmon_cfgs = create_chanmon_cfgs ( 3 ) ;
945+ let node_cfgs = create_node_cfgs ( 3 , & chanmon_cfgs) ;
946+ let node_chanmgrs = create_node_chanmgrs ( 3 , & node_cfgs, & [ None , None , None ] ) ;
947+
948+ let persister;
949+ let new_chain_monitor;
950+ let nodes_1_deserialized;
951+
952+ let mut nodes = create_network ( 3 , & node_cfgs, & node_chanmgrs) ;
953+
954+ let chan_id_1 = create_announced_chan_between_nodes ( & nodes, 0 , 1 , channelmanager:: provided_init_features ( ) , channelmanager:: provided_init_features ( ) ) . 2 ;
955+ let chan_id_2 = create_announced_chan_between_nodes ( & nodes, 1 , 2 , channelmanager:: provided_init_features ( ) , channelmanager:: provided_init_features ( ) ) . 2 ;
956+
957+ let ( _, payment_hash, _) = route_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] , & nodes[ 2 ] ] , 1_000_000 ) ;
958+
959+ let node_encoded = nodes[ 1 ] . node . encode ( ) ;
960+
961+ nodes[ 2 ] . node . fail_htlc_backwards ( & payment_hash) ;
962+ expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( nodes[ 2 ] , [ HTLCDestination :: FailedPayment { payment_hash } ] ) ;
963+ check_added_monitors ! ( nodes[ 2 ] , 1 ) ;
964+ let events = nodes[ 2 ] . node . get_and_clear_pending_msg_events ( ) ;
965+ assert_eq ! ( events. len( ) , 1 ) ;
966+ match & events[ 0 ] {
967+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { update_fail_htlcs, commitment_signed, .. } , .. } => {
968+ nodes[ 1 ] . node . handle_update_fail_htlc ( & nodes[ 2 ] . node . get_our_node_id ( ) , & update_fail_htlcs[ 0 ] ) ;
969+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 2 ] , commitment_signed, false ) ;
970+ } ,
971+ _ => panic ! ( "Unexpected event" ) ,
972+ }
973+
974+ let chan_0_monitor_serialized = get_monitor ! ( nodes[ 1 ] , chan_id_1) . encode ( ) ;
975+ let chan_1_monitor_serialized = get_monitor ! ( nodes[ 1 ] , chan_id_2) . encode ( ) ;
976+ reload_node ! ( nodes[ 1 ] , node_encoded, & [ & chan_0_monitor_serialized, & chan_1_monitor_serialized] , persister, new_chain_monitor, nodes_1_deserialized) ;
977+
978+ match nodes[ 1 ] . node . pop_pending_event ( ) . unwrap ( ) {
979+ Event :: ChannelClosed { ref reason, .. } => {
980+ assert_eq ! ( * reason, ClosureReason :: OutdatedChannelManager ) ;
981+ } ,
982+ _ => panic ! ( "Unexpected event" ) ,
983+ }
984+
985+ // Now that the ChannelManager has force-closed the channel which had the HTLC removed, it is
986+ // now forgotten everywhere. The ChannelManager should have, as a side-effect of reload,
987+ // learned that the HTLC is gone from the ChannelMonitor and added it to the to-fail-back set.
988+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , true ) ;
989+ reconnect_nodes ( & nodes[ 0 ] , & nodes[ 1 ] , ( false , false ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( 0 , 0 ) , ( false , false ) ) ;
990+
991+ expect_pending_htlcs_forwardable_and_htlc_handling_failed ! ( nodes[ 1 ] , [ HTLCDestination :: NextHopChannel { node_id: Some ( nodes[ 2 ] . node. get_our_node_id( ) ) , channel_id: chan_id_2 } ] ) ;
992+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
993+ let events = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
994+ assert_eq ! ( events. len( ) , 1 ) ;
995+ match & events[ 0 ] {
996+ MessageSendEvent :: UpdateHTLCs { updates : msgs:: CommitmentUpdate { update_fail_htlcs, commitment_signed, .. } , .. } => {
997+ nodes[ 0 ] . node . handle_update_fail_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & update_fail_htlcs[ 0 ] ) ;
998+ commitment_signed_dance ! ( nodes[ 0 ] , nodes[ 1 ] , commitment_signed, false ) ;
999+ } ,
1000+ _ => panic ! ( "Unexpected event" ) ,
1001+ }
1002+
1003+ expect_payment_failed ! ( nodes[ 0 ] , payment_hash, false ) ;
1004+ }
0 commit comments