@@ -30,6 +30,7 @@ use lightning::events::{Event, PathFailure};
30
30
#[ cfg( feature = "std" ) ]
31
31
use lightning:: events:: { EventHandler , EventsProvider } ;
32
32
use lightning:: ln:: channelmanager:: ChannelManager ;
33
+ use lightning:: ln:: msgs:: OnionMessageHandler ;
33
34
use lightning:: ln:: peer_handler:: APeerManager ;
34
35
use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
35
36
use lightning:: routing:: utxo:: UtxoLookup ;
@@ -104,6 +105,11 @@ const PING_TIMER: u64 = 30;
104
105
#[ cfg( test) ]
105
106
const PING_TIMER : u64 = 1 ;
106
107
108
+ #[ cfg( not( test) ) ]
109
+ const ONION_MESSAGE_HANDLER_TIMER : u64 = 10 ;
110
+ #[ cfg( test) ]
111
+ const ONION_MESSAGE_HANDLER_TIMER : u64 = 1 ;
112
+
107
113
/// Prune the network graph of stale entries hourly.
108
114
const NETWORK_PRUNE_TIMER : u64 = 60 * 60 ;
109
115
@@ -270,18 +276,20 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
270
276
}
271
277
272
278
macro_rules! define_run_body {
273
- ( $persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
274
- $channel_manager: ident, $process_channel_manager_events: expr,
275
- $gossip_sync: ident, $peer_manager: ident, $logger: ident, $scorer: ident,
276
- $loop_exit_check: expr, $await: expr, $get_timer: expr, $timer_elapsed: expr,
277
- $check_slow_await: expr)
278
- => { {
279
+ (
280
+ $persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
281
+ $channel_manager: ident, $process_channel_manager_events: expr,
282
+ $peer_manager: ident, $process_onion_message_handler_events: expr, $gossip_sync: ident,
283
+ $logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
284
+ $timer_elapsed: expr, $check_slow_await: expr
285
+ ) => { {
279
286
log_trace!( $logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
280
287
$channel_manager. timer_tick_occurred( ) ;
281
288
log_trace!( $logger, "Rebroadcasting monitor's pending claims on startup" ) ;
282
289
$chain_monitor. rebroadcast_pending_claims( ) ;
283
290
284
291
let mut last_freshness_call = $get_timer( FRESHNESS_TIMER ) ;
292
+ let mut last_onion_message_handler_call = $get_timer( ONION_MESSAGE_HANDLER_TIMER ) ;
285
293
let mut last_ping_call = $get_timer( PING_TIMER ) ;
286
294
let mut last_prune_call = $get_timer( FIRST_NETWORK_PRUNE_TIMER ) ;
287
295
let mut last_scorer_persist_call = $get_timer( SCORER_PERSIST_TIMER ) ;
@@ -291,6 +299,7 @@ macro_rules! define_run_body {
291
299
loop {
292
300
$process_channel_manager_events;
293
301
$process_chain_monitor_events;
302
+ $process_onion_message_handler_events;
294
303
295
304
// Note that the PeerManager::process_events may block on ChannelManager's locks,
296
305
// hence it comes last here. When the ChannelManager finishes whatever it's doing,
@@ -334,6 +343,11 @@ macro_rules! define_run_body {
334
343
$channel_manager. timer_tick_occurred( ) ;
335
344
last_freshness_call = $get_timer( FRESHNESS_TIMER ) ;
336
345
}
346
+ if $timer_elapsed( & mut last_onion_message_handler_call, ONION_MESSAGE_HANDLER_TIMER ) {
347
+ log_trace!( $logger, "Calling OnionMessageHandler's timer_tick_occurred" ) ;
348
+ $peer_manager. onion_message_handler( ) . timer_tick_occurred( ) ;
349
+ last_onion_message_handler_call = $get_timer( ONION_MESSAGE_HANDLER_TIMER ) ;
350
+ }
337
351
if await_slow {
338
352
// On various platforms, we may be starved of CPU cycles for several reasons.
339
353
// E.g. on iOS, if we've been in the background, we will be entirely paused.
@@ -603,8 +617,7 @@ pub async fn process_events_async<
603
617
CM : ' static + Deref < Target = ChannelManager < CW , T , ES , NS , SP , F , R , L > > + Send + Sync ,
604
618
PGS : ' static + Deref < Target = P2PGossipSync < G , UL , L > > + Send + Sync ,
605
619
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > + Send ,
606
- APM : APeerManager + Send + Sync ,
607
- PM : ' static + Deref < Target = APM > + Send + Sync ,
620
+ PM : ' static + Deref + Send + Sync ,
608
621
S : ' static + Deref < Target = SC > + Send + Sync ,
609
622
SC : for < ' b > WriteableScore < ' b > ,
610
623
SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
@@ -627,6 +640,7 @@ where
627
640
L :: Target : ' static + Logger ,
628
641
P :: Target : ' static + Persist < <SP :: Target as SignerProvider >:: EcdsaSigner > ,
629
642
PS :: Target : ' static + Persister < ' a , CW , T , ES , NS , SP , F , R , L , SC > ,
643
+ PM :: Target : APeerManager + Send + Sync ,
630
644
{
631
645
let mut should_break = false ;
632
646
let async_event_handler = |event| {
@@ -650,10 +664,12 @@ where
650
664
event_handler ( event) . await ;
651
665
}
652
666
} ;
653
- define_run_body ! ( persister,
654
- chain_monitor, chain_monitor. process_pending_events_async( async_event_handler) . await ,
667
+ define_run_body ! (
668
+ persister, chain_monitor,
669
+ chain_monitor. process_pending_events_async( async_event_handler) . await ,
655
670
channel_manager, channel_manager. process_pending_events_async( async_event_handler) . await ,
656
- gossip_sync, peer_manager, logger, scorer, should_break, {
671
+ peer_manager, process_onion_message_handler_events_async( & peer_manager, async_event_handler) . await ,
672
+ gossip_sync, logger, scorer, should_break, {
657
673
let fut = Selector {
658
674
a: channel_manager. get_event_or_persistence_needed_future( ) ,
659
675
b: chain_monitor. get_update_future( ) ,
@@ -673,7 +689,29 @@ where
673
689
task:: Poll :: Ready ( exit) => { should_break = exit; true } ,
674
690
task:: Poll :: Pending => false ,
675
691
}
676
- } , mobile_interruptable_platform)
692
+ } , mobile_interruptable_platform
693
+ )
694
+ }
695
+
696
+ #[ cfg( feature = "futures" ) ]
697
+ async fn process_onion_message_handler_events_async <
698
+ EventHandlerFuture : core:: future:: Future < Output = ( ) > ,
699
+ EventHandler : Fn ( Event ) -> EventHandlerFuture ,
700
+ PM : ' static + Deref + Send + Sync ,
701
+ > (
702
+ peer_manager : & PM , handler : EventHandler
703
+ )
704
+ where
705
+ PM :: Target : APeerManager + Send + Sync ,
706
+ {
707
+ use lightning:: events:: EventsProvider ;
708
+
709
+ let events = core:: cell:: RefCell :: new ( Vec :: new ( ) ) ;
710
+ peer_manager. onion_message_handler ( ) . process_pending_events ( & |e| events. borrow_mut ( ) . push ( e) ) ;
711
+
712
+ for event in events. into_inner ( ) {
713
+ handler ( event) . await
714
+ }
677
715
}
678
716
679
717
#[ cfg( feature = "std" ) ]
@@ -742,8 +780,7 @@ impl BackgroundProcessor {
742
780
CM : ' static + Deref < Target = ChannelManager < CW , T , ES , NS , SP , F , R , L > > + Send + Sync ,
743
781
PGS : ' static + Deref < Target = P2PGossipSync < G , UL , L > > + Send + Sync ,
744
782
RGS : ' static + Deref < Target = RapidGossipSync < G , L > > + Send ,
745
- APM : APeerManager + Send + Sync ,
746
- PM : ' static + Deref < Target = APM > + Send + Sync ,
783
+ PM : ' static + Deref + Send + Sync ,
747
784
S : ' static + Deref < Target = SC > + Send + Sync ,
748
785
SC : for < ' b > WriteableScore < ' b > ,
749
786
> (
@@ -763,6 +800,7 @@ impl BackgroundProcessor {
763
800
L :: Target : ' static + Logger ,
764
801
P :: Target : ' static + Persist < <SP :: Target as SignerProvider >:: EcdsaSigner > ,
765
802
PS :: Target : ' static + Persister < ' a , CW , T , ES , NS , SP , F , R , L , SC > ,
803
+ PM :: Target : APeerManager + Send + Sync ,
766
804
{
767
805
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
768
806
let stop_thread_clone = stop_thread. clone ( ) ;
@@ -782,14 +820,18 @@ impl BackgroundProcessor {
782
820
}
783
821
event_handler. handle_event ( event) ;
784
822
} ;
785
- define_run_body ! ( persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
823
+ define_run_body ! (
824
+ persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
786
825
channel_manager, channel_manager. process_pending_events( & event_handler) ,
787
- gossip_sync, peer_manager, logger, scorer, stop_thread. load( Ordering :: Acquire ) ,
826
+ peer_manager,
827
+ peer_manager. onion_message_handler( ) . process_pending_events( & event_handler) ,
828
+ gossip_sync, logger, scorer, stop_thread. load( Ordering :: Acquire ) ,
788
829
{ Sleeper :: from_two_futures(
789
830
channel_manager. get_event_or_persistence_needed_future( ) ,
790
831
chain_monitor. get_update_future( )
791
832
) . wait_timeout( Duration :: from_millis( 100 ) ) ; } ,
792
- |_| Instant :: now( ) , |time: & Instant , dur| time. elapsed( ) . as_secs( ) > dur, false )
833
+ |_| Instant :: now( ) , |time: & Instant , dur| time. elapsed( ) . as_secs( ) > dur, false
834
+ )
793
835
} ) ;
794
836
Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
795
837
}
@@ -1362,9 +1404,11 @@ mod tests {
1362
1404
1363
1405
#[ test]
1364
1406
fn test_timer_tick_called ( ) {
1365
- // Test that `ChannelManager::timer_tick_occurred` is called every `FRESHNESS_TIMER`,
1366
- // `ChainMonitor::rebroadcast_pending_claims` is called every `REBROADCAST_TIMER`, and
1367
- // `PeerManager::timer_tick_occurred` every `PING_TIMER`.
1407
+ // Test that:
1408
+ // - `ChannelManager::timer_tick_occurred` is called every `FRESHNESS_TIMER`,
1409
+ // - `ChainMonitor::rebroadcast_pending_claims` is called every `REBROADCAST_TIMER`,
1410
+ // - `PeerManager::timer_tick_occurred` is called every `PING_TIMER`, and
1411
+ // - `OnionMessageHandler::timer_tick_occurred` is called every `ONION_MESSAGE_HANDLER_TIMER`.
1368
1412
let ( _, nodes) = create_nodes ( 1 , "test_timer_tick_called" ) ;
1369
1413
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1370
1414
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
@@ -1375,9 +1419,11 @@ mod tests {
1375
1419
let desired_log_1 = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
1376
1420
let desired_log_2 = "Calling PeerManager's timer_tick_occurred" . to_string ( ) ;
1377
1421
let desired_log_3 = "Rebroadcasting monitor's pending claims" . to_string ( ) ;
1422
+ let desired_log_4 = "Calling OnionMessageHandler's timer_tick_occurred" . to_string ( ) ;
1378
1423
if log_entries. get ( & ( "lightning_background_processor" , desired_log_1) ) . is_some ( ) &&
1379
1424
log_entries. get ( & ( "lightning_background_processor" , desired_log_2) ) . is_some ( ) &&
1380
- log_entries. get ( & ( "lightning_background_processor" , desired_log_3) ) . is_some ( ) {
1425
+ log_entries. get ( & ( "lightning_background_processor" , desired_log_3) ) . is_some ( ) &&
1426
+ log_entries. get ( & ( "lightning_background_processor" , desired_log_4) ) . is_some ( ) {
1381
1427
break
1382
1428
}
1383
1429
}
0 commit comments