Skip to content

Commit 2911dbe

Browse files
committed
Skip LSPS5ServiceHandler persistence if unnecessary
.. we only persist the service handler if necessary.
1 parent aeb1166 commit 2911dbe

File tree

1 file changed

+47
-8
lines changed

1 file changed

+47
-8
lines changed

lightning-liquidity/src/lsps5/service.rs

Lines changed: 47 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -202,16 +202,24 @@ where
202202
&self, counterparty_node_id: PublicKey,
203203
) -> Result<(), lightning::io::Error> {
204204
let fut = {
205-
let outer_state_lock = self.per_peer_state.read().unwrap();
206-
let encoded = match outer_state_lock.get(&counterparty_node_id) {
205+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
206+
let encoded = match outer_state_lock.get_mut(&counterparty_node_id) {
207207
None => {
208208
let err = lightning::io::Error::new(
209209
lightning::io::ErrorKind::Other,
210210
"Failed to get peer entry",
211211
);
212212
return Err(err);
213213
},
214-
Some(entry) => entry.encode(),
214+
Some(entry) => {
215+
if !entry.needs_persist {
216+
// We already have persisted otherwise by now.
217+
return Ok(());
218+
} else {
219+
entry.needs_persist = false;
220+
entry.encode()
221+
}
222+
},
215223
};
216224

217225
let key = counterparty_node_id.to_string();
@@ -224,7 +232,14 @@ where
224232
)
225233
};
226234

227-
fut.await
235+
fut.await.map_err(|e| {
236+
self.per_peer_state
237+
.write()
238+
.unwrap()
239+
.get_mut(&counterparty_node_id)
240+
.map(|p| p.needs_persist = true);
241+
e
242+
})
228243
}
229244

230245
pub(crate) async fn persist(&self) -> Result<(), lightning::io::Error> {
@@ -233,7 +248,10 @@ where
233248
// time.
234249
let need_persist: Vec<PublicKey> = {
235250
let outer_state_lock = self.per_peer_state.read().unwrap();
236-
outer_state_lock.iter().filter_map(|(k, v)| Some(*k)).collect()
251+
outer_state_lock
252+
.iter()
253+
.filter_map(|(k, v)| if v.needs_persist { Some(*k) } else { None })
254+
.collect()
237255
};
238256

239257
for counterparty_node_id in need_persist.into_iter() {
@@ -260,6 +278,7 @@ where
260278
// Don't prune clients with open channels
261279
return true;
262280
}
281+
// TODO: Remove peer state entry from the KVStore
263282
!peer_state.prune_stale_webhooks(now)
264283
});
265284
*last_pruning = Some(now);
@@ -290,6 +309,7 @@ where
290309
webhook.url = params.webhook.clone();
291310
webhook.last_used = now;
292311
webhook.last_notification_sent = None;
312+
peer_state.needs_persist |= true;
293313
}
294314
} else {
295315
if num_webhooks >= self.config.max_webhooks_per_client as usize {
@@ -650,22 +670,28 @@ where
650670
}
651671
}
652672

653-
#[derive(Debug, Default)]
673+
#[derive(Debug)]
654674
pub(crate) struct PeerState {
655675
webhooks: Vec<(LSPS5AppName, Webhook)>,
676+
needs_persist: bool,
656677
}
657678

658679
impl PeerState {
659680
fn webhook_mut(&mut self, name: &LSPS5AppName) -> Option<&mut Webhook> {
660-
self.webhooks.iter_mut().find_map(|(n, h)| if n == name { Some(h) } else { None })
681+
let res =
682+
self.webhooks.iter_mut().find_map(|(n, h)| if n == name { Some(h) } else { None });
683+
self.needs_persist |= true;
684+
res
661685
}
662686

663687
fn webhooks(&self) -> &Vec<(LSPS5AppName, Webhook)> {
664688
&self.webhooks
665689
}
666690

667691
fn webhooks_mut(&mut self) -> &mut Vec<(LSPS5AppName, Webhook)> {
668-
&mut self.webhooks
692+
let res = &mut self.webhooks;
693+
self.needs_persist |= true;
694+
res
669695
}
670696

671697
fn webhooks_len(&self) -> usize {
@@ -685,6 +711,7 @@ impl PeerState {
685711
}
686712

687713
self.webhooks.push((name, hook));
714+
self.needs_persist |= true;
688715
}
689716

690717
fn remove_webhook(&mut self, name: &LSPS5AppName) -> bool {
@@ -697,13 +724,15 @@ impl PeerState {
697724
false
698725
}
699726
});
727+
self.needs_persist |= true;
700728
removed
701729
}
702730

703731
fn reset_notification_cooldown(&mut self) {
704732
for (_, h) in self.webhooks.iter_mut() {
705733
h.last_notification_sent = None;
706734
}
735+
self.needs_persist |= true;
707736
}
708737

709738
// Returns whether the entire state is empty and can be pruned.
@@ -716,6 +745,16 @@ impl PeerState {
716745
}
717746
}
718747

748+
impl Default for PeerState {
749+
fn default() -> Self {
750+
let webhooks = Vec::new();
751+
let needs_persist = true;
752+
Self { webhooks, needs_persist }
753+
}
754+
}
755+
719756
impl_writeable_tlv_based!(PeerState, {
720757
(0, webhooks, required),
758+
(_unused, needs_persist, (static_value, false)),
759+
721760
});

0 commit comments

Comments
 (0)