@@ -3859,13 +3859,13 @@ where
3859
3859
}
3860
3860
} ;
3861
3861
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 {
3863
3864
valid_mpp = false ;
3864
3865
break ;
3865
3866
}
3866
3867
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 ( ) ;
3869
3869
let peer_state = & mut * peer_state_lock;
3870
3870
3871
3871
if let None = peer_state. channel_by_id . get ( & chan_id) {
@@ -3952,83 +3952,76 @@ where
3952
3952
None => None
3953
3953
} ;
3954
3954
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 {
4006
3967
match self . chain_monitor . update_channel ( chan. get ( ) . get_funding_txo ( ) . unwrap ( ) , & monitor_update) {
4007
3968
ChannelMonitorUpdateStatus :: Completed => { } ,
4008
3969
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 {:?}: {:?}" ,
4015
3972
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
+ }
4017
3979
}
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
+ } ) ;
4021
3994
}
4022
3995
mem:: drop ( peer_state_opt) ;
4023
3996
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
+ } ,
4032
4025
}
4033
4026
} else {
4034
4027
let preimage_update = ChannelMonitorUpdate {
0 commit comments