Skip to content

Commit 82cf511

Browse files
committed
Async event persistance
1 parent d32ccd4 commit 82cf511

7 files changed

Lines changed: 264 additions & 190 deletions

File tree

graduated-rebalancer/src/lib.rs

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -189,15 +189,19 @@ pub enum RebalancerEvent {
189189
/// Trait for handling rebalancer events
190190
pub trait EventHandler: Send + Sync {
191191
/// Handle a rebalancer event
192-
fn handle_event(&self, event: RebalancerEvent);
192+
fn handle_event(&self, event: RebalancerEvent)
193+
-> Pin<Box<dyn Future<Output = ()> + Send + '_>>;
193194
}
194195

195196
/// A no-op event handler that discards all events
196197
#[derive(Debug, Copy, Clone, Default)]
197198
pub struct IgnoringEventHandler;
198199

199200
impl EventHandler for IgnoringEventHandler {
200-
fn handle_event(&self, _event: RebalancerEvent) {
201+
fn handle_event(
202+
&self, _event: RebalancerEvent,
203+
) -> Pin<Box<dyn Future<Output = ()> + Send + '_>> {
204+
Box::pin(async move {})
201205
// Do nothing
202206
}
203207
}
@@ -273,11 +277,13 @@ where
273277
rebalance_id.as_hex()
274278
);
275279

276-
self.event_handler.handle_event(RebalancerEvent::RebalanceInitiated {
277-
trigger_id: params.id,
278-
trusted_rebalance_payment_id: rebalance_id,
279-
amount_msat: transfer_amt.milli_sats(),
280-
});
280+
self.event_handler
281+
.handle_event(RebalancerEvent::RebalanceInitiated {
282+
trigger_id: params.id,
283+
trusted_rebalance_payment_id: rebalance_id,
284+
amount_msat: transfer_amt.milli_sats(),
285+
})
286+
.await;
281287

282288
let ln_payment = match self
283289
.ln_wallet
@@ -310,14 +316,16 @@ where
310316
ln_payment.id.as_hex(),
311317
);
312318

313-
self.event_handler.handle_event(RebalancerEvent::RebalanceSuccessful {
314-
trigger_id: params.id,
315-
trusted_rebalance_payment_id: rebalance_id,
316-
ln_rebalance_payment_id: ln_payment.id,
317-
amount_msat: transfer_amt.milli_sats(),
318-
fee_msat: ln_payment.fee_paid_msat.unwrap_or_default()
319-
+ trusted_payment.fee_paid_msat.unwrap_or_default(),
320-
});
319+
self.event_handler
320+
.handle_event(RebalancerEvent::RebalanceSuccessful {
321+
trigger_id: params.id,
322+
trusted_rebalance_payment_id: rebalance_id,
323+
ln_rebalance_payment_id: ln_payment.id,
324+
amount_msat: transfer_amt.milli_sats(),
325+
fee_msat: ln_payment.fee_paid_msat.unwrap_or_default()
326+
+ trusted_payment.fee_paid_msat.unwrap_or_default(),
327+
})
328+
.await;
321329
},
322330
Err(e) => {
323331
log_info!(self.logger, "Rebalance trusted transaction failed with {e:?}",);
@@ -368,11 +376,13 @@ where
368376
(channel_outpoint, user_chan_id)
369377
};
370378

371-
self.event_handler.handle_event(RebalancerEvent::OnChainRebalanceInitiated {
372-
trigger_id: params.id,
373-
user_channel_id,
374-
channel_outpoint,
375-
});
379+
self.event_handler
380+
.handle_event(RebalancerEvent::OnChainRebalanceInitiated {
381+
trigger_id: params.id,
382+
user_channel_id,
383+
channel_outpoint,
384+
})
385+
.await;
376386
}
377387

378388
/// Stops the rebalancer, waits for any active rebalances to complete

orange-sdk/src/event.rs

Lines changed: 83 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ use ldk_node::bitcoin::{OutPoint, Txid};
66
use ldk_node::lightning::events::{ClosureReason, PaymentFailureReason};
77
use ldk_node::lightning::ln::types::ChannelId;
88
use ldk_node::lightning::util::logger::Logger as _;
9-
use ldk_node::lightning::util::persist::KVStoreSync;
9+
use ldk_node::lightning::util::persist::KVStore;
1010
use ldk_node::lightning::util::ser::{Writeable, Writer};
1111
use ldk_node::lightning::{impl_writeable_tlv_based_enum, log_debug, log_error, log_warn};
1212
use ldk_node::lightning_types::payment::{PaymentHash, PaymentPreimage};
1313
use ldk_node::payment::{ConfirmationStatus, PaymentKind};
1414
use ldk_node::{CustomTlvRecord, DynStore, UserChannelId};
1515

1616
use std::collections::VecDeque;
17-
use std::sync::{Arc, Mutex};
17+
use std::sync::Arc;
1818
use std::task::{Poll, Waker};
19-
use tokio::sync::watch;
19+
use tokio::sync::{Mutex, watch};
2020

2121
/// The event queue will be persisted under this key.
2222
pub(crate) const EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE: &str = "";
@@ -218,52 +218,55 @@ impl EventQueue {
218218
Self { queue, waker, kv_store, logger }
219219
}
220220

221-
pub(crate) fn add_event(&self, event: Event) -> Result<(), ldk_node::lightning::io::Error> {
221+
pub(crate) async fn add_event(
222+
&self, event: Event,
223+
) -> Result<(), ldk_node::lightning::io::Error> {
222224
{
223-
let mut locked_queue = self.queue.lock().unwrap();
225+
let mut locked_queue = self.queue.lock().await;
224226
locked_queue.push_back(event);
225-
self.persist_queue(&locked_queue)?;
227+
self.persist_queue(&locked_queue).await?;
226228
}
227229

228-
if let Some(waker) = self.waker.lock().unwrap().take() {
230+
if let Some(waker) = self.waker.lock().await.take() {
229231
waker.wake();
230232
}
231233
Ok(())
232234
}
233235

234-
pub(crate) fn next_event(&self) -> Option<Event> {
235-
let locked_queue = self.queue.lock().unwrap();
236+
pub(crate) async fn next_event(&self) -> Option<Event> {
237+
let locked_queue = self.queue.lock().await;
236238
locked_queue.front().cloned()
237239
}
238240

239241
pub(crate) async fn next_event_async(&self) -> Event {
240242
EventFuture { event_queue: Arc::clone(&self.queue), waker: Arc::clone(&self.waker) }.await
241243
}
242244

243-
pub(crate) fn event_handled(&self) -> Result<(), ldk_node::lightning::io::Error> {
245+
pub(crate) async fn event_handled(&self) -> Result<(), ldk_node::lightning::io::Error> {
244246
{
245-
let mut locked_queue = self.queue.lock().unwrap();
247+
let mut locked_queue = self.queue.lock().await;
246248
locked_queue.pop_front();
247-
self.persist_queue(&locked_queue)?;
249+
self.persist_queue(&locked_queue).await?;
248250
}
249251

250-
if let Some(waker) = self.waker.lock().unwrap().take() {
252+
if let Some(waker) = self.waker.lock().await.take() {
251253
waker.wake();
252254
}
253255
Ok(())
254256
}
255257

256-
fn persist_queue(
258+
async fn persist_queue(
257259
&self, locked_queue: &VecDeque<Event>,
258260
) -> Result<(), ldk_node::lightning::io::Error> {
259261
let data = EventQueueSerWrapper(locked_queue).encode();
260-
KVStoreSync::write(
262+
KVStore::write(
261263
self.kv_store.as_ref(),
262264
EVENT_QUEUE_PERSISTENCE_PRIMARY_NAMESPACE,
263265
EVENT_QUEUE_PERSISTENCE_SECONDARY_NAMESPACE,
264266
EVENT_QUEUE_PERSISTENCE_KEY,
265267
data,
266268
)
269+
.await
267270
.map_err(|e| {
268271
log_error!(
269272
self.logger.as_ref(),
@@ -302,10 +305,12 @@ impl Future for EventFuture {
302305
fn poll(
303306
self: core::pin::Pin<&mut Self>, cx: &mut core::task::Context<'_>,
304307
) -> Poll<Self::Output> {
305-
if let Some(event) = self.event_queue.lock().unwrap().front() {
306-
Poll::Ready(event.clone())
308+
if let Some(event) = self.event_queue.try_lock().ok().and_then(|q| q.front().cloned()) {
309+
Poll::Ready(event)
307310
} else {
308-
*self.waker.lock().unwrap() = Some(cx.waker().clone());
311+
if let Ok(mut waker) = self.waker.try_lock() {
312+
*waker = Some(cx.waker().clone());
313+
}
309314
Poll::Pending
310315
}
311316
}
@@ -338,22 +343,30 @@ impl LdkEventHandler {
338343
log_error!(self.logger, "Failed to set preimage for payment {payment_id:?}");
339344
}
340345

341-
if let Err(e) = self.event_queue.add_event(Event::PaymentSuccessful {
342-
payment_id,
343-
payment_hash,
344-
payment_preimage: preimage,
345-
fee_paid_msat,
346-
}) {
346+
if let Err(e) = self
347+
.event_queue
348+
.add_event(Event::PaymentSuccessful {
349+
payment_id,
350+
payment_hash,
351+
payment_preimage: preimage,
352+
fee_paid_msat,
353+
})
354+
.await
355+
{
347356
log_error!(self.logger, "Failed to add PaymentSuccessful event: {e:?}");
348357
return;
349358
}
350359
},
351360
ldk_node::Event::PaymentFailed { payment_id, payment_hash, reason } => {
352-
if let Err(e) = self.event_queue.add_event(Event::PaymentFailed {
353-
payment_id: PaymentId::SelfCustodial(payment_id.unwrap().0), // safe
354-
payment_hash,
355-
reason,
356-
}) {
361+
if let Err(e) = self
362+
.event_queue
363+
.add_event(Event::PaymentFailed {
364+
payment_id: PaymentId::SelfCustodial(payment_id.unwrap().0), // safe
365+
payment_hash,
366+
reason,
367+
})
368+
.await
369+
{
357370
log_error!(self.logger, "Failed to add PaymentFailed event: {e:?}");
358371
return;
359372
}
@@ -373,13 +386,17 @@ impl LdkEventHandler {
373386
}
374387
});
375388

376-
if let Err(e) = self.event_queue.add_event(Event::PaymentReceived {
377-
payment_id: PaymentId::SelfCustodial(payment_id.0),
378-
payment_hash,
379-
amount_msat,
380-
custom_records,
381-
lsp_fee_msats,
382-
}) {
389+
if let Err(e) = self
390+
.event_queue
391+
.add_event(Event::PaymentReceived {
392+
payment_id: PaymentId::SelfCustodial(payment_id.0),
393+
payment_hash,
394+
amount_msat,
395+
custom_records,
396+
lsp_fee_msats,
397+
})
398+
.await
399+
{
383400
log_error!(self.logger, "Failed to add PaymentReceived event: {e:?}");
384401
}
385402
let _ = self.payment_receipt_sender.send(());
@@ -402,12 +419,16 @@ impl LdkEventHandler {
402419
} => {
403420
let funding_txo = funding_txo.unwrap(); // safe
404421

405-
if let Err(e) = self.event_queue.add_event(Event::ChannelOpened {
406-
channel_id,
407-
user_channel_id,
408-
counterparty_node_id: counterparty_node_id.unwrap(), // safe
409-
funding_txo,
410-
}) {
422+
if let Err(e) = self
423+
.event_queue
424+
.add_event(Event::ChannelOpened {
425+
channel_id,
426+
user_channel_id,
427+
counterparty_node_id: counterparty_node_id.unwrap(), // safe
428+
funding_txo,
429+
})
430+
.await
431+
{
411432
log_error!(self.logger, "Failed to add ChannelOpened event: {e:?}");
412433
return;
413434
}
@@ -423,12 +444,16 @@ impl LdkEventHandler {
423444
// try to reopen the channel.
424445
store::set_rebalance_enabled(self.event_queue.kv_store.as_ref(), false);
425446

426-
if let Err(e) = self.event_queue.add_event(Event::ChannelClosed {
427-
channel_id,
428-
user_channel_id,
429-
counterparty_node_id: counterparty_node_id.unwrap(), // safe
430-
reason,
431-
}) {
447+
if let Err(e) = self
448+
.event_queue
449+
.add_event(Event::ChannelClosed {
450+
channel_id,
451+
user_channel_id,
452+
counterparty_node_id: counterparty_node_id.unwrap(), // safe
453+
reason,
454+
})
455+
.await
456+
{
432457
log_error!(self.logger, "Failed to add ChannelClosed event: {e:?}");
433458
return;
434459
}
@@ -442,12 +467,16 @@ impl LdkEventHandler {
442467
log_debug!(self.logger, "Received SplicePending event {event:?}");
443468
let _ = self.splice_pending_sender.send(user_channel_id.0);
444469

445-
if let Err(e) = self.event_queue.add_event(Event::SplicePending {
446-
channel_id,
447-
user_channel_id,
448-
counterparty_node_id,
449-
new_funding_txo,
450-
}) {
470+
if let Err(e) = self
471+
.event_queue
472+
.add_event(Event::SplicePending {
473+
channel_id,
474+
user_channel_id,
475+
counterparty_node_id,
476+
new_funding_txo,
477+
})
478+
.await
479+
{
451480
log_error!(self.logger, "Failed to add SplicePending event: {e:?}");
452481
return;
453482
}

orange-sdk/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1305,7 +1305,7 @@ impl Wallet {
13051305
/// **Caution:** Users must handle events as quickly as possible to prevent a large event backlog,
13061306
/// which can increase the memory footprint of [`Wallet`].
13071307
pub fn next_event(&self) -> Option<Event> {
1308-
self.inner.event_queue.next_event()
1308+
self.inner.runtime.block_on(self.inner.event_queue.next_event())
13091309
}
13101310

13111311
/// Returns the next event in the event queue.
@@ -1339,7 +1339,7 @@ impl Wallet {
13391339
///
13401340
/// **Note:** This **MUST** be called after each event has been handled.
13411341
pub fn event_handled(&self) -> Result<(), ()> {
1342-
self.inner.event_queue.event_handled().map_err(|e| {
1342+
self.inner.runtime.block_on(self.inner.event_queue.event_handled()).map_err(|e| {
13431343
log_error!(
13441344
self.inner.logger,
13451345
"Couldn't mark event handled due to persistence failure: {e}"

0 commit comments

Comments
 (0)