Skip to content

Commit fefb7b1

Browse files
committed
Drop the remaining direct uses of locked_close_channel
While most of our closure logic mostly lives in `locked_close_chan`, some important steps happen in `convert_channel_err` and `handle_error` (mostly broadcasting a channel closure `ChannelUpdate` and sending a relevant error message to our peer). In a previous commit we removed most instances of `locked_close_channel` in our closure pipeline, however it was still called in cases where we did a cooperative close. Here we remove the remaining direct references to it, always using `convert_channel_err` instead (now with a new `COOP_CLOSED` macro variant).
1 parent 8791605 commit fefb7b1

File tree

1 file changed

+52
-59
lines changed

1 file changed

+52
-59
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 52 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -3071,7 +3071,7 @@ macro_rules! handle_error {
30713071
let logger = WithContext::from(
30723072
&$self.logger, Some(counterparty_node_id), Some(channel_id), None
30733073
);
3074-
log_error!(logger, "Force-closing channel: {}", err.err);
3074+
log_error!(logger, "Closing channel: {}", err.err);
30753075

30763076
$self.finish_close_channel(shutdown_res);
30773077
if let Some(update) = update_option {
@@ -3194,6 +3194,23 @@ macro_rules! convert_channel_err {
31943194
},
31953195
}
31963196
};
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+
} };
31973214
($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
31983215
let mut do_close = |reason| {
31993216
(
@@ -9759,13 +9776,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
97599776
msg.channel_id,
97609777
)
97619778
})?;
9762-
let (tx, chan_option, shutdown_result) = {
9779+
let logger;
9780+
let tx_err: Option<(_, Result<Infallible, _>)> = {
97639781
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
97649782
let peer_state = &mut *peer_state_lock;
97659783
match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
97669784
hash_map::Entry::Occupied(mut chan_entry) => {
97679785
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);
97699787
let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
97709788
let (closing_signed, tx_shutdown_result) =
97719789
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/
97769794
msg,
97779795
});
97789796
}
9779-
if let Some((tx, mut close_res)) = tx_shutdown_result {
9797+
if let Some((tx, close_res)) = tx_shutdown_result {
97809798
// We're done with this channel, we've got a signed closing transaction and
97819799
// will send the closing_signed back to the remote peer upon return. This
97829800
// also implies there are no pending HTLCs left on the channel, so we can
97839801
// fully delete it from tracking (the channel monitor is still around to
97849802
// 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)))
97879806
} else {
9788-
(None, None, None)
9807+
None
97899808
}
97909809
} else {
97919810
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/
97959814
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))
97969815
}
97979816
};
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-
}
98159817
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);
98189822
}
98199823
Ok(())
98209824
}
@@ -11060,12 +11064,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1106011064
if let Some(broadcast_tx) = msgs.signed_closing_tx {
1106111065
log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
1106211066
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-
}
1106911067
}
1107011068
} else {
1107111069
// 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/
1107911077
}
1108011078
};
1108111079

11082-
let mut shutdown_results = Vec::new();
11080+
let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
1108311081
let per_peer_state = self.per_peer_state.read().unwrap();
1108411082
let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
1108511083
if let Some((counterparty_node_id, _)) = channel_opt {
1108611084
**cp_id == counterparty_node_id
1108711085
} else { true }
1108811086
});
11089-
for (_cp_id, peer_state_mutex) in per_peer_state_iter {
11087+
for (cp_id, peer_state_mutex) in per_peer_state_iter {
1109011088
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1109111089
let peer_state = &mut *peer_state_lock;
1109211090
peer_state.channel_by_id.retain(|_, chan| {
1109311091
let shutdown_result = match channel_opt {
1109411092
Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
1109511093
_ => unblock_chan(chan, &mut peer_state.pending_msg_events),
1109611094
};
11097-
if let Some(mut shutdown_result) = shutdown_result {
11095+
if let Some(shutdown) = shutdown_result {
1109811096
let context = chan.context();
1109911097
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)
1110311103
} 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));
1110711111
false
1110811112
} else {
1110911113
true
1111011114
}
1111111115
});
1111211116
}
1111311117
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);
1111611120
}
1111711121
}
1111811122

@@ -11123,11 +11127,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1112311127
fn maybe_generate_initial_closing_signed(&self) -> bool {
1112411128
let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
1112511129
let mut has_update = false;
11126-
let mut shutdown_results = Vec::new();
1112711130
{
1112811131
let per_peer_state = self.per_peer_state.read().unwrap();
1112911132

11130-
for (_cp_id, peer_state_mutex) in per_peer_state.iter() {
11133+
for (cp_id, peer_state_mutex) in per_peer_state.iter() {
1113111134
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
1113211135
let peer_state = &mut *peer_state_lock;
1113311136
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/
1114411147
});
1114511148
}
1114611149
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 {
1115011151
// We're done with this channel. We got a closing_signed and sent back
1115111152
// 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)));
1115811155

1115911156
log_info!(logger, "Broadcasting {}", log_tx!(tx));
1116011157
self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -11175,14 +11172,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
1117511172
}
1117611173
}
1117711174

11178-
for (counterparty_node_id, err) in handle_errors.drain(..) {
11175+
for (counterparty_node_id, err) in handle_errors {
1117911176
let _ = handle_error!(self, err, counterparty_node_id);
1118011177
}
1118111178

11182-
for shutdown_result in shutdown_results.drain(..) {
11183-
self.finish_close_channel(shutdown_result);
11184-
}
11185-
1118611179
has_update
1118711180
}
1118811181

0 commit comments

Comments
 (0)