mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-03-10 05:33:40 +01:00
Process OnionMessageHandler events in background
OnionMessageHandler implementations now also implement EventsProvider. Update lightning-background-processor to also process any events the PeerManager's OnionMessageHandler provides.
This commit is contained in:
parent
ce68f223e9
commit
6ca81ff2bb
2 changed files with 35 additions and 5 deletions
|
@ -273,9 +273,9 @@ macro_rules! define_run_body {
|
||||||
(
|
(
|
||||||
$persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
|
$persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
|
||||||
$channel_manager: ident, $process_channel_manager_events: expr,
|
$channel_manager: ident, $process_channel_manager_events: expr,
|
||||||
$peer_manager: ident, $gossip_sync: ident, $logger: ident, $scorer: ident,
|
$peer_manager: ident, $process_onion_message_handler_events: expr, $gossip_sync: ident,
|
||||||
$loop_exit_check: expr, $await: expr, $get_timer: expr, $timer_elapsed: expr,
|
$logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
|
||||||
$check_slow_await: expr
|
$timer_elapsed: expr, $check_slow_await: expr
|
||||||
) => { {
|
) => { {
|
||||||
log_trace!($logger, "Calling ChannelManager's timer_tick_occurred on startup");
|
log_trace!($logger, "Calling ChannelManager's timer_tick_occurred on startup");
|
||||||
$channel_manager.timer_tick_occurred();
|
$channel_manager.timer_tick_occurred();
|
||||||
|
@ -292,6 +292,7 @@ macro_rules! define_run_body {
|
||||||
loop {
|
loop {
|
||||||
$process_channel_manager_events;
|
$process_channel_manager_events;
|
||||||
$process_chain_monitor_events;
|
$process_chain_monitor_events;
|
||||||
|
$process_onion_message_handler_events;
|
||||||
|
|
||||||
// Note that the PeerManager::process_events may block on ChannelManager's locks,
|
// Note that the PeerManager::process_events may block on ChannelManager's locks,
|
||||||
// hence it comes last here. When the ChannelManager finishes whatever it's doing,
|
// hence it comes last here. When the ChannelManager finishes whatever it's doing,
|
||||||
|
@ -655,7 +656,8 @@ where
|
||||||
persister, chain_monitor,
|
persister, chain_monitor,
|
||||||
chain_monitor.process_pending_events_async(async_event_handler).await,
|
chain_monitor.process_pending_events_async(async_event_handler).await,
|
||||||
channel_manager, channel_manager.process_pending_events_async(async_event_handler).await,
|
channel_manager, channel_manager.process_pending_events_async(async_event_handler).await,
|
||||||
peer_manager, gossip_sync, logger, scorer, should_break, {
|
peer_manager, process_onion_message_handler_events_async(&peer_manager, async_event_handler).await,
|
||||||
|
gossip_sync, logger, scorer, should_break, {
|
||||||
let fut = Selector {
|
let fut = Selector {
|
||||||
a: channel_manager.get_event_or_persistence_needed_future(),
|
a: channel_manager.get_event_or_persistence_needed_future(),
|
||||||
b: chain_monitor.get_update_future(),
|
b: chain_monitor.get_update_future(),
|
||||||
|
@ -679,6 +681,27 @@ where
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "futures")]
|
||||||
|
async fn process_onion_message_handler_events_async<
|
||||||
|
EventHandlerFuture: core::future::Future<Output = ()>,
|
||||||
|
EventHandler: Fn(Event) -> EventHandlerFuture,
|
||||||
|
PM: 'static + Deref + Send + Sync,
|
||||||
|
>(
|
||||||
|
peer_manager: &PM, handler: EventHandler
|
||||||
|
)
|
||||||
|
where
|
||||||
|
PM::Target: APeerManager + Send + Sync,
|
||||||
|
{
|
||||||
|
use lightning::events::EventsProvider;
|
||||||
|
|
||||||
|
let events = core::cell::RefCell::new(Vec::new());
|
||||||
|
peer_manager.onion_message_handler().process_pending_events(&|e| events.borrow_mut().push(e));
|
||||||
|
|
||||||
|
for event in events.into_inner() {
|
||||||
|
handler(event).await
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
impl BackgroundProcessor {
|
impl BackgroundProcessor {
|
||||||
/// Start a background thread that takes care of responsibilities enumerated in the [top-level
|
/// Start a background thread that takes care of responsibilities enumerated in the [top-level
|
||||||
|
@ -788,7 +811,9 @@ impl BackgroundProcessor {
|
||||||
define_run_body!(
|
define_run_body!(
|
||||||
persister, chain_monitor, chain_monitor.process_pending_events(&event_handler),
|
persister, chain_monitor, chain_monitor.process_pending_events(&event_handler),
|
||||||
channel_manager, channel_manager.process_pending_events(&event_handler),
|
channel_manager, channel_manager.process_pending_events(&event_handler),
|
||||||
peer_manager, gossip_sync, logger, scorer, stop_thread.load(Ordering::Acquire),
|
peer_manager,
|
||||||
|
peer_manager.onion_message_handler().process_pending_events(&event_handler),
|
||||||
|
gossip_sync, logger, scorer, stop_thread.load(Ordering::Acquire),
|
||||||
{ Sleeper::from_two_futures(
|
{ Sleeper::from_two_futures(
|
||||||
channel_manager.get_event_or_persistence_needed_future(),
|
channel_manager.get_event_or_persistence_needed_future(),
|
||||||
chain_monitor.get_update_future()
|
chain_monitor.get_update_future()
|
||||||
|
|
|
@ -684,6 +684,8 @@ pub trait APeerManager {
|
||||||
type NS: Deref<Target=Self::NST>;
|
type NS: Deref<Target=Self::NST>;
|
||||||
/// Gets a reference to the underlying [`PeerManager`].
|
/// Gets a reference to the underlying [`PeerManager`].
|
||||||
fn as_ref(&self) -> &PeerManager<Self::Descriptor, Self::CM, Self::RM, Self::OM, Self::L, Self::CMH, Self::NS>;
|
fn as_ref(&self) -> &PeerManager<Self::Descriptor, Self::CM, Self::RM, Self::OM, Self::L, Self::CMH, Self::NS>;
|
||||||
|
/// Returns the peer manager's [`OnionMessageHandler`].
|
||||||
|
fn onion_message_handler(&self) -> &Self::OMT;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CMH: Deref, NS: Deref>
|
impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CMH: Deref, NS: Deref>
|
||||||
|
@ -709,6 +711,9 @@ APeerManager for PeerManager<Descriptor, CM, RM, OM, L, CMH, NS> where
|
||||||
type NST = <NS as Deref>::Target;
|
type NST = <NS as Deref>::Target;
|
||||||
type NS = NS;
|
type NS = NS;
|
||||||
fn as_ref(&self) -> &PeerManager<Descriptor, CM, RM, OM, L, CMH, NS> { self }
|
fn as_ref(&self) -> &PeerManager<Descriptor, CM, RM, OM, L, CMH, NS> { self }
|
||||||
|
fn onion_message_handler(&self) -> &Self::OMT {
|
||||||
|
self.message_handler.onion_message_handler.deref()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
|
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
|
||||||
|
|
Loading…
Add table
Reference in a new issue