@@ -3968,6 +3968,7 @@ where
39683968 }
39693969 }
39703970
3971+ /// Handles an error by closing the channel if required and generating peer messages.
39713972 fn handle_error<A>(
39723973 &self, internal: Result<A, MsgHandleErrInternal>, counterparty_node_id: PublicKey,
39733974 ) -> Result<A, LightningError> {
@@ -3976,64 +3977,61 @@ where
39763977 debug_assert_ne!(self.pending_events.held_by_thread(), LockHeldState::HeldByThread);
39773978 debug_assert_ne!(self.per_peer_state.held_by_thread(), LockHeldState::HeldByThread);
39783979
3979- match internal {
3980- Ok(msg) => Ok(msg),
3981- Err(MsgHandleErrInternal { err, shutdown_finish, tx_abort, .. }) => {
3982- let mut msg_event = None;
3980+ internal.map_err(|err_internal| {
3981+ let mut msg_event = None;
39833982
3984- if let Some((shutdown_res, update_option)) = shutdown_finish {
3985- let counterparty_node_id = shutdown_res.counterparty_node_id;
3986- let channel_id = shutdown_res.channel_id;
3987- let logger = WithContext::from(
3988- &self.logger,
3989- Some(counterparty_node_id),
3990- Some(channel_id),
3991- None,
3992- );
3993- log_error!(logger, "Closing channel: {}", err.err);
3994-
3995- self.finish_close_channel(shutdown_res);
3996- if let Some((update, node_id_1, node_id_2)) = update_option {
3997- let mut pending_broadcast_messages =
3998- self.pending_broadcast_messages.lock().unwrap();
3999- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
4000- msg: update,
4001- node_id_1,
4002- node_id_2,
4003- });
4004- }
4005- } else {
4006- log_error!(self.logger, "Got non-closing error: {}", err.err);
3983+ if let Some((shutdown_res, update_option)) = err_internal.shutdown_finish {
3984+ let counterparty_node_id = shutdown_res.counterparty_node_id;
3985+ let channel_id = shutdown_res.channel_id;
3986+ let logger = WithContext::from(
3987+ &self.logger,
3988+ Some(counterparty_node_id),
3989+ Some(channel_id),
3990+ None,
3991+ );
3992+ log_error!(logger, "Closing channel: {}", err_internal.err.err);
3993+
3994+ self.finish_close_channel(shutdown_res);
3995+ if let Some((update, node_id_1, node_id_2)) = update_option {
3996+ let mut pending_broadcast_messages =
3997+ self.pending_broadcast_messages.lock().unwrap();
3998+ pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
3999+ msg: update,
4000+ node_id_1,
4001+ node_id_2,
4002+ });
40074003 }
4004+ } else {
4005+ log_error!(self.logger, "Got non-closing error: {}", err_internal.err.err);
4006+ }
40084007
4009- if let msgs::ErrorAction::IgnoreError = err.action {
4010- if let Some(tx_abort) = tx_abort {
4011- msg_event = Some(MessageSendEvent::SendTxAbort {
4012- node_id: counterparty_node_id,
4013- msg: tx_abort,
4014- });
4015- }
4016- } else {
4017- msg_event = Some(MessageSendEvent::HandleError {
4008+ if let msgs::ErrorAction::IgnoreError = err_internal.err.action {
4009+ if let Some(tx_abort) = err_internal.tx_abort {
4010+ msg_event = Some(MessageSendEvent::SendTxAbort {
40184011 node_id: counterparty_node_id,
4019- action: err.action.clone() ,
4012+ msg: tx_abort ,
40204013 });
40214014 }
4015+ } else {
4016+ msg_event = Some(MessageSendEvent::HandleError {
4017+ node_id: counterparty_node_id,
4018+ action: err_internal.err.action.clone(),
4019+ });
4020+ }
40224021
4023- if let Some(msg_event) = msg_event {
4024- let per_peer_state = self.per_peer_state.read().unwrap();
4025- if let Some(peer_state_mutex) = per_peer_state.get(&counterparty_node_id) {
4026- let mut peer_state = peer_state_mutex.lock().unwrap();
4027- if peer_state.is_connected {
4028- peer_state.pending_msg_events.push(msg_event);
4029- }
4022+ if let Some(msg_event) = msg_event {
4023+ let per_peer_state = self.per_peer_state.read().unwrap();
4024+ if let Some(peer_state_mutex) = per_peer_state.get(&counterparty_node_id) {
4025+ let mut peer_state = peer_state_mutex.lock().unwrap();
4026+ if peer_state.is_connected {
4027+ peer_state.pending_msg_events.push(msg_event);
40304028 }
40314029 }
4030+ }
40324031
4033- // Return error in case higher-API need one
4034- Err(err)
4035- },
4036- }
4032+ // Return error in case higher-API need one
4033+ err_internal.err
4034+ })
40374035 }
40384036
40394037 /// Gets the current [`UserConfig`] which controls some global behavior and includes the
0 commit comments