From: Matt Corallo Date: Wed, 5 Sep 2018 02:25:51 +0000 (-0400) Subject: Util-func channel removal (fixing a bug in HTLC failure updates) X-Git-Tag: v0.0.12~328^2~1 X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=commitdiff_plain;h=3b4c1a366216d714cbcbeb483f6b08b277bde6c7;hp=91b23a075442107a93d00c6db1d7f5ffe54f715b;p=rust-lightning Util-func channel removal (fixing a bug in HTLC failure updates) --- diff --git a/src/ln/router.rs b/src/ln/router.rs index 6bc319d59..e91e0c2ac 100644 --- a/src/ln/router.rs +++ b/src/ln/router.rs @@ -306,12 +306,7 @@ impl RoutingMessageHandler for Router { &msgs::HTLCFailChannelUpdate::ChannelClosed { ref short_channel_id } => { let mut network = self.network_map.write().unwrap(); if let Some(chan) = network.channels.remove(short_channel_id) { - network.nodes.get_mut(&chan.one_to_two.src_node_id).unwrap().channels.retain(|chan_id| { - chan_id != NetworkMap::get_short_id(chan_id) - }); - network.nodes.get_mut(&chan.two_to_one.src_node_id).unwrap().channels.retain(|chan_id| { - chan_id != NetworkMap::get_short_id(chan_id) - }); + Self::remove_channel_in_nodes(&mut network.nodes, &chan, *short_channel_id); } }, } @@ -462,6 +457,25 @@ impl Router { unimplemented!(); } + fn remove_channel_in_nodes(nodes: &mut HashMap, chan: &ChannelInfo, short_channel_id: u64) { + macro_rules! remove_from_node { + ($node_id: expr) => { + if let Entry::Occupied(mut entry) = nodes.entry($node_id) { + entry.get_mut().channels.retain(|chan_id| { + short_channel_id != *NetworkMap::get_short_id(chan_id) + }); + if entry.get().channels.is_empty() { + entry.remove_entry(); + } + } else { + panic!("Had channel that pointed to unknown node (ie inconsistent network map)!"); + } + } + } + remove_from_node!(chan.one_to_two.src_node_id); + remove_from_node!(chan.two_to_one.src_node_id); + } + /// Gets a route from us to the given target node. /// Extra routing hops between known nodes and the target will be used if they are included in /// last_hops.