@@ -3859,13 +3859,13 @@ where
38593859 }
38603860 } ;
38613861
3862- if let None = per_peer_state. get ( & counterparty_node_id) {
3862+ let peer_state_mutex_opt = per_peer_state. get ( & counterparty_node_id) ;
3863+ if let None = peer_state_mutex_opt {
38633864 valid_mpp = false ;
38643865 break ;
38653866 }
38663867
3867- let peer_state_mutex = per_peer_state. get ( & counterparty_node_id) . unwrap ( ) ;
3868- let mut peer_state_lock = peer_state_mutex. lock ( ) . unwrap ( ) ;
3868+ let mut peer_state_lock = peer_state_mutex_opt. unwrap ( ) . lock ( ) . unwrap ( ) ;
38693869 let peer_state = & mut * peer_state_lock;
38703870
38713871 if let None = peer_state. channel_by_id . get ( & chan_id) {
@@ -3952,83 +3952,76 @@ where
39523952 None => None
39533953 } ;
39543954
3955- let ( found_channel, mut peer_state_opt) = if counterparty_node_id_opt. is_some ( ) && per_peer_state. get ( & counterparty_node_id_opt. unwrap ( ) ) . is_some ( ) {
3956- let peer_mutex = per_peer_state. get ( & counterparty_node_id_opt. unwrap ( ) ) . unwrap ( ) ;
3957- let peer_state = peer_mutex. lock ( ) . unwrap ( ) ;
3958- let found_channel = peer_state. channel_by_id . contains_key ( & chan_id) ;
3959- ( found_channel, Some ( peer_state) )
3960- } else { ( false , None ) } ;
3961-
3962- if found_channel {
3963- let peer_state = & mut * peer_state_opt. as_mut ( ) . unwrap ( ) ;
3964- if let hash_map:: Entry :: Occupied ( mut chan) = peer_state. channel_by_id . entry ( chan_id) {
3965- let counterparty_node_id = chan. get ( ) . get_counterparty_node_id ( ) ;
3966- match chan. get_mut ( ) . get_update_fulfill_htlc_and_commit ( prev_hop. htlc_id , payment_preimage, & self . logger ) {
3967- Ok ( msgs_monitor_option) => {
3968- if let UpdateFulfillCommitFetch :: NewClaim { msgs, htlc_value_msat, monitor_update } = msgs_monitor_option {
3969- match self . chain_monitor . update_channel ( chan. get ( ) . get_funding_txo ( ) . unwrap ( ) , & monitor_update) {
3970- ChannelMonitorUpdateStatus :: Completed => { } ,
3971- e => {
3972- log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
3973- "Failed to update channel monitor with preimage {:?}: {:?}" ,
3974- payment_preimage, e) ;
3975- let err = handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ;
3976- mem:: drop ( peer_state_opt) ;
3977- mem:: drop ( per_peer_state) ;
3978- self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
3979- return Err ( ( counterparty_node_id, err) ) ;
3980- }
3981- }
3982- if let Some ( ( msg, commitment_signed) ) = msgs {
3983- log_debug ! ( self . logger, "Claiming funds for HTLC with preimage {} resulted in a commitment_signed for channel {}" ,
3984- log_bytes!( payment_preimage. 0 ) , log_bytes!( chan. get( ) . channel_id( ) ) ) ;
3985- peer_state. pending_msg_events . push ( events:: MessageSendEvent :: UpdateHTLCs {
3986- node_id : counterparty_node_id,
3987- updates : msgs:: CommitmentUpdate {
3988- update_add_htlcs : Vec :: new ( ) ,
3989- update_fulfill_htlcs : vec ! [ msg] ,
3990- update_fail_htlcs : Vec :: new ( ) ,
3991- update_fail_malformed_htlcs : Vec :: new ( ) ,
3992- update_fee : None ,
3993- commitment_signed,
3994- }
3995- } ) ;
3996- }
3997- mem:: drop ( peer_state_opt) ;
3998- mem:: drop ( per_peer_state) ;
3999- self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
4000- Ok ( ( ) )
4001- } else {
4002- Ok ( ( ) )
4003- }
4004- } ,
4005- Err ( ( e, monitor_update) ) => {
3955+ let mut peer_state_opt = counterparty_node_id_opt. as_ref ( ) . map (
3956+ |counterparty_node_id| per_peer_state. get ( counterparty_node_id) . map (
3957+ |peer_mutex| peer_mutex. lock ( ) . unwrap ( )
3958+ )
3959+ ) . unwrap_or ( None ) ;
3960+
3961+ if let Some ( hash_map:: Entry :: Occupied ( mut chan) ) = peer_state_opt. as_mut ( ) . map ( |peer_state| peer_state. channel_by_id . entry ( chan_id) )
3962+ {
3963+ let counterparty_node_id = chan. get ( ) . get_counterparty_node_id ( ) ;
3964+ match chan. get_mut ( ) . get_update_fulfill_htlc_and_commit ( prev_hop. htlc_id , payment_preimage, & self . logger ) {
3965+ Ok ( msgs_monitor_option) => {
3966+ if let UpdateFulfillCommitFetch :: NewClaim { msgs, htlc_value_msat, monitor_update } = msgs_monitor_option {
40063967 match self . chain_monitor . update_channel ( chan. get ( ) . get_funding_txo ( ) . unwrap ( ) , & monitor_update) {
40073968 ChannelMonitorUpdateStatus :: Completed => { } ,
40083969 e => {
4009- // TODO: This needs to be handled somehow - if we receive a monitor update
4010- // with a preimage we *must* somehow manage to propagate it to the upstream
4011- // channel, or we must have an ability to receive the same update and try
4012- // again on restart.
4013- log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Info } ,
4014- "Failed to update channel monitor with preimage {:?} immediately prior to force-close: {:?}" ,
3970+ log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Debug } ,
3971+ "Failed to update channel monitor with preimage {:?}: {:?}" ,
40153972 payment_preimage, e) ;
4016- } ,
3973+ let err = handle_monitor_update_res ! ( self , e, chan, RAACommitmentOrder :: CommitmentFirst , false , msgs. is_some( ) ) . unwrap_err ( ) ;
3974+ mem:: drop ( peer_state_opt) ;
3975+ mem:: drop ( per_peer_state) ;
3976+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
3977+ return Err ( ( counterparty_node_id, err) ) ;
3978+ }
40173979 }
4018- let ( drop, res) = convert_chan_err ! ( self , e, chan. get_mut( ) , & chan_id) ;
4019- if drop {
4020- chan. remove_entry ( ) ;
3980+ if let Some ( ( msg, commitment_signed) ) = msgs {
3981+ log_debug ! ( self . logger, "Claiming funds for HTLC with preimage {} resulted in a commitment_signed for channel {}" ,
3982+ log_bytes!( payment_preimage. 0 ) , log_bytes!( chan. get( ) . channel_id( ) ) ) ;
3983+ peer_state_opt. as_mut ( ) . unwrap ( ) . pending_msg_events . push ( events:: MessageSendEvent :: UpdateHTLCs {
3984+ node_id : counterparty_node_id,
3985+ updates : msgs:: CommitmentUpdate {
3986+ update_add_htlcs : Vec :: new ( ) ,
3987+ update_fulfill_htlcs : vec ! [ msg] ,
3988+ update_fail_htlcs : Vec :: new ( ) ,
3989+ update_fail_malformed_htlcs : Vec :: new ( ) ,
3990+ update_fee : None ,
3991+ commitment_signed,
3992+ }
3993+ } ) ;
40213994 }
40223995 mem:: drop ( peer_state_opt) ;
40233996 mem:: drop ( per_peer_state) ;
4024- self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4025- Err ( ( counterparty_node_id, res) )
4026- } ,
4027- }
4028- } else {
4029- // We've held the peer_state mutex since finding the channel and setting
4030- // found_channel to true, so the channel can't have been dropped.
4031- unreachable ! ( )
3997+ self . handle_monitor_update_completion_actions ( completion_action ( Some ( htlc_value_msat) ) ) ;
3998+ Ok ( ( ) )
3999+ } else {
4000+ Ok ( ( ) )
4001+ }
4002+ } ,
4003+ Err ( ( e, monitor_update) ) => {
4004+ match self . chain_monitor . update_channel ( chan. get ( ) . get_funding_txo ( ) . unwrap ( ) , & monitor_update) {
4005+ ChannelMonitorUpdateStatus :: Completed => { } ,
4006+ e => {
4007+ // TODO: This needs to be handled somehow - if we receive a monitor update
4008+ // with a preimage we *must* somehow manage to propagate it to the upstream
4009+ // channel, or we must have an ability to receive the same update and try
4010+ // again on restart.
4011+ log_given_level ! ( self . logger, if e == ChannelMonitorUpdateStatus :: PermanentFailure { Level :: Error } else { Level :: Info } ,
4012+ "Failed to update channel monitor with preimage {:?} immediately prior to force-close: {:?}" ,
4013+ payment_preimage, e) ;
4014+ } ,
4015+ }
4016+ let ( drop, res) = convert_chan_err ! ( self , e, chan. get_mut( ) , & chan_id) ;
4017+ if drop {
4018+ chan. remove_entry ( ) ;
4019+ }
4020+ mem:: drop ( peer_state_opt) ;
4021+ mem:: drop ( per_peer_state) ;
4022+ self . handle_monitor_update_completion_actions ( completion_action ( None ) ) ;
4023+ Err ( ( counterparty_node_id, res) )
4024+ } ,
40324025 }
40334026 } else {
40344027 let preimage_update = ChannelMonitorUpdate {
0 commit comments