@@ -17,7 +17,8 @@ use lightning::ln::channelmanager::ChannelManager;
1717use lightning:: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
1818use lightning:: ln:: peer_handler:: { PeerManager , SocketDescriptor } ;
1919use lightning:: ln:: peer_handler:: CustomMessageHandler ;
20- use lightning:: util:: events:: { EventHandler , EventsProvider } ;
20+ use lightning:: routing:: network_graph:: NetGraphMsgHandler ;
21+ use lightning:: util:: events:: { Event , EventHandler , EventsProvider } ;
2122use lightning:: util:: logger:: Logger ;
2223use std:: sync:: Arc ;
2324use std:: sync:: atomic:: { AtomicBool , Ordering } ;
@@ -99,6 +100,33 @@ ChannelManagerPersister<Signer, M, T, K, F, L> for Fun where
99100 }
100101}
101102
103+ /// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
104+ struct DecoratingEventHandler <
105+ E : EventHandler ,
106+ N : Deref < Target = NetGraphMsgHandler < A , L > > ,
107+ A : Deref ,
108+ L : Deref ,
109+ >
110+ where A :: Target : chain:: Access , L :: Target : Logger {
111+ event_handler : E ,
112+ net_graph_msg_handler : Option < N > ,
113+ }
114+
115+ impl <
116+ E : EventHandler ,
117+ N : Deref < Target = NetGraphMsgHandler < A , L > > ,
118+ A : Deref ,
119+ L : Deref ,
120+ > EventHandler for DecoratingEventHandler < E , N , A , L >
121+ where A :: Target : chain:: Access , L :: Target : Logger {
122+ fn handle_event ( & self , event : & Event ) {
123+ if let Some ( event_handler) = & self . net_graph_msg_handler {
124+ event_handler. handle_event ( event) ;
125+ }
126+ self . event_handler . handle_event ( event) ;
127+ }
128+ }
129+
102130impl BackgroundProcessor {
103131 /// Start a background thread that takes care of responsibilities enumerated in the [top-level
104132 /// documentation].
@@ -121,18 +149,20 @@ impl BackgroundProcessor {
121149 /// # Event Handling
122150 ///
123151 /// `event_handler` is responsible for handling events that users should be notified of (e.g.,
124- /// payment failed). A user's [`EventHandler`] may be decorated with other handlers to implement
125- /// common functionality. See individual [`Event`]s for further details.
152+ /// payment failed). [`BackgroundProcessor`] may decorate the given [`EventHandler`] with common
153+ /// functionality implemented by other handlers.
154+ /// * [`NetGraphMsgHandler`] if given will update the [`NetworkGraph`] based on payment failures.
126155 ///
127156 /// [top-level documentation]: Self
128157 /// [`join`]: Self::join
129158 /// [`stop`]: Self::stop
130159 /// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
131160 /// [`ChannelManager::write`]: lightning::ln::channelmanager::ChannelManager#impl-Writeable
132161 /// [`FilesystemPersister::persist_manager`]: lightning_persister::FilesystemPersister::persist_manager
133- /// [`Event `]: lightning::util::events::Event
162+ /// [`NetworkGraph `]: lightning::routing::network_graph::NetworkGraph
134163 pub fn start <
135164 Signer : ' static + Sign ,
165+ CA : ' static + Deref + Send + Sync ,
136166 CF : ' static + Deref + Send + Sync ,
137167 CW : ' static + Deref + Send + Sync ,
138168 T : ' static + Deref + Send + Sync ,
@@ -147,11 +177,15 @@ impl BackgroundProcessor {
147177 CMP : ' static + Send + ChannelManagerPersister < Signer , CW , T , K , F , L > ,
148178 M : ' static + Deref < Target = ChainMonitor < Signer , CF , T , F , L , P > > + Send + Sync ,
149179 CM : ' static + Deref < Target = ChannelManager < Signer , CW , T , K , F , L > > + Send + Sync ,
180+ NG : ' static + Deref < Target = NetGraphMsgHandler < CA , L > > + Send + Sync ,
150181 UMH : ' static + Deref + Send + Sync ,
151182 PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , L , UMH > > + Send + Sync ,
152- >
153- ( persister : CMP , event_handler : EH , chain_monitor : M , channel_manager : CM , peer_manager : PM , logger : L ) -> Self
183+ > (
184+ persister : CMP , event_handler : EH , chain_monitor : M , channel_manager : CM ,
185+ net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L
186+ ) -> Self
154187 where
188+ CA :: Target : ' static + chain:: Access ,
155189 CF :: Target : ' static + chain:: Filter ,
156190 CW :: Target : ' static + chain:: Watch < Signer > ,
157191 T :: Target : ' static + BroadcasterInterface ,
@@ -166,6 +200,8 @@ impl BackgroundProcessor {
166200 let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
167201 let stop_thread_clone = stop_thread. clone ( ) ;
168202 let handle = thread:: spawn ( move || -> Result < ( ) , std:: io:: Error > {
203+ let event_handler = DecoratingEventHandler { event_handler, net_graph_msg_handler } ;
204+
169205 log_trace ! ( logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
170206 channel_manager. timer_tick_occurred ( ) ;
171207
@@ -274,6 +310,7 @@ mod tests {
274310 use lightning:: ln:: features:: InitFeatures ;
275311 use lightning:: ln:: msgs:: { ChannelMessageHandler , Init } ;
276312 use lightning:: ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler } ;
313+ use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
277314 use lightning:: util:: config:: UserConfig ;
278315 use lightning:: util:: events:: { Event , MessageSendEventsProvider , MessageSendEvent } ;
279316 use lightning:: util:: ser:: Writeable ;
@@ -301,6 +338,7 @@ mod tests {
301338
302339 struct Node {
303340 node : Arc < SimpleArcChannelManager < ChainMonitor , test_utils:: TestBroadcaster , test_utils:: TestFeeEstimator , test_utils:: TestLogger > > ,
341+ net_graph_msg_handler : Option < Arc < NetGraphMsgHandler < Arc < test_utils:: TestChainSource > , Arc < test_utils:: TestLogger > > > > ,
304342 peer_manager : Arc < PeerManager < TestDescriptor , Arc < test_utils:: TestChannelMessageHandler > , Arc < test_utils:: TestRoutingMessageHandler > , Arc < test_utils:: TestLogger > , IgnoringMessageHandler > > ,
305343 chain_monitor : Arc < ChainMonitor > ,
306344 persister : Arc < FilesystemPersister > ,
@@ -335,15 +373,18 @@ mod tests {
335373 let persister = Arc :: new ( FilesystemPersister :: new ( format ! ( "{}_persister_{}" , persist_dir, i) ) ) ;
336374 let seed = [ i as u8 ; 32 ] ;
337375 let network = Network :: Testnet ;
338- let now = Duration :: from_secs ( genesis_block ( network) . header . time as u64 ) ;
376+ let genesis_block = genesis_block ( network) ;
377+ let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
339378 let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
340379 let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , persister. clone ( ) ) ) ;
341380 let best_block = BestBlock :: from_genesis ( network) ;
342381 let params = ChainParameters { network, best_block } ;
343382 let manager = Arc :: new ( ChannelManager :: new ( fee_estimator. clone ( ) , chain_monitor. clone ( ) , tx_broadcaster. clone ( ) , logger. clone ( ) , keys_manager. clone ( ) , UserConfig :: default ( ) , params) ) ;
383+ let network_graph = NetworkGraph :: new ( genesis_block. header . block_hash ( ) ) ;
384+ let net_graph_msg_handler = Some ( Arc :: new ( NetGraphMsgHandler :: new ( network_graph, Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ) ;
344385 let msg_handler = MessageHandler { chan_handler : Arc :: new ( test_utils:: TestChannelMessageHandler :: new ( ) ) , route_handler : Arc :: new ( test_utils:: TestRoutingMessageHandler :: new ( ) ) } ;
345386 let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, keys_manager. get_node_secret ( ) , & seed, logger. clone ( ) , IgnoringMessageHandler { } ) ) ;
346- let node = Node { node : manager, peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block } ;
387+ let node = Node { node : manager, net_graph_msg_handler , peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block } ;
347388 nodes. push ( node) ;
348389 }
349390
@@ -441,7 +482,7 @@ mod tests {
441482 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
442483 let persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
443484 let event_handler = |_: & _ | { } ;
444- let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
485+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes [ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
445486
446487 macro_rules! check_persisted_data {
447488 ( $node: expr, $filepath: expr, $expected_bytes: expr) => {
@@ -494,7 +535,7 @@ mod tests {
494535 let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
495536 let persister = move |node : & ChannelManager < InMemorySigner , Arc < ChainMonitor > , Arc < test_utils:: TestBroadcaster > , Arc < KeysManager > , Arc < test_utils:: TestFeeEstimator > , Arc < test_utils:: TestLogger > > | FilesystemPersister :: persist_manager ( data_dir. clone ( ) , node) ;
496537 let event_handler = |_: & _ | { } ;
497- let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
538+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes [ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
498539 loop {
499540 let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
500541 let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -516,7 +557,7 @@ mod tests {
516557
517558 let persister = |_: & _ | Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "test" ) ) ;
518559 let event_handler = |_: & _ | { } ;
519- let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
560+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes [ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
520561 match bg_processor. join ( ) {
521562 Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
522563 Err ( e) => {
@@ -538,7 +579,7 @@ mod tests {
538579 let event_handler = move |event : & Event | {
539580 sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
540581 } ;
541- let bg_processor = BackgroundProcessor :: start ( persister. clone ( ) , event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
582+ let bg_processor = BackgroundProcessor :: start ( persister. clone ( ) , event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes [ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
542583
543584 // Open a channel and check that the FundingGenerationReady event was handled.
544585 begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -562,7 +603,7 @@ mod tests {
562603 // Set up a background event handler for SpendableOutputs events.
563604 let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
564605 let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
565- let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
606+ let bg_processor = BackgroundProcessor :: start ( persister, event_handler, nodes[ 0 ] . chain_monitor . clone ( ) , nodes[ 0 ] . node . clone ( ) , nodes[ 0 ] . net_graph_msg_handler . clone ( ) , nodes [ 0 ] . peer_manager . clone ( ) , nodes[ 0 ] . logger . clone ( ) ) ;
566607
567608 // Force close the channel and check that the SpendableOutputs event was handled.
568609 nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
0 commit comments