@@ -2027,6 +2027,98 @@ fn test_path_paused_mpp() {
2027
2027
claim_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_preimage) ;
2028
2028
}
2029
2029
2030
+ fn do_update_fee_resend_test ( deliver_update : bool , parallel_updates : bool ) {
2031
+ // In early versions we did not handle resending of update_fee on reconnect correctly. The
2032
+ // chanmon_consistency fuzz target, of course, immediately found it, but we test a few cases
2033
+ // explicitly here.
2034
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2035
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2036
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
2037
+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2038
+
2039
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
2040
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000 ) ;
2041
+
2042
+ {
2043
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2044
+ * feerate_lock += 20 ;
2045
+ }
2046
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2047
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2048
+ let update_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2049
+ assert ! ( update_msgs. update_fee. is_some( ) ) ;
2050
+ if deliver_update {
2051
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2052
+ }
2053
+
2054
+ if parallel_updates {
2055
+ {
2056
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2057
+ * feerate_lock += 20 ;
2058
+ }
2059
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2060
+ assert ! ( nodes[ 0 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2061
+ }
2062
+
2063
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
2064
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
2065
+
2066
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2067
+ let as_connect_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2068
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2069
+ let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2070
+
2071
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2072
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2073
+
2074
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_connect_msg) ;
2075
+ let update_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2076
+ assert ! ( update_msgs. update_fee. is_some( ) ) ;
2077
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2078
+ if parallel_updates {
2079
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update_msgs. commitment_signed ) ;
2080
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2081
+ let ( bs_first_raa, bs_first_cs) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2082
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
2083
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2084
+ let as_second_update = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2085
+
2086
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_cs) ;
2087
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2088
+ let as_first_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2089
+
2090
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , as_second_update. update_fee . as_ref ( ) . unwrap ( ) ) ;
2091
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_update. commitment_signed ) ;
2092
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2093
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2094
+
2095
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
2096
+ let bs_second_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2097
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2098
+
2099
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) ;
2100
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2101
+
2102
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_cs. commitment_signed ) ;
2103
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2104
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2105
+
2106
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) ;
2107
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2108
+ } else {
2109
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , update_msgs. commitment_signed, false ) ;
2110
+ }
2111
+
2112
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000 ) ;
2113
+ }
2114
+ #[ test]
2115
+ fn update_fee_resend_test ( ) {
2116
+ do_update_fee_resend_test ( false , false ) ;
2117
+ do_update_fee_resend_test ( true , false ) ;
2118
+ do_update_fee_resend_test ( false , true ) ;
2119
+ do_update_fee_resend_test ( true , true ) ;
2120
+ }
2121
+
2030
2122
fn do_channel_holding_cell_serialize ( disconnect : bool , reload_a : bool ) {
2031
2123
// Tests that, when we serialize a channel with AddHTLC entries in the holding cell, we
2032
2124
// properly free them on reconnect. We previously failed such HTLCs upon serialization, but
0 commit comments