@@ -1215,3 +1215,63 @@ fn claim_while_disconnected_monitor_update_fail() {
1215
1215
1216
1216
claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_2) ;
1217
1217
}
1218
+
1219
+ #[ test]
1220
+ fn monitor_failed_no_reestablish_response ( ) {
1221
+ // Test for receiving a channel_reestablish after a monitor update failure resulted in no
1222
+ // response to a commitment_signed.
1223
+ // Backported from chanmon_fail_consistency fuzz tests as it caught a long-standing
1224
+ // debug_assert!() failure in channel_reestablish handling.
1225
+ let mut nodes = create_network ( 2 ) ;
1226
+ create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
1227
+
1228
+ // Route the payment and deliver the initial commitment_signed (with a monitor update failure
1229
+ // on receipt).
1230
+ let route = nodes[ 0 ] . router . get_route ( & nodes[ 1 ] . node . get_our_node_id ( ) , None , & Vec :: new ( ) , 1000000 , TEST_FINAL_CLTV ) . unwrap ( ) ;
1231
+ let ( payment_preimage_1, payment_hash_1) = get_payment_preimage_hash ! ( nodes[ 0 ] ) ;
1232
+ nodes[ 0 ] . node . send_payment ( route, payment_hash_1) . unwrap ( ) ;
1233
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
1234
+
1235
+ * nodes[ 1 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Err ( ChannelMonitorUpdateErr :: TemporaryFailure ) ;
1236
+ let mut events = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
1237
+ assert_eq ! ( events. len( ) , 1 ) ;
1238
+ let payment_event = SendEvent :: from_event ( events. pop ( ) . unwrap ( ) ) ;
1239
+ nodes[ 1 ] . node . handle_update_add_htlc ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. msgs [ 0 ] ) . unwrap ( ) ;
1240
+ if let msgs:: HandleError { err, action : Some ( msgs:: ErrorAction :: IgnoreError ) } = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & payment_event. commitment_msg ) . unwrap_err ( ) {
1241
+ assert_eq ! ( err, "Failed to update ChannelMonitor" ) ;
1242
+ } else { panic ! ( ) ; }
1243
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
1244
+
1245
+ // Now disconnect and immediately reconnect, delivering the channel_reestablish while nodes[1]
1246
+ // is still failing to update monitors.
1247
+ nodes[ 0 ] . node . peer_disconnected ( & nodes[ 1 ] . node . get_our_node_id ( ) , false ) ;
1248
+ nodes[ 1 ] . node . peer_disconnected ( & nodes[ 0 ] . node . get_our_node_id ( ) , false ) ;
1249
+
1250
+ nodes[ 0 ] . node . peer_connected ( & nodes[ 1 ] . node . get_our_node_id ( ) ) ;
1251
+ nodes[ 1 ] . node . peer_connected ( & nodes[ 0 ] . node . get_our_node_id ( ) ) ;
1252
+
1253
+ let as_reconnect = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1254
+ let bs_reconnect = get_event_msg ! ( nodes[ 1 ] , MessageSendEvent :: SendChannelReestablish , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1255
+
1256
+ nodes[ 1 ] . node . handle_channel_reestablish ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_reconnect) . unwrap ( ) ;
1257
+ nodes[ 0 ] . node . handle_channel_reestablish ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_reconnect) . unwrap ( ) ;
1258
+
1259
+ * nodes[ 1 ] . chan_monitor . update_ret . lock ( ) . unwrap ( ) = Ok ( ( ) ) ;
1260
+ nodes[ 1 ] . node . test_restore_channel_monitor ( ) ;
1261
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
1262
+ let bs_responses = get_revoke_commit_msgs ! ( nodes[ 1 ] , nodes[ 0 ] . node. get_our_node_id( ) ) ;
1263
+
1264
+ nodes[ 0 ] . node . handle_revoke_and_ack ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_responses. 0 ) . unwrap ( ) ;
1265
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
1266
+ nodes[ 0 ] . node . handle_commitment_signed ( & nodes[ 1 ] . node . get_our_node_id ( ) , & bs_responses. 1 ) . unwrap ( ) ;
1267
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
1268
+
1269
+ let as_raa = get_event_msg ! ( nodes[ 0 ] , MessageSendEvent :: SendRevokeAndACK , nodes[ 1 ] . node. get_our_node_id( ) ) ;
1270
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) , & as_raa) . unwrap ( ) ;
1271
+ check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
1272
+
1273
+ expect_pending_htlcs_forwardable ! ( nodes[ 1 ] ) ;
1274
+ expect_payment_received ! ( nodes[ 1 ] , payment_hash_1) ;
1275
+
1276
+ claim_payment ( & nodes[ 0 ] , & [ & nodes[ 1 ] ] , payment_preimage_1) ;
1277
+ }
0 commit comments