Skip to content

Commit 05eca8a

Browse files
Don't serialize nodes which we have no channels to
1 parent ac16b2d commit 05eca8a

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

lightning/src/ln/channelmanager.rs

+17-4
Original file line numberDiff line numberDiff line change
@@ -1691,6 +1691,12 @@ where
16911691
self.list_channels_with_filter(|&(_, ref channel)| channel.is_live())
16921692
}
16931693

1694+
// Indicates that a peer meets the criteria where we're ok to disconnect the peer and remove it
1695+
// from our storage
1696+
fn ok_to_disconnected(&self, peer: &PeerState<<SP::Target as SignerProvider>::Signer>) -> bool {
1697+
peer.channel_by_id.len() == 0
1698+
}
1699+
16941700
/// Helper function that issues the channel close events
16951701
fn issue_channel_close_events(&self, channel: &Channel<<SP::Target as SignerProvider>::Signer>, closure_reason: ClosureReason) {
16961702
let mut pending_events_lock = self.pending_events.lock().unwrap();
@@ -6875,13 +6881,17 @@ where
68756881
best_block.block_hash().write(writer)?;
68766882
}
68776883

6884+
let mut peers_to_searialize_count: u64 = 0;
68786885
{
68796886
let per_peer_state = self.per_peer_state.read().unwrap();
68806887
let mut unfunded_channels = 0;
68816888
let mut number_of_channels = 0;
68826889
for (_, peer_state_mutex) in per_peer_state.iter() {
68836890
let mut peer_state_lock = peer_state_mutex.lock().unwrap();
68846891
let peer_state = &mut *peer_state_lock;
6892+
if !self.ok_to_disconnected(peer_state) {
6893+
peers_to_searialize_count += 1;
6894+
}
68856895
number_of_channels += peer_state.channel_by_id.len();
68866896
for (_, channel) in peer_state.channel_by_id.iter() {
68876897
if !channel.is_funding_initiated() {
@@ -6932,11 +6942,14 @@ where
69326942
htlc_purposes.push(purpose);
69336943
}
69346944

6935-
(per_peer_state.len() as u64).write(writer)?;
6945+
(peers_to_searialize_count).write(writer)?;
69366946
for (peer_pubkey, peer_state_mutex) in per_peer_state.iter() {
6937-
peer_pubkey.write(writer)?;
6938-
let peer_state = peer_state_mutex.lock().unwrap();
6939-
peer_state.latest_features.write(writer)?;
6947+
let peer_state_lock= peer_state_mutex.lock().unwrap();
6948+
let peer_state = & *peer_state_lock;
6949+
if !self.ok_to_disconnected(peer_state) {
6950+
peer_pubkey.write(writer)?;
6951+
peer_state.latest_features.write(writer)?;
6952+
}
69406953
}
69416954

69426955
let events = self.pending_events.lock().unwrap();

lightning/src/ln/reorg_tests.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::chain::channelmonitor::ANTI_REORG_DELAY;
1313
use crate::chain::transaction::OutPoint;
1414
use crate::chain::Confirm;
1515
use crate::ln::channelmanager::ChannelManager;
16-
use crate::ln::msgs::ChannelMessageHandler;
16+
use crate::ln::msgs::{ChannelMessageHandler, Init};
1717
use crate::util::events::{Event, MessageSendEventsProvider, ClosureReason, HTLCDestination};
1818
use crate::util::test_utils;
1919
use crate::util::ser::Writeable;
@@ -374,6 +374,12 @@ fn do_test_unconf_chan(reload_node: bool, reorg_after_reload: bool, use_funding_
374374
nodes[0].tx_broadcaster.txn_broadcasted.lock().unwrap().clear();
375375

376376
// Now check that we can create a new channel
377+
if reload_node && nodes[0].node.per_peer_state.read().unwrap().len() == 0 {
378+
// If we dropped the channel before reloading the node, nodes[1] was also dropped from
379+
// nodes[0] storage, and hence not connected again on startup. We therefore need to
380+
// reconnect to the node before attempting to create a new channel.
381+
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &Init { features: nodes[1].node.init_features(), remote_network_address: None }).unwrap();
382+
}
377383
create_announced_chan_between_nodes(&nodes, 0, 1);
378384
send_payment(&nodes[0], &[&nodes[1]], 8000000);
379385
}

0 commit comments

Comments
 (0)