@@ -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 ona 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