@@ -3240,6 +3240,23 @@ macro_rules! convert_channel_err {
3240
3240
},
3241
3241
}
3242
3242
};
3243
+ ($self: ident, $peer_state: expr, $shutdown_result: expr, $funded_channel: expr, $channel_id: expr, COOP_CLOSED) => { {
3244
+ let reason = ChannelError::Close(("Coop Closed".to_owned(), $shutdown_result.closure_reason.clone()));
3245
+ let do_close = |_| {
3246
+ (
3247
+ $shutdown_result,
3248
+ $self.get_channel_update_for_broadcast(&$funded_channel).ok(),
3249
+ )
3250
+ };
3251
+ let mut locked_close = |shutdown_res_mut: &mut ShutdownResult, funded_channel: &mut FundedChannel<_>| {
3252
+ locked_close_channel!($self, $peer_state, funded_channel, shutdown_res_mut, FUNDED);
3253
+ };
3254
+ let (close, mut err) =
3255
+ convert_channel_err!($self, $peer_state, reason, $funded_channel, do_close, locked_close, $channel_id, _internal);
3256
+ err.dont_send_error_message();
3257
+ debug_assert!(close);
3258
+ (close, err)
3259
+ } };
3243
3260
($self: ident, $peer_state: expr, $err: expr, $funded_channel: expr, $channel_id: expr, FUNDED_CHANNEL) => { {
3244
3261
let mut do_close = |reason| {
3245
3262
(
@@ -9254,13 +9271,14 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9254
9271
msg.channel_id,
9255
9272
)
9256
9273
})?;
9257
- let (tx, chan_option, shutdown_result) = {
9274
+ let logger;
9275
+ let tx_err: Option<(_, Result<Infallible, _>)> = {
9258
9276
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
9259
9277
let peer_state = &mut *peer_state_lock;
9260
9278
match peer_state.channel_by_id.entry(msg.channel_id.clone()) {
9261
9279
hash_map::Entry::Occupied(mut chan_entry) => {
9262
9280
if let Some(chan) = chan_entry.get_mut().as_funded_mut() {
9263
- let logger = WithChannelContext::from(&self.logger, &chan.context, None);
9281
+ logger = WithChannelContext::from(&self.logger, &chan.context, None);
9264
9282
let res = chan.closing_signed(&self.fee_estimator, &msg, &&logger);
9265
9283
let (closing_signed, tx_shutdown_result) =
9266
9284
try_channel_entry!(self, peer_state, res, chan_entry);
@@ -9271,16 +9289,17 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9271
9289
msg,
9272
9290
});
9273
9291
}
9274
- if let Some((tx, mut close_res)) = tx_shutdown_result {
9292
+ if let Some((tx, close_res)) = tx_shutdown_result {
9275
9293
// We're done with this channel, we've got a signed closing transaction and
9276
9294
// will send the closing_signed back to the remote peer upon return. This
9277
9295
// also implies there are no pending HTLCs left on the channel, so we can
9278
9296
// fully delete it from tracking (the channel monitor is still around to
9279
9297
// watch for old state broadcasts)!
9280
- locked_close_channel!(self, peer_state, chan, close_res, FUNDED);
9281
- (Some(tx), Some(chan_entry.remove()), Some(close_res))
9298
+ let (_, err) = convert_channel_err!(self, peer_state, close_res, chan, &msg.channel_id, COOP_CLOSED);
9299
+ chan_entry.remove();
9300
+ Some((tx, Err(err)))
9282
9301
} else {
9283
- ( None, None, None)
9302
+ None
9284
9303
}
9285
9304
} else {
9286
9305
return try_channel_entry!(self, peer_state, Err(ChannelError::close(
@@ -9290,26 +9309,15 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
9290
9309
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))
9291
9310
}
9292
9311
};
9293
- if let Some(broadcast_tx) = tx {
9294
- let channel_id = chan_option.as_ref().map(|channel| channel.context().channel_id());
9312
+ mem::drop(per_peer_state);
9313
+ if let Some((broadcast_tx, err)) = tx_err {
9295
9314
log_info!(
9296
- WithContext::from(&self. logger, Some(*counterparty_node_id), channel_id, None) ,
9315
+ logger,
9297
9316
"Broadcasting {}",
9298
9317
log_tx!(broadcast_tx)
9299
9318
);
9300
9319
self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
9301
- }
9302
- if let Some(chan) = chan_option.as_ref().and_then(Channel::as_funded) {
9303
- if let Ok(update) = self.get_channel_update_for_broadcast(chan) {
9304
- let mut pending_broadcast_messages =
9305
- self.pending_broadcast_messages.lock().unwrap();
9306
- pending_broadcast_messages
9307
- .push(MessageSendEvent::BroadcastChannelUpdate { msg: update });
9308
- }
9309
- }
9310
- mem::drop(per_peer_state);
9311
- if let Some(shutdown_result) = shutdown_result {
9312
- self.finish_close_channel(shutdown_result);
9320
+ let _ = handle_error!(self, err, *counterparty_node_id);
9313
9321
}
9314
9322
Ok(())
9315
9323
}
@@ -10404,12 +10412,6 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10404
10412
if let Some(broadcast_tx) = msgs.signed_closing_tx {
10405
10413
log_info!(logger, "Broadcasting closing tx {}", log_tx!(broadcast_tx));
10406
10414
self.tx_broadcaster.broadcast_transactions(&[&broadcast_tx]);
10407
-
10408
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10409
- pending_msg_events.push(MessageSendEvent::BroadcastChannelUpdate {
10410
- msg: update
10411
- });
10412
- }
10413
10415
}
10414
10416
} else {
10415
10417
// We don't know how to handle a channel_ready or signed_closing_tx for a
@@ -10423,40 +10425,45 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10423
10425
}
10424
10426
};
10425
10427
10426
- let mut shutdown_results = Vec::new();
10428
+ let mut shutdown_results: Vec<(Result<Infallible, _>, _)> = Vec::new();
10427
10429
let per_peer_state = self.per_peer_state.read().unwrap();
10428
10430
let per_peer_state_iter = per_peer_state.iter().filter(|(cp_id, _)| {
10429
10431
if let Some((counterparty_node_id, _)) = channel_opt {
10430
10432
**cp_id == counterparty_node_id
10431
10433
} else { true }
10432
10434
});
10433
- for (_cp_id , peer_state_mutex) in per_peer_state_iter {
10435
+ for (cp_id , peer_state_mutex) in per_peer_state_iter {
10434
10436
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
10435
10437
let peer_state = &mut *peer_state_lock;
10436
10438
peer_state.channel_by_id.retain(|_, chan| {
10437
10439
let shutdown_result = match channel_opt {
10438
10440
Some((_, channel_id)) if chan.context().channel_id() != channel_id => None,
10439
10441
_ => unblock_chan(chan, &mut peer_state.pending_msg_events),
10440
10442
};
10441
- if let Some(mut shutdown_result ) = shutdown_result {
10443
+ if let Some(shutdown_res ) = shutdown_result {
10442
10444
let context = chan.context();
10443
10445
let logger = WithChannelContext::from(&self.logger, context, None);
10444
- log_trace!(logger, "Removing channel {} now that the signer is unblocked", context.channel_id());
10445
- if let Some(funded_channel) = chan.as_funded_mut() {
10446
- locked_close_channel!(self, peer_state, funded_channel, shutdown_result, FUNDED);
10446
+ let chan_id = context.channel_id();
10447
+ log_trace!(logger, "Removing channel {} now that the signer is unblocked", chan_id);
10448
+ let (remove, err) = if let Some(funded_channel) = chan.as_funded_mut() {
10449
+ convert_channel_err!(self, peer_state, shutdown_res, funded_channel, &chan_id, COOP_CLOSED)
10447
10450
} else {
10448
- locked_close_channel!(self, chan.context(), UNFUNDED);
10449
- }
10450
- shutdown_results.push(shutdown_result);
10451
+ debug_assert!(false);
10452
+ let reason = shutdown_res.closure_reason.clone();
10453
+ let err = ChannelError::Close((reason.to_string(), reason));
10454
+ convert_channel_err!(self, peer_state, err, chan, &chan_id, UNFUNDED_CHANNEL)
10455
+ };
10456
+ debug_assert!(remove);
10457
+ shutdown_results.push((Err(err), *cp_id));
10451
10458
false
10452
10459
} else {
10453
10460
true
10454
10461
}
10455
10462
});
10456
10463
}
10457
10464
drop(per_peer_state);
10458
- for shutdown_result in shutdown_results.drain(..) {
10459
- self.finish_close_channel(shutdown_result );
10465
+ for (err, counterparty_node_id) in shutdown_results {
10466
+ let _ = handle_error!(self, err, counterparty_node_id );
10460
10467
}
10461
10468
}
10462
10469
@@ -10467,11 +10474,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10467
10474
fn maybe_generate_initial_closing_signed(&self) -> bool {
10468
10475
let mut handle_errors: Vec<(PublicKey, Result<(), _>)> = Vec::new();
10469
10476
let mut has_update = false;
10470
- let mut shutdown_results = Vec::new();
10471
10477
{
10472
10478
let per_peer_state = self.per_peer_state.read().unwrap();
10473
10479
10474
- for (_cp_id , peer_state_mutex) in per_peer_state.iter() {
10480
+ for (cp_id , peer_state_mutex) in per_peer_state.iter() {
10475
10481
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
10476
10482
let peer_state = &mut *peer_state_lock;
10477
10483
let pending_msg_events = &mut peer_state.pending_msg_events;
@@ -10488,17 +10494,11 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10488
10494
});
10489
10495
}
10490
10496
debug_assert_eq!(tx_shutdown_result_opt.is_some(), funded_chan.is_shutdown());
10491
- if let Some((tx, mut shutdown_res)) = tx_shutdown_result_opt {
10492
- locked_close_channel!(self, peer_state, funded_chan, shutdown_res, FUNDED);
10493
- shutdown_results.push(shutdown_res);
10497
+ if let Some((tx, shutdown_res)) = tx_shutdown_result_opt {
10494
10498
// We're done with this channel. We got a closing_signed and sent back
10495
10499
// a closing_signed with a closing transaction to broadcast.
10496
- if let Ok(update) = self.get_channel_update_for_broadcast(&funded_chan) {
10497
- let mut pending_broadcast_messages = self.pending_broadcast_messages.lock().unwrap();
10498
- pending_broadcast_messages.push(MessageSendEvent::BroadcastChannelUpdate {
10499
- msg: update
10500
- });
10501
- }
10500
+ let (_, err) = convert_channel_err!(self, peer_state, shutdown_res, funded_chan, channel_id, COOP_CLOSED);
10501
+ handle_errors.push((*cp_id, Err(err)));
10502
10502
10503
10503
log_info!(logger, "Broadcasting {}", log_tx!(tx));
10504
10504
self.tx_broadcaster.broadcast_transactions(&[&tx]);
@@ -10519,14 +10519,10 @@ This indicates a bug inside LDK. Please report this error at https://github.com/
10519
10519
}
10520
10520
}
10521
10521
10522
- for (counterparty_node_id, err) in handle_errors.drain(..) {
10522
+ for (counterparty_node_id, err) in handle_errors {
10523
10523
let _ = handle_error!(self, err, counterparty_node_id);
10524
10524
}
10525
10525
10526
- for shutdown_result in shutdown_results.drain(..) {
10527
- self.finish_close_channel(shutdown_result);
10528
- }
10529
-
10530
10526
has_update
10531
10527
}
10532
10528
0 commit comments