@@ -17,7 +17,8 @@ use lightning::ln::channelmanager::ChannelManager;
17
17
use lightning:: ln:: msgs:: { ChannelMessageHandler , RoutingMessageHandler } ;
18
18
use lightning:: ln:: peer_handler:: { PeerManager , SocketDescriptor } ;
19
19
use 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 } ;
21
22
use lightning:: util:: logger:: Logger ;
22
23
use std:: sync:: Arc ;
23
24
use std:: sync:: atomic:: { AtomicBool , Ordering } ;
@@ -98,6 +99,33 @@ ChannelManagerPersister<Signer, M, T, K, F, L> for Fun where
98
99
}
99
100
}
100
101
102
+ /// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
103
+ struct DecoratingEventHandler <
104
+ E : EventHandler ,
105
+ N : Deref < Target = NetGraphMsgHandler < A , L > > ,
106
+ A : Deref ,
107
+ L : Deref ,
108
+ >
109
+ where A :: Target : chain:: Access , L :: Target : Logger {
110
+ event_handler : E ,
111
+ net_graph_msg_handler : Option < N > ,
112
+ }
113
+
114
+ impl <
115
+ E : EventHandler ,
116
+ N : Deref < Target = NetGraphMsgHandler < A , L > > ,
117
+ A : Deref ,
118
+ L : Deref ,
119
+ > EventHandler for DecoratingEventHandler < E , N , A , L >
120
+ where A :: Target : chain:: Access , L :: Target : Logger {
121
+ fn handle_event ( & self , event : & Event ) {
122
+ if let Some ( event_handler) = & self . net_graph_msg_handler {
123
+ event_handler. handle_event ( event) ;
124
+ }
125
+ self . event_handler . handle_event ( event) ;
126
+ }
127
+ }
128
+
101
129
impl BackgroundProcessor {
102
130
/// Start a background thread that takes care of responsibilities enumerated in the [top-level
103
131
/// documentation].
@@ -120,18 +148,20 @@ impl BackgroundProcessor {
120
148
/// # Event Handling
121
149
///
122
150
/// `event_handler` is responsible for handling events that users should be notified of (e.g.,
123
- /// payment failed). A user's [`EventHandler`] may be decorated with other handlers to implement
124
- /// common functionality. See individual [`Event`]s for further details.
151
+ /// payment failed). [`BackgroundProcessor`] may decorate the given [`EventHandler`] with common
152
+ /// functionality implemented by other handlers.
153
+ /// * [`NetGraphMsgHandler`] if given will update the [`NetworkGraph`] based on payment failures.
125
154
///
126
155
/// [top-level documentation]: Self
127
156
/// [`join`]: Self::join
128
157
/// [`stop`]: Self::stop
129
158
/// [`ChannelManager`]: lightning::ln::channelmanager::ChannelManager
130
159
/// [`ChannelManager::write`]: lightning::ln::channelmanager::ChannelManager#impl-Writeable
131
160
/// [`FilesystemPersister::persist_manager`]: lightning_persister::FilesystemPersister::persist_manager
132
- /// [`Event `]: lightning::util::events::Event
161
+ /// [`NetworkGraph `]: lightning::routing::network_graph::NetworkGraph
133
162
pub fn start <
134
163
Signer : ' static + Sign ,
164
+ CA : ' static + Deref + Send + Sync ,
135
165
CF : ' static + Deref + Send + Sync ,
136
166
CW : ' static + Deref + Send + Sync ,
137
167
T : ' static + Deref + Send + Sync ,
@@ -146,11 +176,15 @@ impl BackgroundProcessor {
146
176
CMP : ' static + Send + ChannelManagerPersister < Signer , CW , T , K , F , L > ,
147
177
M : ' static + Deref < Target = ChainMonitor < Signer , CF , T , F , L , P > > + Send + Sync ,
148
178
CM : ' static + Deref < Target = ChannelManager < Signer , CW , T , K , F , L > > + Send + Sync ,
179
+ NG : ' static + Deref < Target = NetGraphMsgHandler < CA , L > > + Send + Sync ,
149
180
UMH : ' static + Deref + Send + Sync ,
150
181
PM : ' static + Deref < Target = PeerManager < Descriptor , CMH , RMH , L , UMH > > + Send + Sync ,
151
- >
152
- ( persister : CMP , event_handler : EH , chain_monitor : M , channel_manager : CM , peer_manager : PM , logger : L ) -> Self
182
+ > (
183
+ persister : CMP , event_handler : EH , chain_monitor : M , channel_manager : CM ,
184
+ net_graph_msg_handler : Option < NG > , peer_manager : PM , logger : L
185
+ ) -> Self
153
186
where
187
+ CA :: Target : ' static + chain:: Access ,
154
188
CF :: Target : ' static + chain:: Filter ,
155
189
CW :: Target : ' static + chain:: Watch < Signer > ,
156
190
T :: Target : ' static + BroadcasterInterface ,
@@ -165,6 +199,8 @@ impl BackgroundProcessor {
165
199
let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
166
200
let stop_thread_clone = stop_thread. clone ( ) ;
167
201
let handle = thread:: spawn ( move || -> Result < ( ) , std:: io:: Error > {
202
+ let event_handler = DecoratingEventHandler { event_handler, net_graph_msg_handler } ;
203
+
168
204
log_trace ! ( logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
169
205
channel_manager. timer_tick_occurred ( ) ;
170
206
@@ -273,6 +309,7 @@ mod tests {
273
309
use lightning:: ln:: features:: InitFeatures ;
274
310
use lightning:: ln:: msgs:: { ChannelMessageHandler , Init } ;
275
311
use lightning:: ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler } ;
312
+ use lightning:: routing:: network_graph:: { NetworkGraph , NetGraphMsgHandler } ;
276
313
use lightning:: util:: config:: UserConfig ;
277
314
use lightning:: util:: events:: { Event , MessageSendEventsProvider , MessageSendEvent } ;
278
315
use lightning:: util:: ser:: Writeable ;
@@ -300,6 +337,7 @@ mod tests {
300
337
301
338
struct Node {
302
339
node : Arc < SimpleArcChannelManager < ChainMonitor , test_utils:: TestBroadcaster , test_utils:: TestFeeEstimator , test_utils:: TestLogger > > ,
340
+ net_graph_msg_handler : Option < Arc < NetGraphMsgHandler < Arc < test_utils:: TestChainSource > , Arc < test_utils:: TestLogger > > > > ,
303
341
peer_manager : Arc < PeerManager < TestDescriptor , Arc < test_utils:: TestChannelMessageHandler > , Arc < test_utils:: TestRoutingMessageHandler > , Arc < test_utils:: TestLogger > , IgnoringMessageHandler > > ,
304
342
chain_monitor : Arc < ChainMonitor > ,
305
343
persister : Arc < FilesystemPersister > ,
@@ -334,15 +372,18 @@ mod tests {
334
372
let persister = Arc :: new ( FilesystemPersister :: new ( format ! ( "{}_persister_{}" , persist_dir, i) ) ) ;
335
373
let seed = [ i as u8 ; 32 ] ;
336
374
let network = Network :: Testnet ;
337
- let now = Duration :: from_secs ( genesis_block ( network) . header . time as u64 ) ;
375
+ let genesis_block = genesis_block ( network) ;
376
+ let now = Duration :: from_secs ( genesis_block. header . time as u64 ) ;
338
377
let keys_manager = Arc :: new ( KeysManager :: new ( & seed, now. as_secs ( ) , now. subsec_nanos ( ) ) ) ;
339
378
let chain_monitor = Arc :: new ( chainmonitor:: ChainMonitor :: new ( Some ( chain_source. clone ( ) ) , tx_broadcaster. clone ( ) , logger. clone ( ) , fee_estimator. clone ( ) , persister. clone ( ) ) ) ;
340
379
let best_block = BestBlock :: from_genesis ( network) ;
341
380
let params = ChainParameters { network, best_block } ;
342
381
let manager = Arc :: new ( ChannelManager :: new ( fee_estimator. clone ( ) , chain_monitor. clone ( ) , tx_broadcaster. clone ( ) , logger. clone ( ) , keys_manager. clone ( ) , UserConfig :: default ( ) , params) ) ;
382
+ let network_graph = NetworkGraph :: new ( genesis_block. header . block_hash ( ) ) ;
383
+ let net_graph_msg_handler = Some ( Arc :: new ( NetGraphMsgHandler :: new ( network_graph, Some ( chain_source. clone ( ) ) , logger. clone ( ) ) ) ) ;
343
384
let msg_handler = MessageHandler { chan_handler : Arc :: new ( test_utils:: TestChannelMessageHandler :: new ( ) ) , route_handler : Arc :: new ( test_utils:: TestRoutingMessageHandler :: new ( ) ) } ;
344
385
let peer_manager = Arc :: new ( PeerManager :: new ( msg_handler, keys_manager. get_node_secret ( ) , & seed, logger. clone ( ) , IgnoringMessageHandler { } ) ) ;
345
- let node = Node { node : manager, peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block } ;
386
+ let node = Node { node : manager, net_graph_msg_handler , peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block } ;
346
387
nodes. push ( node) ;
347
388
}
348
389
@@ -440,7 +481,7 @@ mod tests {
440
481
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
441
482
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) ;
442
483
let event_handler = |_: & _ | { } ;
443
- 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 ( ) ) ;
484
+ 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 ( ) ) ;
444
485
445
486
macro_rules! check_persisted_data {
446
487
( $node: expr, $filepath: expr, $expected_bytes: expr) => {
@@ -493,7 +534,7 @@ mod tests {
493
534
let data_dir = nodes[ 0 ] . persister . get_data_dir ( ) ;
494
535
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) ;
495
536
let event_handler = |_: & _ | { } ;
496
- 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 ( ) ) ;
537
+ 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 ( ) ) ;
497
538
loop {
498
539
let log_entries = nodes[ 0 ] . logger . lines . lock ( ) . unwrap ( ) ;
499
540
let desired_log = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
@@ -515,7 +556,7 @@ mod tests {
515
556
516
557
let persister = |_: & _ | Err ( std:: io:: Error :: new ( std:: io:: ErrorKind :: Other , "test" ) ) ;
517
558
let event_handler = |_: & _ | { } ;
518
- 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 ( ) ) ;
559
+ 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 ( ) ) ;
519
560
match bg_processor. join ( ) {
520
561
Ok ( _) => panic ! ( "Expected error persisting manager" ) ,
521
562
Err ( e) => {
@@ -537,7 +578,7 @@ mod tests {
537
578
let event_handler = move |event : & Event | {
538
579
sender. send ( handle_funding_generation_ready ! ( event, channel_value) ) . unwrap ( ) ;
539
580
} ;
540
- 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 ( ) ) ;
581
+ 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 ( ) ) ;
541
582
542
583
// Open a channel and check that the FundingGenerationReady event was handled.
543
584
begin_open_channel ! ( nodes[ 0 ] , nodes[ 1 ] , channel_value) ;
@@ -561,7 +602,7 @@ mod tests {
561
602
// Set up a background event handler for SpendableOutputs events.
562
603
let ( sender, receiver) = std:: sync:: mpsc:: sync_channel ( 1 ) ;
563
604
let event_handler = move |event : & Event | sender. send ( event. clone ( ) ) . unwrap ( ) ;
564
- 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 ( ) ) ;
605
+ 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 ( ) ) ;
565
606
566
607
// Force close the channel and check that the SpendableOutputs event was handled.
567
608
nodes[ 0 ] . node . force_close_channel ( & nodes[ 0 ] . node . list_channels ( ) [ 0 ] . channel_id ) . unwrap ( ) ;
0 commit comments