@@ -3071,7 +3071,7 @@ macro_rules! handle_error {
3071
3071
let logger = WithContext::from(
3072
3072
&$self.logger, Some(counterparty_node_id), Some(channel_id), None
3073
3073
);
3074
- log_error!(logger, "Force-closing channel: {}", err.err);
3074
+ log_error!(logger, "Closing channel: {}", err.err);
3075
3075
3076
3076
$self.finish_close_channel(shutdown_res);
3077
3077
if let Some(update) = update_option {
@@ -3194,6 +3194,23 @@ macro_rules! convert_channel_err {
3194
3194
},
3195
3195
}
3196
3196
};
3197
+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3198
+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3199
+ let do_close = |_| {
3200
+ (
3201
+ $shutdown_result,
3202
+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3203
+ )
3204
+ };
3205
+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3206
+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3207
+ };
3208
+ let (close, mut err) =
3209
+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3210
+ err.dont_send_error_message();
3211
+ debug_assert!(close);
3212
+ err
3213
+ } };
3197
3214
($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
3198
3215
let mut do_close = |reason| {
3199
3216
(
@@ -9759,13 +9776,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9759
9776
msg.channel_id,
9760
9777
)
9761
9778
})?;
9762
- let (tx, chan_option, shutdown_result) = {
9779
+ let logger;
9780
+ let tx_err: Option<(_, Result<Infallible, _>)> = {
9763
9781
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
9764
9782
let peer_state = &mut *peer_state_lock;
9765
9783
match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
9766
9784
hash_map::Entry::Occupied(mut chan_entry) => {
9767
9785
if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9768
- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9786
+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
9769
9787
let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
9770
9788
let (closing_signed, tx_shutdown_result) =
9771
9789
try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9776,16 +9794,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9776
9794
msg,
9777
9795
});
9778
9796
}
9779
- if let Some((tx, mut close_res)) = tx_shutdown_result {
9797
+ if let Some((tx, close_res)) = tx_shutdown_result {
9780
9798
// We're done with this channel, we've got a signed closing transaction and
9781
9799
// will send the closing_signed back to the remote peer upon return. This
9782
9800
// also implies there are no pending HTLCs left on the channel, so we can
9783
9801
// fully delete it from tracking (the channel monitor is still around to
9784
9802
// watch for old state broadcasts)!
9785
- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9786
- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9803
+ let err = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9804
+ chan_entry.remove();
9805
+ Some((tx, Err(err)))
9787
9806
} else {
9788
- ( None, None, None)
9807
+ None
9789
9808
}
9790
9809
} else {
9791
9810
return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9795,26 +9814,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9795
9814
hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close(format!("Got a message for a channel from the wrong node! No such channel for the passed counterparty_node_id {}", counterparty_node_id), msg.channel_id))
9796
9815
}
9797
9816
};
9798
- if let Some(broadcast_tx) = tx {
9799
- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9800
- log_info!(
9801
- WithContext::from(&self.logger, Some(*counterparty_node_id), channel_id, None),
9802
- "Broadcasting {}",
9803
- log_tx!(broadcast_tx)
9804
- );
9805
- self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9806
- }
9807
- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9808
- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9809
- let mut pending_broadcast_messages =
9810
- self.pending_broadcast_messages.lock().unwrap();
9811
- pending_broadcast_messages
9812
- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9813
- }
9814
- }
9815
9817
mem::drop(per_peer_state);
9816
- if let Some(shutdown_result) = shutdown_result {
9817
- self.finish_close_channel(shutdown_result);
9818
+ if let Some((broadcast_tx, err)) = tx_err {
9819
+ log_info!(logger, "Broadcasting {}", log_tx!(broadcast_tx));
9820
+ self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9821
+ let _ = handle_error!(self, err, *counterparty_node_id);
9818
9822
}
9819
9823
Ok(())
9820
9824
}
@@ -11060,12 +11064,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11060
11064
if let Some(broadcast_tx) = msgs.signed_closing_tx {
11061
11065
log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
11062
11066
self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
11063
-
11064
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11065
- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
11066
- msg: update
11067
- });
11068
- }
11069
11067
}
11070
11068
} else {
11071
11069
// We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -11079,40 +11077,46 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11079
11077
}
11080
11078
};
11081
11079
11082
- let mut shutdown_results = Vec::new();
11080
+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
11083
11081
let per_peer_state = self.per_peer_state.read().unwrap();
11084
11082
let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
11085
11083
if let Some((counterparty_node_id, _)) = channel_opt {
11086
11084
**cp_id == counterparty_node_id
11087
11085
} else { true }
11088
11086
});
11089
- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
11087
+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
11090
11088
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
11091
11089
let peer_state = &mut *peer_state_lock;
11092
11090
peer_state.channel_by_id.retain(|_, chan| {
11093
11091
let shutdown_result = match channel_opt {
11094
11092
Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
11095
11093
_ => unblock_chan(chan, &mut peer_state.pending_msg_events),
11096
11094
};
11097
- if let Some(mut shutdown_result ) = shutdown_result {
11095
+ if let Some(shutdown ) = shutdown_result {
11098
11096
let context = chan.context();
11099
11097
let logger = WithChannelContext::from(&self.logger, context, None);
11100
- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
11101
- if let Some(funded_channel) = chan.as_funded_mut() {
11102
- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
11098
+ let chan_id = context.channel_id();
11099
+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
11100
+ let (remove, err) = if let Some(funded) = chan.as_funded_mut() {
11101
+ let err = convert_channel_err!(self, peer_state, shutdown, funded, &chan_id, COOP_CLOSED);
11102
+ (true, err)
11103
11103
} else {
11104
- locked_close_channel!(self, chan.context(), UNFUNDED);
11105
- }
11106
- shutdown_results.push(shutdown_result);
11104
+ debug_assert!(false);
11105
+ let reason = shutdown.closure_reason.clone();
11106
+ let err = ChannelError::Close((reason.to_string(), reason));
11107
+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
11108
+ };
11109
+ debug_assert!(remove);
11110
+ shutdown_results.push((Err(err), *cp_id));
11107
11111
false
11108
11112
} else {
11109
11113
true
11110
11114
}
11111
11115
});
11112
11116
}
11113
11117
drop(per_peer_state);
11114
- for shutdown_result in shutdown_results.drain(..) {
11115
- self.finish_close_channel(shutdown_result );
11118
+ for (err, counterparty_node_id) in shutdown_results {
11119
+ let _ = handle_error!(self, err, counterparty_node_id );
11116
11120
}
11117
11121
}
11118
11122
@@ -11123,11 +11127,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11123
11127
fn maybe_generate_initial_closing_signed(&self) -> bool {
11124
11128
let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
11125
11129
let mut has_update = false;
11126
- let mut shutdown_results = Vec::new();
11127
11130
{
11128
11131
let per_peer_state = self.per_peer_state.read().unwrap();
11129
11132
11130
- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
11133
+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
11131
11134
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
11132
11135
let peer_state = &mut *peer_state_lock;
11133
11136
let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -11144,17 +11147,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11144
11147
});
11145
11148
}
11146
11149
debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
11147
- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
11148
- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
11149
- shutdown_results.push(shutdown_res);
11150
+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
11150
11151
// We're done with this channel. We got a closing_signed and sent back
11151
11152
// a closing_signed with a closing transaction to broadcast.
11152
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
11153
- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
11154
- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
11155
- msg: update
11156
- });
11157
- }
11153
+ let err = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
11154
+ handle_errors.push((*cp_id, Err(err)));
11158
11155
11159
11156
log_info!(logger, "Broadcasting {}", log_tx!(tx));
11160
11157
self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -11175,14 +11172,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
11175
11172
}
11176
11173
}
11177
11174
11178
- for (counterparty_node_id, err) in handle_errors.drain(..) {
11175
+ for (counterparty_node_id, err) in handle_errors {
11179
11176
let _ = handle_error!(self, err, counterparty_node_id);
11180
11177
}
11181
11178
11182
- for shutdown_result in shutdown_results.drain(..) {
11183
- self.finish_close_channel(shutdown_result);
11184
- }
11185
-
11186
11179
has_update
11187
11180
}
11188
11181
0 commit comments