@@ -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
+ #[ test]
2058
+ fn test_pending_update_fee_ack_on_reconnect ( ) {
2059
+ // In early versions of our automated fee update patch, nodes did not correctly use the
2060
+ // previous channel feerate after sending an undelivered revoke_and_ack when re-sending an
2061
+ // undelivered commitment_signed.
2062
+ //
2063
+ // B sends A new HTLC + CS, not delivered
2064
+ // A sends B update_fee + CS
2065
+ // B receives the CS and sends RAA, previously causing B to lock in the new feerate
2066
+ // reconnect
2067
+ // B resends initial CS, using the original fee
2068
+
2069
+ let chanmon_cfgs = create_chanmon_cfgs ( 2 ) ;
2070
+ let node_cfgs = create_node_cfgs ( 2 , & chanmon_cfgs) ;
2071
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
2072
+ let mut nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
2073
+
2074
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: known ( ) , InitFeatures :: known ( ) ) ;
2075
+ send_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , 100_000_00 ) ;
2076
+
2077
+ let ( payment_preimage, payment_hash, payment_secret) = get_payment_preimage_hash ! ( & nodes[ 0 ] ) ;
2078
+ let route = get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , & nodes[ 1 ] . net_graph_msg_handler . network_graph . read ( ) . unwrap ( ) ,
2079
+ & nodes[ 0 ] . node . get_our_node_id ( ) , Some ( InvoiceFeatures :: known ( ) ) , None , & Vec :: new ( ) , 1_000_000 , TEST_FINAL_CLTV , nodes[ 1 ] . logger ) . unwrap ( ) ;
2080
+ nodes[ 1 ] . node . send_payment ( & route, payment_hash, & Some ( payment_secret) ) . unwrap ( ) ;
2081
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2082
+ let bs_initial_send_msgs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2083
+ // bs_initial_send_msgs are not delivered until they are re-generated after reconnect
2084
+
2085
+ {
2086
+ let mut feerate_lock = chanmon_cfgs[ 0 ] . fee_estimator . sat_per_kw . lock ( ) . unwrap ( ) ;
2087
+ * feerate_lock *= 2 ;
2088
+ }
2089
+ nodes[ 0 ] . node . timer_tick_occurred ( ) ;
2090
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2091
+ let as_update_fee_msgs = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2092
+ assert ! ( as_update_fee_msgs. update_fee. is_some( ) ) ;
2093
+
2094
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , as_update_fee_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2095
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_update_fee_msgs. commitment_signed ) ;
2096
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2097
+ let bs_first_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2098
+ // bs_first_raa is not delivered until it is re-generated after reconnect
2099
+
2100
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
2101
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
2102
+
2103
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2104
+ let as_connect_msg = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2105
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) , & msgs:: Init { features : InitFeatures :: known ( ) } ) ;
2106
+ let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2107
+
2108
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2109
+ let bs_resend_msgs = nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
2110
+ assert_eq ! ( bs_resend_msgs. len( ) , 3 ) ;
2111
+ if let MessageSendEvent :: UpdateHTLCs { ref updates, .. } = bs_resend_msgs[ 0 ] {
2112
+ assert_eq ! ( * updates, bs_initial_send_msgs) ;
2113
+ } else { panic ! ( ) ; }
2114
+ if let MessageSendEvent :: SendRevokeAndACK { ref msg, .. } = bs_resend_msgs[ 1 ] {
2115
+ assert_eq ! ( * msg, bs_first_raa) ;
2116
+ } else { panic ! ( ) ; }
2117
+ if let MessageSendEvent :: SendChannelUpdate { .. } = bs_resend_msgs[ 2 ] { } else { panic ! ( ) ; }
2118
+
2119
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_connect_msg) ;
2120
+ get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 1 ] . node. get_our_node_id( ) ) ;
2121
+
2122
+ nodes[ 0 ] . node . handle_update_add_htlc ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_initial_send_msgs. update_add_htlcs [ 0 ] ) ;
2123
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_initial_send_msgs. commitment_signed ) ;
2124
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2125
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
2126
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2127
+ let bs_second_cs = get_htlc_update_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) . commitment_signed ;
2128
+
2129
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_first_raa) ;
2130
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2131
+ nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) . commitment_signed ) ;
2132
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2133
+ let bs_third_raa = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2134
+
2135
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_second_cs) ;
2136
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2137
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_third_raa) ;
2138
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
2139
+
2140
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ) ;
2141
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
2142
+
2143
+ expect_pending_htlcs_forwardable ! ( nodes[ 0 ] ) ;
2144
+ expect_payment_received ! ( nodes[ 0 ] , payment_hash, payment_secret, 1_000_000 ) ;
2145
+
2146
+ claim_payment ( & nodes[ 1 ] , & [ & nodes[ 0 ] ] , payment_preimage) ;
2147
+ }
2148
+
2057
2149
fn do_update_fee_resend_test ( deliver_update : bool , parallel_updates : bool ) {
2058
2150
// In early versions we did not handle resending of update_fee on reconnect correctly. The
2059
2151
// chanmon_consistency fuzz target, of course, immediately found it, but we test a few cases
@@ -2096,10 +2188,15 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
2096
2188
let bs_connect_msg = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2097
2189
2098
2190
nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_connect_msg) ;
2191
+ get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelUpdate , nodes[ 0 ] . node. get_our_node_id( ) ) ;
2099
2192
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
2100
2193
2101
2194
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( ) ) ;
2195
+ let mut as_reconnect_msgs = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
2196
+ assert_eq ! ( as_reconnect_msgs. len( ) , 2 ) ;
2197
+ if let MessageSendEvent :: SendChannelUpdate { .. } = as_reconnect_msgs. pop ( ) . unwrap ( ) { } else { panic ! ( ) ; }
2198
+ let update_msgs = if let MessageSendEvent :: UpdateHTLCs { updates, .. } = as_reconnect_msgs. pop ( ) . unwrap ( )
2199
+ { updates } else { panic ! ( ) ; } ;
2103
2200
assert ! ( update_msgs. update_fee. is_some( ) ) ;
2104
2201
nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msgs. update_fee . as_ref ( ) . unwrap ( ) ) ;
2105
2202
if parallel_updates {
0 commit comments