Skip to content

Commit aa133fe

Browse files
committed
lsps2: Restore offer lease caches
After startup discovery, schedule refills for persisted BOLT12 offer descriptors. Reuse valid persisted leases and renegotiate only missing or stale cache entries. Co-Authored-By: HAL 9000
1 parent c949532 commit aa133fe

3 files changed

Lines changed: 63 additions & 0 deletions

File tree

src/lib.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,17 @@ impl Node {
827827
liquidity_logger,
828828
"LSP protocols discovery complete.",
829829
);
830+
if let Err(error) = liquidity_handler
831+
.lsps2_client()
832+
.refill_pending_offer_leases(&discovery_cm)
833+
.await
834+
{
835+
log_error!(
836+
liquidity_logger,
837+
"Failed scheduling LSPS2 offer lease refills: {}",
838+
error
839+
);
840+
}
830841
}
831842
}
832843
}

src/liquidity/client/lsps2/mod.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,31 @@ where
150150
Ok(())
151151
}
152152

153+
pub(crate) async fn refill_pending_offer_leases(
154+
self: &Arc<Self>, connection_manager: &Arc<ConnectionManager<L>>,
155+
) -> Result<(), Error> {
156+
self.prune_stale_pending_offers().await?;
157+
let pending_offers = self.pending_offer_state.lock().expect("lock").offers();
158+
for pending_offer in pending_offers {
159+
match pending_offer.amount {
160+
PendingOfferAmount::Fixed { amount_msat, max_total_fee_msat } => {
161+
self.schedule_fixed_lease_refill(
162+
amount_msat,
163+
max_total_fee_msat,
164+
connection_manager,
165+
);
166+
},
167+
PendingOfferAmount::Variable { max_proportional_fee_ppm_msat } => {
168+
self.schedule_variable_lease_refill(
169+
max_proportional_fee_ppm_msat,
170+
connection_manager,
171+
);
172+
},
173+
}
174+
}
175+
Ok(())
176+
}
177+
153178
pub(crate) async fn pending_offer(
154179
&self, offer_id: PendingOfferId,
155180
) -> Result<Option<PendingOffer>, Error> {

src/liquidity/client/lsps2/state.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,10 @@ impl PendingOfferState {
172172
self.offers.contains_key(id)
173173
}
174174

175+
pub(crate) fn offers(&self) -> Vec<PendingOffer> {
176+
self.offers.values().cloned().collect()
177+
}
178+
175179
pub(crate) fn prune(&mut self, now: u64) -> Vec<PendingOfferId> {
176180
let removed = self
177181
.offers
@@ -594,6 +598,29 @@ mod tests {
594598
assert!(state.contains(&long_lived_id));
595599
}
596600

601+
#[test]
602+
fn pending_offer_registry_lists_cached_offers() {
603+
let fixed = pending_offer(
604+
1,
605+
PendingOfferAmount::Fixed { amount_msat: 1_000, max_total_fee_msat: None },
606+
None,
607+
1,
608+
);
609+
let variable = pending_offer(
610+
2,
611+
PendingOfferAmount::Variable { max_proportional_fee_ppm_msat: None },
612+
None,
613+
2,
614+
);
615+
let (state, removed) =
616+
PendingOfferState::from_offers(vec![fixed.clone(), variable.clone()], 2, 10);
617+
assert!(removed.is_empty());
618+
619+
let mut ids = state.offers().into_iter().map(|offer| offer.id).collect::<Vec<_>>();
620+
ids.sort();
621+
assert_eq!(ids, vec![fixed.id, variable.id]);
622+
}
623+
597624
#[test]
598625
fn invoice_requests_are_serialized_per_offer() {
599626
let first_id = PendingOfferId::from(OfferId([1; 32]));

0 commit comments

Comments
 (0)