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:
Matt Corallo 2023-07-04 15:13:32 +00:00
parent 4c342bd6b6
commit d450e0fb2c

View file

@ -5001,11 +5001,16 @@ 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) {
@ -5013,12 +5018,12 @@ where
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`].