@@ -933,3 +933,72 @@ fn forwarded_payment_no_manager_persistence() {
933
933
do_forwarded_payment_no_manager_persistence ( true , false ) ;
934
934
do_forwarded_payment_no_manager_persistence ( false , false ) ;
935
935
}
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