@@ -2054,6 +2054,98 @@ fn test_path_paused_mpp() {
2054
2054
claim_payment_along_route ( & nodes[ 0 ] , & [ & [ & nodes[ 1 ] , & nodes[ 3 ] ] , & [ & nodes[ 2 ] , & nodes[ 3 ] ] ] , false , payment_preimage) ;
2055
2055
}
2056
2056
2057
+ fn do_update_fee_resend_test ( deliver_update : bool , parallel_updates : bool ) {
2058
+ // In early versions we did not handle resending of update_fee on reconnect correctly. The
2059
+ // chanmon_consistency fuzz target, of course, immediately found it, but we test a few cases
2060
+ // explicitly here.
2061
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2062
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2063
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
2064
+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2065
+
2066
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
2067
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000 ) ;
2068
+
2069
+ {
2070
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2071
+ * feerate_lock += 20 ;
2072
+ }
2073
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2074
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
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
+ if deliver_update {
2078
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2079
+ }
2080
+
2081
+ if parallel_updates {
2082
+ {
2083
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2084
+ * feerate_lock += 20 ;
2085
+ }
2086
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2087
+ assert ! ( nodes[ 0 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2088
+ }
2089
+
2090
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
2091
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
2092
+
2093
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2094
+ let as_connect_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2095
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2096
+ let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2097
+
2098
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2099
+ assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2100
+
2101
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_connect_msg) ;
2102
+ let update_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2103
+ assert ! ( update_msgs. update_fee. is_some( ) ) ;
2104
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2105
+ if parallel_updates {
2106
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update_msgs. commitment_signed ) ;
2107
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2108
+ let ( bs_first_raa, bs_first_cs) = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2109
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
2110
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2111
+ let as_second_update = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2112
+
2113
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_cs) ;
2114
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2115
+ let as_first_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2116
+
2117
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , as_second_update. update_fee . as_ref ( ) . unwrap ( ) ) ;
2118
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_update. commitment_signed ) ;
2119
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2120
+ let bs_second_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2121
+
2122
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_first_raa) ;
2123
+ let bs_second_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2124
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2125
+
2126
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_raa) ;
2127
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2128
+
2129
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_cs. commitment_signed ) ;
2130
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2131
+ let as_second_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2132
+
2133
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_second_raa) ;
2134
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2135
+ } else {
2136
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , update_msgs. commitment_signed, false ) ;
2137
+ }
2138
+
2139
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 1000 ) ;
2140
+ }
2141
+ #[ test]
2142
+ fn update_fee_resend_test ( ) {
2143
+ do_update_fee_resend_test ( false , false ) ;
2144
+ do_update_fee_resend_test ( true , false ) ;
2145
+ do_update_fee_resend_test ( false , true ) ;
2146
+ do_update_fee_resend_test ( true , true ) ;
2147
+ }
2148
+
2057
2149
fn do_channel_holding_cell_serialize ( disconnect : bool , reload_a : bool ) {
2058
2150
// Tests that, when we serialize a channel with AddHTLC entries in the holding cell, we
2059
2151
// properly free them on reconnect. We previously failed such HTLCs upon serialization, but
0 commit comments