Skip to content

Commit 7400b3b

Browse files
committed
Fix some channel remove channelmanager consistency bugs
1 parent 8e2974f commit 7400b3b

File tree

1 file changed

+18
-8
lines changed

1 file changed

+18
-8
lines changed

src/ln/channelmanager.rs

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -284,11 +284,16 @@ impl ChannelManager {
284284
/// pending HTLCs, the channel will be closed on chain.
285285
pub fn close_channel(&self, channel_id: &Uint256) -> Result<msgs::Shutdown, HandleError> {
286286
let res = {
287-
let mut channel_state = self.channel_state.lock().unwrap();
287+
let mut channel_state_lock = self.channel_state.lock().unwrap();
288+
let channel_state = channel_state_lock.borrow_parts();
289+
288290
match channel_state.by_id.entry(channel_id.clone()) {
289291
hash_map::Entry::Occupied(mut chan_entry) => {
290292
let res = chan_entry.get_mut().get_shutdown()?;
291293
if chan_entry.get().is_shutdown() {
294+
if let Some(short_id) = chan_entry.get().get_short_channel_id() {
295+
channel_state.short_to_id.remove(&short_id);
296+
}
292297
chan_entry.remove_entry();
293298
}
294299
res
@@ -1140,7 +1145,8 @@ impl ChannelMessageHandler for ChannelManager {
11401145

11411146
fn handle_shutdown(&self, their_node_id: &PublicKey, msg: &msgs::Shutdown) -> Result<(Option<msgs::Shutdown>, Option<msgs::ClosingSigned>), HandleError> {
11421147
let res = {
1143-
let mut channel_state = self.channel_state.lock().unwrap();
1148+
let mut channel_state_lock = self.channel_state.lock().unwrap();
1149+
let channel_state = channel_state_lock.borrow_parts();
11441150

11451151
match channel_state.by_id.entry(msg.channel_id.clone()) {
11461152
hash_map::Entry::Occupied(mut chan_entry) => {
@@ -1149,6 +1155,9 @@ impl ChannelMessageHandler for ChannelManager {
11491155
}
11501156
let res = chan_entry.get_mut().shutdown(&*self.fee_estimator, &msg)?;
11511157
if chan_entry.get().is_shutdown() {
1158+
if let Some(short_id) = chan_entry.get().get_short_channel_id() {
1159+
channel_state.short_to_id.remove(&short_id);
1160+
}
11521161
chan_entry.remove_entry();
11531162
}
11541163
res
@@ -1165,7 +1174,8 @@ impl ChannelMessageHandler for ChannelManager {
11651174

11661175
fn handle_closing_signed(&self, their_node_id: &PublicKey, msg: &msgs::ClosingSigned) -> Result<Option<msgs::ClosingSigned>, HandleError> {
11671176
let res = {
1168-
let mut channel_state = self.channel_state.lock().unwrap();
1177+
let mut channel_state_lock = self.channel_state.lock().unwrap();
1178+
let channel_state = channel_state_lock.borrow_parts();
11691179
match channel_state.by_id.entry(msg.channel_id.clone()) {
11701180
hash_map::Entry::Occupied(mut chan_entry) => {
11711181
if chan_entry.get().get_their_node_id() != *their_node_id {
@@ -1178,6 +1188,9 @@ impl ChannelMessageHandler for ChannelManager {
11781188
// also implies there are no pending HTLCs left on the channel, so we can
11791189
// fully delete it from tracking (the channel monitor is still around to
11801190
// watch for old state broadcasts)!
1191+
if let Some(short_id) = chan_entry.get().get_short_channel_id() {
1192+
channel_state.short_to_id.remove(&short_id);
1193+
}
11811194
chan_entry.remove_entry();
11821195
}
11831196
res
@@ -1657,11 +1670,8 @@ impl ChannelMessageHandler for ChannelManager {
16571670
if no_connection_possible {
16581671
channel_state.by_id.retain(move |_, chan| {
16591672
if chan.get_their_node_id() == *their_node_id {
1660-
match chan.get_short_channel_id() {
1661-
Some(short_id) => {
1662-
short_to_id.remove(&short_id);
1663-
},
1664-
None => {},
1673+
if let Some(short_id) = chan.get_short_channel_id() {
1674+
short_to_id.remove(&short_id);
16651675
}
16661676
//TODO: get the latest commitment tx, any HTLC txn built on top of it, etc out
16671677
//of the channel and throw those into the announcement blackhole.

0 commit comments

Comments
 (0)