Skip to content

Commit 849c857

Browse files
committed
Skip LSPS5ServiceHandler persistence if unnecessary
.. we only persist the service handler if necessary.
1 parent e951549 commit 849c857

File tree

1 file changed

+47
-7
lines changed

1 file changed

+47
-7
lines changed

lightning-liquidity/src/lsps5/service.rs

Lines changed: 47 additions & 7 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 encoded = {
205-
let outer_state_lock = self.per_peer_state.read().unwrap();
206-
match outer_state_lock.get(&counterparty_node_id) {
205+
let mut outer_state_lock = self.per_peer_state.write().unwrap();
206+
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

@@ -225,6 +233,14 @@ where
225233
encoded,
226234
)
227235
.await
236+
.map_err(|e| {
237+
self.per_peer_state
238+
.write()
239+
.unwrap()
240+
.get_mut(&counterparty_node_id)
241+
.map(|p| p.needs_persist = true);
242+
e
243+
})
228244
}
229245

230246
pub(crate) async fn persist(&self) -> Result<(), lightning::io::Error> {
@@ -233,7 +249,10 @@ where
233249
// time.
234250
let need_persist: Vec<PublicKey> = {
235251
let outer_state_lock = self.per_peer_state.read().unwrap();
236-
outer_state_lock.iter().filter_map(|(k, v)| Some(*k)).collect()
252+
outer_state_lock
253+
.iter()
254+
.filter_map(|(k, v)| if v.needs_persist { Some(*k) } else { None })
255+
.collect()
237256
};
238257

239258
for counterparty_node_id in need_persist.into_iter() {
@@ -260,6 +279,7 @@ where
260279
// Don't prune clients with open channels
261280
return true;
262281
}
282+
// TODO: Remove peer state entry from the KVStore
263283
!peer_state.prune_stale_webhooks(now)
264284
});
265285
*last_pruning = Some(now);
@@ -290,6 +310,7 @@ where
290310
webhook.url = params.webhook.clone();
291311
webhook.last_used = now;
292312
webhook.last_notification_sent = None;
313+
peer_state.needs_persist |= true;
293314
}
294315
} else {
295316
if num_webhooks >= self.config.max_webhooks_per_client as usize {
@@ -650,22 +671,28 @@ where
650671
}
651672
}
652673

653-
#[derive(Debug, Default)]
674+
#[derive(Debug)]
654675
pub(crate) struct PeerState {
655676
webhooks: Vec<(LSPS5AppName, Webhook)>,
677+
needs_persist: bool,
656678
}
657679

658680
impl PeerState {
659681
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 })
682+
let res =
683+
self.webhooks.iter_mut().find_map(|(n, h)| if n == name { Some(h) } else { None });
684+
self.needs_persist |= true;
685+
res
661686
}
662687

663688
fn webhooks(&self) -> &Vec<(LSPS5AppName, Webhook)> {
664689
&self.webhooks
665690
}
666691

667692
fn webhooks_mut(&mut self) -> &mut Vec<(LSPS5AppName, Webhook)> {
668-
&mut self.webhooks
693+
let res = &mut self.webhooks;
694+
self.needs_persist |= true;
695+
res
669696
}
670697

671698
fn webhooks_len(&self) -> usize {
@@ -685,6 +712,7 @@ impl PeerState {
685712
}
686713

687714
self.webhooks.push((name, hook));
715+
self.needs_persist |= true;
688716
}
689717

690718
fn remove_webhook(&mut self, name: &LSPS5AppName) -> bool {
@@ -697,13 +725,15 @@ impl PeerState {
697725
false
698726
}
699727
});
728+
self.needs_persist |= true;
700729
removed
701730
}
702731

703732
fn reset_notification_cooldown(&mut self) {
704733
for (_, h) in self.webhooks.iter_mut() {
705734
h.last_notification_sent = None;
706735
}
736+
self.needs_persist |= true;
707737
}
708738

709739
// Returns whether the entire state is empty and can be pruned.
@@ -716,6 +746,16 @@ impl PeerState {
716746
}
717747
}
718748

749+
impl Default for PeerState {
750+
fn default() -> Self {
751+
let webhooks = Vec::new();
752+
let needs_persist = true;
753+
Self { webhooks, needs_persist }
754+
}
755+
}
756+
719757
impl_writeable_tlv_based!(PeerState, {
720758
(0, webhooks, required),
759+
(_unused, needs_persist, (static_value, false)),
760+
721761
});

0 commit comments

Comments
 (0)