mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-25 15:20:24 +01:00
Handle monitor completion actions for closed channels
If a channel has been closed, there may still be some `ChannelMonitorUpdate`(s) which are pending completion. These in-flight updates may also be blocking another channel from letting an update fly, e.g. for forwarded payments where the payment preimage will be removed from the downstream channel after the upstream channel has closed. Luckily all the infrastructure to handle this case is already in place - we just need to process the `monitor_update_blocked_actions` for closed channels.
This commit is contained in:
parent
4c342bd6b6
commit
d450e0fb2c
1 changed files with 14 additions and 9 deletions
|
@ -5001,24 +5001,29 @@ where
|
||||||
if peer_state_mutex_opt.is_none() { return }
|
if peer_state_mutex_opt.is_none() { return }
|
||||||
peer_state_lock = peer_state_mutex_opt.unwrap().lock().unwrap();
|
peer_state_lock = peer_state_mutex_opt.unwrap().lock().unwrap();
|
||||||
let peer_state = &mut *peer_state_lock;
|
let peer_state = &mut *peer_state_lock;
|
||||||
let mut channel = {
|
let channel =
|
||||||
match peer_state.channel_by_id.entry(funding_txo.to_channel_id()){
|
if let Some(chan) = peer_state.channel_by_id.get_mut(&funding_txo.to_channel_id()) {
|
||||||
hash_map::Entry::Occupied(chan) => chan,
|
chan
|
||||||
hash_map::Entry::Vacant(_) => return,
|
} else {
|
||||||
}
|
let update_actions = peer_state.monitor_update_blocked_actions
|
||||||
};
|
.remove(&funding_txo.to_channel_id()).unwrap_or(Vec::new());
|
||||||
|
mem::drop(peer_state_lock);
|
||||||
|
mem::drop(per_peer_state);
|
||||||
|
self.handle_monitor_update_completion_actions(update_actions);
|
||||||
|
return;
|
||||||
|
};
|
||||||
let remaining_in_flight =
|
let remaining_in_flight =
|
||||||
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
|
if let Some(pending) = peer_state.in_flight_monitor_updates.get_mut(funding_txo) {
|
||||||
pending.retain(|upd| upd.update_id > highest_applied_update_id);
|
pending.retain(|upd| upd.update_id > highest_applied_update_id);
|
||||||
pending.len()
|
pending.len()
|
||||||
} else { 0 };
|
} else { 0 };
|
||||||
log_trace!(self.logger, "ChannelMonitor updated to {}. Current highest is {}. {} pending in-flight updates.",
|
log_trace!(self.logger, "ChannelMonitor updated to {}. Current highest is {}. {} pending in-flight updates.",
|
||||||
highest_applied_update_id, channel.get().context.get_latest_monitor_update_id(),
|
highest_applied_update_id, channel.context.get_latest_monitor_update_id(),
|
||||||
remaining_in_flight);
|
remaining_in_flight);
|
||||||
if !channel.get().is_awaiting_monitor_update() || channel.get().context.get_latest_monitor_update_id() != highest_applied_update_id {
|
if !channel.is_awaiting_monitor_update() || channel.context.get_latest_monitor_update_id() != highest_applied_update_id {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
handle_monitor_update_completion!(self, peer_state_lock, peer_state, per_peer_state, channel.get_mut());
|
handle_monitor_update_completion!(self, peer_state_lock, peer_state, per_peer_state, channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Accepts a request to open a channel after a [`Event::OpenChannelRequest`].
|
/// Accepts a request to open a channel after a [`Event::OpenChannelRequest`].
|
||||||
|
|
Loading…
Add table
Reference in a new issue