Skip to content

Commit 08fd499

Browse files
committed
LSPS2: Prune empty PeerStates
In addition to pruning expired requests on peer disconnection we also regularly prune for all peers on block connection, and also remove the entire `PeerState` if it's empty after pruning (i.e., has no pending requsts or in-flight channels left).
1 parent bdea03e commit 08fd499

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

lightning-liquidity/src/lsps2/service.rs

+27-5
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,7 @@ impl PeerState {
474474
self.outbound_channels_by_intercept_scid.insert(intercept_scid, channel);
475475
}
476476

477-
fn peer_disconnected(&mut self) {
477+
fn prune_expired_request_state(&mut self) {
478478
self.pending_requests.retain(|_, entry| {
479479
match entry {
480480
LSPS2Request::GetInfo(_) => false,
@@ -495,6 +495,11 @@ impl PeerState {
495495
true
496496
});
497497
}
498+
499+
fn is_prunable(&self) -> bool {
500+
// Return whether the entire state is empty.
501+
self.pending_requests.is_empty() && self.outbound_channels_by_intercept_scid.is_empty()
502+
}
498503
}
499504

500505
/// The main object allowing to send and receive LSPS2 messages.
@@ -1270,12 +1275,29 @@ where
12701275
}
12711276

12721277
pub(crate) fn peer_disconnected(&self, counterparty_node_id: PublicKey) {
1273-
let outer_state_lock = self.per_peer_state.write().unwrap();
1274-
if let Some(inner_state_lock) = outer_state_lock.get(&counterparty_node_id) {
1275-
let mut peer_state_lock = inner_state_lock.lock().unwrap();
1276-
peer_state_lock.peer_disconnected();
1278+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
1279+
let is_prunable =
1280+
if let Some(inner_state_lock) = outer_state_lock.get(&counterparty_node_id) {
1281+
let mut peer_state_lock = inner_state_lock.lock().unwrap();
1282+
peer_state_lock.prune_expired_request_state();
1283+
peer_state_lock.is_prunable()
1284+
} else {
1285+
return;
1286+
};
1287+
if is_prunable {
1288+
outer_state_lock.remove(&counterparty_node_id);
12771289
}
12781290
}
1291+
1292+
#[allow(clippy::bool_comparison)]
1293+
pub(crate) fn prune_peer_state(&self) {
1294+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
1295+
outer_state_lock.retain(|_, inner_state_lock| {
1296+
let mut peer_state_lock = inner_state_lock.lock().unwrap();
1297+
peer_state_lock.prune_expired_request_state();
1298+
peer_state_lock.is_prunable() == false
1299+
});
1300+
}
12791301
}
12801302

12811303
impl<CM: Deref + Clone> ProtocolMessageHandler for LSPS2ServiceHandler<CM>

lightning-liquidity/src/manager.rs

+3
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,9 @@ where
684684

685685
fn best_block_updated(&self, _header: &bitcoin::block::Header, _height: u32) {
686686
// TODO: Call best_block_updated on all sub-modules that require it, e.g., LSPS1MessageHandler.
687+
if let Some(lsps2_service_handler) = self.lsps2_service_handler.as_ref() {
688+
lsps2_service_handler.prune_peer_state();
689+
}
687690
}
688691

689692
fn get_relevant_txids(&self) -> Vec<(bitcoin::Txid, u32, Option<bitcoin::BlockHash>)> {

0 commit comments

Comments
 (0)