Drop channels on disconnection if we haven't funded them yet

This commit is contained in:
Matt Corallo 2018-09-07 15:11:52 -04:00
parent f55f055b4e
commit 5fe598c073
2 changed files with 19 additions and 6 deletions

View file

@ -1771,6 +1771,13 @@ impl Channel {
/// Returns the set of PendingHTLCStatuses from remote uncommitted HTLCs (which we're /// Returns the set of PendingHTLCStatuses from remote uncommitted HTLCs (which we're
/// implicitly dropping) and the payment_hashes of HTLCs we tried to add but are dropping. /// implicitly dropping) and the payment_hashes of HTLCs we tried to add but are dropping.
pub fn remove_uncommitted_htlcs(&mut self) -> Vec<(HTLCSource, [u8; 32])> { pub fn remove_uncommitted_htlcs(&mut self) -> Vec<(HTLCSource, [u8; 32])> {
let mut outbound_drops = Vec::new();
if self.channel_state < ChannelState::FundingSent as u32 {
self.channel_state = ChannelState::ShutdownComplete as u32;
return outbound_drops;
}
self.pending_inbound_htlcs.retain(|htlc| { self.pending_inbound_htlcs.retain(|htlc| {
match htlc.state { match htlc.state {
InboundHTLCState::RemoteAnnounced => { InboundHTLCState::RemoteAnnounced => {
@ -1806,7 +1813,6 @@ impl Channel {
} }
} }
let mut outbound_drops = Vec::new();
self.holding_cell_htlc_updates.retain(|htlc_update| { self.holding_cell_htlc_updates.retain(|htlc_update| {
match htlc_update { match htlc_update {
&HTLCUpdateAwaitingACK::AddHTLC { ref payment_hash, ref source, .. } => { &HTLCUpdateAwaitingACK::AddHTLC { ref payment_hash, ref source, .. } => {

View file

@ -2149,16 +2149,23 @@ impl ChannelMessageHandler for ChannelManager {
} }
}); });
} else { } else {
for chan in channel_state.by_id { channel_state.by_id.retain(|_, chan| {
if chan.1.get_their_node_id() == *their_node_id { if chan.get_their_node_id() == *their_node_id {
//TODO: mark channel disabled (and maybe announce such after a timeout). //TODO: mark channel disabled (and maybe announce such after a timeout).
let failed_adds = chan.1.remove_uncommitted_htlcs(); let failed_adds = chan.remove_uncommitted_htlcs();
if !failed_adds.is_empty() { if !failed_adds.is_empty() {
let chan_update = self.get_channel_update(&chan.1).map(|u| u.encode_with_len()).unwrap(); // Cannot add/recv HTLCs before we have a short_id so unwrap is safe let chan_update = self.get_channel_update(&chan).map(|u| u.encode_with_len()).unwrap(); // Cannot add/recv HTLCs before we have a short_id so unwrap is safe
failed_payments.push((chan_update, failed_adds)); failed_payments.push((chan_update, failed_adds));
} }
if chan.is_shutdown() {
if let Some(short_id) = chan.get_short_channel_id() {
short_to_id.remove(&short_id);
}
return false;
}
} }
} true
})
} }
} }
for failure in failed_channels.drain(..) { for failure in failed_channels.drain(..) {