@@ -29,6 +29,8 @@ use lightning::events::{Event, PathFailure};
29
29
use lightning:: events:: EventHandler ;
30
30
#[ cfg( feature = "std" ) ]
31
31
use lightning:: events:: EventsProvider ;
32
+ #[ cfg( feature = "futures" ) ]
33
+ use lightning:: events:: ReplayEvent ;
32
34
33
35
use lightning:: ln:: channelmanager:: AChannelManager ;
34
36
use lightning:: ln:: msgs:: OnionMessageHandler ;
@@ -539,6 +541,7 @@ use core::task;
539
541
/// could setup `process_events_async` like this:
540
542
/// ```
541
543
/// # use lightning::io;
544
+ /// # use lightning::events::ReplayEvent;
542
545
/// # use std::sync::{Arc, RwLock};
543
546
/// # use std::sync::atomic::{AtomicBool, Ordering};
544
547
/// # use std::time::SystemTime;
@@ -556,7 +559,7 @@ use core::task;
556
559
/// # }
557
560
/// # struct EventHandler {}
558
561
/// # impl EventHandler {
559
- /// # async fn handle_event(&self, _: lightning::events::Event) { }
562
+ /// # async fn handle_event(&self, _: lightning::events::Event) -> Result<(), ReplayEvent> { Ok(()) }
560
563
/// # }
561
564
/// # #[derive(Eq, PartialEq, Clone, Hash)]
562
565
/// # struct SocketDescriptor {}
@@ -654,7 +657,7 @@ pub async fn process_events_async<
654
657
G : ' static + Deref < Target = NetworkGraph < L > > + Send + Sync ,
655
658
L : ' static + Deref + Send + Sync ,
656
659
P : ' static + Deref + Send + Sync ,
657
- EventHandlerFuture : core:: future:: Future < Output = ( ) > ,
660
+ EventHandlerFuture : core:: future:: Future < Output = Result < ( ) , ReplayEvent > > ,
658
661
EventHandler : Fn ( Event ) -> EventHandlerFuture ,
659
662
PS : ' static + Deref + Send ,
660
663
M : ' static + Deref < Target = ChainMonitor < <CM :: Target as AChannelManager >:: Signer , CF , T , F , L , P > > + Send + Sync ,
@@ -703,12 +706,16 @@ where
703
706
if update_scorer ( scorer, & event, duration_since_epoch) {
704
707
log_trace ! ( logger, "Persisting scorer after update" ) ;
705
708
if let Err ( e) = persister. persist_scorer ( & scorer) {
706
- log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e)
709
+ log_error ! ( logger, "Error: Failed to persist scorer, check your disk and permissions {}" , e) ;
710
+ // We opt not to abort early on persistence failure here as persisting
711
+ // the scorer is non-critical and we still hope that it will have
712
+ // resolved itself when it is potentially critical in event handling
713
+ // below.
707
714
}
708
715
}
709
716
}
710
717
}
711
- event_handler ( event) . await ;
718
+ event_handler ( event) . await
712
719
} )
713
720
} ;
714
721
define_run_body ! (
@@ -841,7 +848,7 @@ impl BackgroundProcessor {
841
848
}
842
849
}
843
850
}
844
- event_handler. handle_event ( event) ;
851
+ event_handler. handle_event ( event)
845
852
} ;
846
853
define_run_body ! (
847
854
persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
@@ -1425,7 +1432,7 @@ mod tests {
1425
1432
// Initiate the background processors to watch each node.
1426
1433
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1427
1434
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
1428
- let event_handler = |_: _ | { } ;
1435
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1429
1436
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . p2p_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1430
1437
1431
1438
macro_rules! check_persisted_data {
@@ -1493,7 +1500,7 @@ mod tests {
1493
1500
let ( _, nodes) = create_nodes ( 1 , "test_timer_tick_called" ) ;
1494
1501
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1495
1502
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
1496
- let event_handler = |_: _ | { } ;
1503
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1497
1504
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1498
1505
loop {
1499
1506
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
@@ -1522,7 +1529,7 @@ mod tests {
1522
1529
1523
1530
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1524
1531
let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
1525
- let event_handler = |_: _ | { } ;
1532
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1526
1533
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1527
1534
match bg_processor. join ( ) {
1528
1535
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
@@ -1544,7 +1551,7 @@ mod tests {
1544
1551
let persister = Arc :: new ( Persister :: new ( data_dir) . with_manager_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
1545
1552
1546
1553
let bp_future = super :: process_events_async (
1547
- persister, |_: _ | { async { } } , nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1554
+ persister, |_: _ | { async { Ok ( ( ) ) } } , nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1548
1555
nodes[ 0 ] . rapid_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ,
1549
1556
Some ( nodes[ 0 ] . scorer . clone ( ) ) , move |dur : Duration | {
1550
1557
Box :: pin ( async move {
@@ -1568,7 +1575,7 @@ mod tests {
1568
1575
let ( _, nodes) = create_nodes ( 2 , "test_persist_network_graph_error" ) ;
1569
1576
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1570
1577
let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
1571
- let event_handler = |_: _ | { } ;
1578
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1572
1579
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . p2p_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1573
1580
1574
1581
match bg_processor. stop ( ) {
@@ -1586,7 +1593,7 @@ mod tests {
1586
1593
let ( _, nodes) = create_nodes ( 2 , "test_persist_scorer_error" ) ;
1587
1594
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1588
1595
let persister = Arc :: new ( Persister :: new ( data_dir) . with_scorer_error ( std:: io:: ErrorKind :: Other , "test" ) ) ;
1589
- let event_handler = |_: _ | { } ;
1596
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1590
1597
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1591
1598
1592
1599
match bg_processor. stop ( ) {
@@ -1608,11 +1615,14 @@ mod tests {
1608
1615
// Set up a background event handler for FundingGenerationReady events.
1609
1616
let ( funding_generation_send, funding_generation_recv) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1610
1617
let ( channel_pending_send, channel_pending_recv) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1611
- let event_handler = move |event : Event | match event {
1612
- Event :: FundingGenerationReady { .. } => funding_generation_send. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ,
1613
- Event :: ChannelPending { .. } => channel_pending_send. send ( ( ) ) . unwrap ( ) ,
1614
- Event :: ChannelReady { .. } => { } ,
1615
- _ => panic ! ( "Unexpected event: {:?}" , event) ,
1618
+ let event_handler = move |event : Event | {
1619
+ match event {
1620
+ Event :: FundingGenerationReady { .. } => funding_generation_send. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ,
1621
+ Event :: ChannelPending { .. } => channel_pending_send. send ( ( ) ) . unwrap ( ) ,
1622
+ Event :: ChannelReady { .. } => { } ,
1623
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1624
+ }
1625
+ Ok ( ( ) )
1616
1626
} ;
1617
1627
1618
1628
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
@@ -1648,11 +1658,14 @@ mod tests {
1648
1658
1649
1659
// Set up a background event handler for SpendableOutputs events.
1650
1660
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1651
- let event_handler = move |event : Event | match event {
1652
- Event :: SpendableOutputs { .. } => sender. send ( event) . unwrap ( ) ,
1653
- Event :: ChannelReady { .. } => { } ,
1654
- Event :: ChannelClosed { .. } => { } ,
1655
- _ => panic ! ( "Unexpected event: {:?}" , event) ,
1661
+ let event_handler = move |event : Event | {
1662
+ match event {
1663
+ Event :: SpendableOutputs { .. } => sender. send ( event) . unwrap ( ) ,
1664
+ Event :: ChannelReady { .. } => { } ,
1665
+ Event :: ChannelClosed { .. } => { } ,
1666
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
1667
+ }
1668
+ Ok ( ( ) )
1656
1669
} ;
1657
1670
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
1658
1671
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
@@ -1766,7 +1779,7 @@ mod tests {
1766
1779
let ( _, nodes) = create_nodes ( 2 , "test_scorer_persistence" ) ;
1767
1780
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1768
1781
let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
1769
- let event_handler = |_: _ | { } ;
1782
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1770
1783
let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . no_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1771
1784
1772
1785
loop {
@@ -1839,7 +1852,7 @@ mod tests {
1839
1852
let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
1840
1853
let persister = Arc :: new ( Persister :: new ( data_dir) . with_graph_persistence_notifier ( sender) ) ;
1841
1854
1842
- let event_handler = |_: _ | { } ;
1855
+ let event_handler = |_: _ | { Ok ( ( ) ) } ;
1843
1856
let background_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) , nodes[ 0 ] . rapid_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) , Some ( nodes[ 0 ] . scorer . clone ( ) ) ) ;
1844
1857
1845
1858
do_test_not_pruning_network_graph_until_graph_sync_completion ! ( nodes,
@@ -1860,7 +1873,7 @@ mod tests {
1860
1873
1861
1874
let ( exit_sender, exit_receiver) = tokio:: sync:: watch:: channel ( ( ) ) ;
1862
1875
let bp_future = super :: process_events_async (
1863
- persister, |_: _ | { async { } } , nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1876
+ persister, |_: _ | { async { Ok ( ( ) ) } } , nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , Some ( nodes[ 0 ] . messenger . clone ( ) ) ,
1864
1877
nodes[ 0 ] . rapid_gossip_sync ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ,
1865
1878
Some ( nodes[ 0 ] . scorer . clone ( ) ) , move |dur : Duration | {
1866
1879
let mut exit_receiver = exit_receiver. clone ( ) ;
@@ -1987,12 +2000,15 @@ mod tests {
1987
2000
#[ test]
1988
2001
fn test_payment_path_scoring ( ) {
1989
2002
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
1990
- let event_handler = move |event : Event | match event {
1991
- Event :: PaymentPathFailed { .. } => sender. send ( event) . unwrap ( ) ,
1992
- Event :: PaymentPathSuccessful { .. } => sender. send ( event) . unwrap ( ) ,
1993
- Event :: ProbeSuccessful { .. } => sender. send ( event) . unwrap ( ) ,
1994
- Event :: ProbeFailed { .. } => sender. send ( event) . unwrap ( ) ,
1995
- _ => panic ! ( "Unexpected event: {:?}" , event) ,
2003
+ let event_handler = move |event : Event | {
2004
+ match event {
2005
+ Event :: PaymentPathFailed { .. } => sender. send ( event) . unwrap ( ) ,
2006
+ Event :: PaymentPathSuccessful { .. } => sender. send ( event) . unwrap ( ) ,
2007
+ Event :: ProbeSuccessful { .. } => sender. send ( event) . unwrap ( ) ,
2008
+ Event :: ProbeFailed { .. } => sender. send ( event) . unwrap ( ) ,
2009
+ _ => panic ! ( "Unexpected event: {:?}" , event) ,
2010
+ }
2011
+ Ok ( ( ) )
1996
2012
} ;
1997
2013
1998
2014
let ( _, nodes) = create_nodes ( 1 , "test_payment_path_scoring" ) ;
@@ -2025,6 +2041,7 @@ mod tests {
2025
2041
Event :: ProbeFailed { .. } => { sender_ref. send ( event) . await . unwrap ( ) } ,
2026
2042
_ => panic ! ( "Unexpected event: {:?}" , event) ,
2027
2043
}
2044
+ Ok ( ( ) )
2028
2045
}
2029
2046
} ;
2030
2047
0 commit comments