Skip to content

Commit bd4f46c

Browse files
committed
Parameterize NetworkGraph with Logger
P2PGossipSync logs before delegating to NetworkGraph in its EventHandler. In order to share this handling with RapidGossipSync, NetworkGraph needs to take a logger so that it can implement EventHandler instead.
1 parent 0f73d6a commit bd4f46c

File tree

15 files changed

+212
-177
lines changed

15 files changed

+212
-177
lines changed

fuzz/src/full_stack.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ type ChannelMan = ChannelManager<
163163
EnforcingSigner,
164164
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
165165
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
166-
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<P2PGossipSync<Arc<NetworkGraph>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
166+
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<P2PGossipSync<Arc<NetworkGraph<Arc<dyn Logger>>>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
167167

168168
struct MoneyLossDetector<'a> {
169169
manager: Arc<ChannelMan>,
@@ -395,7 +395,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
395395
// it's easier to just increment the counter here so the keys don't change.
396396
keys_manager.counter.fetch_sub(1, Ordering::AcqRel);
397397
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret(Recipient::Node).unwrap());
398-
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash()));
398+
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash(), Arc::clone(&logger)));
399399
let gossip_sync = Arc::new(P2PGossipSync::new(Arc::clone(&network_graph), None, Arc::clone(&logger)));
400400
let scorer = FixedPenaltyScorer::with_penalty(0);
401401

@@ -460,7 +460,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
460460
final_cltv_expiry_delta: 42,
461461
};
462462
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
463-
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
463+
let route = match find_route(&our_id, &params, &network_graph.read_only(), None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
464464
Ok(route) => route,
465465
Err(_) => return,
466466
};
@@ -484,7 +484,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
484484
final_cltv_expiry_delta: 42,
485485
};
486486
let random_seed_bytes: [u8; 32] = keys_manager.get_secure_random_bytes();
487-
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
487+
let mut route = match find_route(&our_id, &params, &network_graph.read_only(), None, Arc::clone(&logger), &scorer, &random_seed_bytes) {
488488
Ok(route) => route,
489489
Err(_) => return,
490490
};

fuzz/src/process_network_graph.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
// Imports that need to be added manually
2+
use lightning::util::logger::Logger;
23
use lightning_rapid_gossip_sync::RapidGossipSync;
4+
35
use utils::test_logger;
46

7+
use std::sync::Arc;
8+
59
/// Actual fuzz test, method signature and name are fixed
6-
fn do_test(data: &[u8]) {
10+
fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
711
let block_hash = bitcoin::BlockHash::default();
8-
let network_graph = lightning::routing::gossip::NetworkGraph::new(block_hash);
12+
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
13+
let network_graph = lightning::routing::gossip::NetworkGraph::new(block_hash, logger);
914
let rapid_sync = RapidGossipSync::new(&network_graph);
1015
let _ = rapid_sync.update_network_graph(data);
1116
}
1217

1318
/// Method that needs to be added manually, {name}_test
14-
pub fn process_network_graph_test<Out: test_logger::Output>(data: &[u8], _out: Out) {
15-
do_test(data);
19+
pub fn process_network_graph_test<Out: test_logger::Output>(data: &[u8], out: Out) {
20+
do_test(data, out);
1621
}
1722

1823
/// Method that needs to be added manually, {name}_run
1924
#[no_mangle]
2025
pub extern "C" fn process_network_graph_run(data: *const u8, datalen: usize) {
21-
do_test(unsafe { std::slice::from_raw_parts(data, datalen) });
26+
do_test(unsafe { std::slice::from_raw_parts(data, datalen) }, test_logger::DevNull {});
2227
}

fuzz/src/router.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
162162
let logger: Arc<dyn Logger> = Arc::new(test_logger::TestLogger::new("".to_owned(), out));
163163

164164
let our_pubkey = get_pubkey!();
165-
let net_graph = NetworkGraph::new(genesis_block(Network::Bitcoin).header.block_hash());
165+
let net_graph = NetworkGraph::new(genesis_block(Network::Bitcoin).header.block_hash(), Arc::clone(&logger));
166166

167167
let mut node_pks = HashSet::new();
168168
let mut scid = 42;
@@ -267,7 +267,7 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
267267
final_value_msat: slice_to_be64(get_slice!(8)),
268268
final_cltv_expiry_delta: slice_to_be32(get_slice!(4)),
269269
};
270-
let _ = find_route(&our_pubkey, &route_params, &net_graph,
270+
let _ = find_route(&our_pubkey, &route_params, &net_graph.read_only(),
271271
first_hops.map(|c| c.iter().collect::<Vec<_>>()).as_ref().map(|a| a.as_slice()),
272272
Arc::clone(&logger), &scorer, &random_seed_bytes);
273273
}

lightning-background-processor/src/lib.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ const FIRST_NETWORK_PRUNE_TIMER: u64 = 1;
9494
struct DecoratingEventHandler<
9595
E: EventHandler,
9696
P: Deref<Target = P2PGossipSync<G, A, L>>,
97-
G: Deref<Target = NetworkGraph>,
97+
G: Deref<Target = NetworkGraph<L>>,
9898
A: Deref,
9999
L: Deref,
100100
>
@@ -106,7 +106,7 @@ where A::Target: chain::Access, L::Target: Logger {
106106
impl<
107107
E: EventHandler,
108108
P: Deref<Target = P2PGossipSync<G, A, L>>,
109-
G: Deref<Target = NetworkGraph>,
109+
G: Deref<Target = NetworkGraph<L>>,
110110
A: Deref,
111111
L: Deref,
112112
> EventHandler for DecoratingEventHandler<E, P, G, A, L>
@@ -173,7 +173,7 @@ impl BackgroundProcessor {
173173
T: 'static + Deref + Send + Sync,
174174
K: 'static + Deref + Send + Sync,
175175
F: 'static + Deref + Send + Sync,
176-
G: 'static + Deref<Target = NetworkGraph> + Send + Sync,
176+
G: 'static + Deref<Target = NetworkGraph<L>> + Send + Sync,
177177
L: 'static + Deref + Send + Sync,
178178
P: 'static + Deref + Send + Sync,
179179
Descriptor: 'static + SocketDescriptor + Send + Sync,
@@ -188,7 +188,7 @@ impl BackgroundProcessor {
188188
PM: 'static + Deref<Target = PeerManager<Descriptor, CMH, RMH, L, UMH>> + Send + Sync,
189189
S: 'static + Deref<Target = SC> + Send + Sync,
190190
SC: WriteableScore<'a>,
191-
RGS: 'static + Deref<Target = RapidGossipSync<G>> + Send
191+
RGS: 'static + Deref<Target = RapidGossipSync<G, L>> + Send
192192
>(
193193
persister: PS, event_handler: EH, chain_monitor: M, channel_manager: CM,
194194
p2p_gossip_sync: Option<PGS>, peer_manager: PM, logger: L, scorer: Option<S>,
@@ -442,16 +442,16 @@ mod tests {
442442

443443
struct Node {
444444
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestLogger>>,
445-
p2p_gossip_sync: Option<Arc<P2PGossipSync<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
445+
p2p_gossip_sync: Option<Arc<P2PGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
446446
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
447447
chain_monitor: Arc<ChainMonitor>,
448448
persister: Arc<FilesystemPersister>,
449449
tx_broadcaster: Arc<test_utils::TestBroadcaster>,
450-
network_graph: Arc<NetworkGraph>,
450+
network_graph: Arc<NetworkGraph<Arc<test_utils::TestLogger>>>,
451451
logger: Arc<test_utils::TestLogger>,
452452
best_block: BestBlock,
453453
scorer: Arc<Mutex<FixedPenaltyScorer>>,
454-
rapid_gossip_sync: Option<Arc<RapidGossipSync<Arc<NetworkGraph>>>>
454+
rapid_gossip_sync: Option<Arc<RapidGossipSync<Arc<NetworkGraph<Arc<test_utils::TestLogger>>>, Arc<test_utils::TestLogger>>>>,
455455
}
456456

457457
impl Drop for Node {
@@ -546,7 +546,7 @@ mod tests {
546546
let best_block = BestBlock::from_genesis(network);
547547
let params = ChainParameters { network, best_block };
548548
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
549-
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash()));
549+
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash(), logger.clone()));
550550
let p2p_gossip_sync = Some(Arc::new(P2PGossipSync::new(network_graph.clone(), Some(chain_source.clone()), logger.clone())));
551551
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new() )};
552552
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(Recipient::Node).unwrap(), &seed, logger.clone(), IgnoringMessageHandler{}));

lightning-invoice/src/utils.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -440,13 +440,13 @@ fn filter_channels(channels: Vec<ChannelDetails>, min_inbound_capacity_msat: Opt
440440
}
441441

442442
/// A [`Router`] implemented using [`find_route`].
443-
pub struct DefaultRouter<G: Deref<Target = NetworkGraph>, L: Deref> where L::Target: Logger {
443+
pub struct DefaultRouter<G: Deref<Target = NetworkGraph<L>>, L: Deref> where L::Target: Logger {
444444
network_graph: G,
445445
logger: L,
446446
random_seed_bytes: Mutex<[u8; 32]>,
447447
}
448448

449-
impl<G: Deref<Target = NetworkGraph>, L: Deref> DefaultRouter<G, L> where L::Target: Logger {
449+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref> DefaultRouter<G, L> where L::Target: Logger {
450450
/// Creates a new router using the given [`NetworkGraph`], a [`Logger`], and a randomness source
451451
/// `random_seed_bytes`.
452452
pub fn new(network_graph: G, logger: L, random_seed_bytes: [u8; 32]) -> Self {
@@ -455,18 +455,19 @@ impl<G: Deref<Target = NetworkGraph>, L: Deref> DefaultRouter<G, L> where L::Tar
455455
}
456456
}
457457

458-
impl<G: Deref<Target = NetworkGraph>, L: Deref, S: Score> Router<S> for DefaultRouter<G, L>
458+
impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, S: Score> Router<S> for DefaultRouter<G, L>
459459
where L::Target: Logger {
460460
fn find_route(
461461
&self, payer: &PublicKey, params: &RouteParameters, _payment_hash: &PaymentHash,
462462
first_hops: Option<&[&ChannelDetails]>, scorer: &S
463463
) -> Result<Route, LightningError> {
464+
let network_graph = self.network_graph.read_only();
464465
let random_seed_bytes = {
465466
let mut locked_random_seed_bytes = self.random_seed_bytes.lock().unwrap();
466467
*locked_random_seed_bytes = sha256::Hash::hash(&*locked_random_seed_bytes).into_inner();
467468
*locked_random_seed_bytes
468469
};
469-
find_route(payer, params, &*self.network_graph, first_hops, &*self.logger, scorer, &random_seed_bytes)
470+
find_route(payer, params, &network_graph, first_hops, &*self.logger, scorer, &random_seed_bytes)
470471
}
471472
}
472473

@@ -566,12 +567,12 @@ mod test {
566567
final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
567568
};
568569
let first_hops = nodes[0].node.list_usable_channels();
569-
let network_graph = node_cfgs[0].network_graph;
570+
let network_graph = &node_cfgs[0].network_graph;
570571
let logger = test_utils::TestLogger::new();
571572
let scorer = test_utils::TestScorer::with_penalty(0);
572573
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
573574
let route = find_route(
574-
&nodes[0].node.get_our_node_id(), &route_params, network_graph,
575+
&nodes[0].node.get_our_node_id(), &route_params, &network_graph.read_only(),
575576
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer, &random_seed_bytes
576577
).unwrap();
577578

@@ -842,12 +843,12 @@ mod test {
842843
final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
843844
};
844845
let first_hops = nodes[0].node.list_usable_channels();
845-
let network_graph = node_cfgs[0].network_graph;
846+
let network_graph = &node_cfgs[0].network_graph;
846847
let logger = test_utils::TestLogger::new();
847848
let scorer = test_utils::TestScorer::with_penalty(0);
848849
let random_seed_bytes = chanmon_cfgs[1].keys_manager.get_secure_random_bytes();
849850
let route = find_route(
850-
&nodes[0].node.get_our_node_id(), &params, network_graph,
851+
&nodes[0].node.get_our_node_id(), &params, &network_graph.read_only(),
851852
Some(&first_hops.iter().collect::<Vec<_>>()), &logger, &scorer, &random_seed_bytes
852853
).unwrap();
853854
let (payment_event, fwd_idx) = {

lightning-rapid-gossip-sync/src/lib.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,12 @@
3030
//! use bitcoin::blockdata::constants::genesis_block;
3131
//! use bitcoin::Network;
3232
//! use lightning::routing::gossip::NetworkGraph;
33+
//! use lightning::util::test_utils::TestLogger;
3334
//! use lightning_rapid_gossip_sync::RapidGossipSync;
3435
//!
3536
//! let block_hash = genesis_block(Network::Bitcoin).header.block_hash();
36-
//! let network_graph = NetworkGraph::new(block_hash);
37+
//! let logger = TestLogger::new();
38+
//! let network_graph = NetworkGraph::new(block_hash, &logger);
3739
//! let rapid_sync = RapidGossipSync::new(&network_graph);
3840
//! let new_last_sync_timestamp_result = rapid_sync.sync_network_graph_with_file_path("./rapid_sync.lngossip");
3941
//! ```
@@ -63,6 +65,7 @@ use std::ops::Deref;
6365
use std::sync::atomic::{AtomicBool, Ordering};
6466

6567
use lightning::routing::gossip::NetworkGraph;
68+
use lightning::util::logger::Logger;
6669

6770
use crate::error::GraphSyncError;
6871

@@ -76,12 +79,13 @@ pub mod processing;
7679
/// See [crate-level documentation] for usage.
7780
///
7881
/// [crate-level documentation]: crate
79-
pub struct RapidGossipSync<NG: Deref<Target=NetworkGraph>> {
82+
pub struct RapidGossipSync<NG: Deref<Target=NetworkGraph<L>>, L: Deref>
83+
where L::Target: Logger {
8084
network_graph: NG,
8185
is_initial_sync_complete: AtomicBool
8286
}
8387

84-
impl<NG: Deref<Target=NetworkGraph>> RapidGossipSync<NG> {
88+
impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L::Target: Logger {
8589
/// Instantiate a new [`RapidGossipSync`] instance
8690
pub fn new(network_graph: NG) -> Self {
8791
Self {
@@ -128,6 +132,7 @@ mod tests {
128132

129133
use lightning::ln::msgs::DecodeError;
130134
use lightning::routing::gossip::NetworkGraph;
135+
use lightning::util::test_utils::TestLogger;
131136
use crate::RapidGossipSync;
132137

133138
#[test]
@@ -187,7 +192,8 @@ mod tests {
187192
let graph_sync_test_file = sync_test.get_test_file_path();
188193

189194
let block_hash = genesis_block(Network::Bitcoin).block_hash();
190-
let network_graph = NetworkGraph::new(block_hash);
195+
let logger = TestLogger::new();
196+
let network_graph = NetworkGraph::new(block_hash, &logger);
191197

192198
assert_eq!(network_graph.read_only().channels().len(), 0);
193199

@@ -219,7 +225,8 @@ mod tests {
219225
#[test]
220226
fn measure_native_read_from_file() {
221227
let block_hash = genesis_block(Network::Bitcoin).block_hash();
222-
let network_graph = NetworkGraph::new(block_hash);
228+
let logger = TestLogger::new();
229+
let network_graph = NetworkGraph::new(block_hash, &logger);
223230

224231
assert_eq!(network_graph.read_only().channels().len(), 0);
225232

@@ -254,12 +261,14 @@ pub mod bench {
254261

255262
use lightning::ln::msgs::DecodeError;
256263
use lightning::routing::gossip::NetworkGraph;
264+
use lightning::util::test_utils::TestLogger;
257265

258266
use crate::RapidGossipSync;
259267

260268
#[bench]
261269
fn bench_reading_full_graph_from_file(b: &mut Bencher) {
262270
let block_hash = genesis_block(Network::Bitcoin).block_hash();
271+
let logger = TestLogger::new();
263272
b.iter(|| {
264273
let network_graph = NetworkGraph::new(block_hash);
265274
let rapid_sync = RapidGossipSync::new(&network_graph);

lightning-rapid-gossip-sync/src/processing.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use lightning::ln::msgs::{
1111
DecodeError, ErrorAction, LightningError, OptionalField, UnsignedChannelUpdate,
1212
};
1313
use lightning::routing::gossip::NetworkGraph;
14+
use lightning::util::logger::Logger;
1415
use lightning::util::ser::{BigSize, Readable};
1516

1617
use crate::error::GraphSyncError;
@@ -26,7 +27,7 @@ const GOSSIP_PREFIX: [u8; 4] = [76, 68, 75, 1];
2627
/// avoid malicious updates being able to trigger excessive memory allocation.
2728
const MAX_INITIAL_NODE_ID_VECTOR_CAPACITY: u32 = 50_000;
2829

29-
impl<NG: Deref<Target=NetworkGraph>> RapidGossipSync<NG> {
30+
impl<NG: Deref<Target=NetworkGraph<L>>, L: Deref> RapidGossipSync<NG, L> where L::Target: Logger {
3031
/// Update network graph from binary data.
3132
/// Returns the last sync timestamp to be used the next time rapid sync data is queried.
3233
///
@@ -236,14 +237,16 @@ mod tests {
236237

237238
use lightning::ln::msgs::DecodeError;
238239
use lightning::routing::gossip::NetworkGraph;
240+
use lightning::util::test_utils::TestLogger;
239241

240242
use crate::error::GraphSyncError;
241243
use crate::RapidGossipSync;
242244

243245
#[test]
244246
fn network_graph_fails_to_update_from_clipped_input() {
245247
let block_hash = genesis_block(Network::Bitcoin).block_hash();
246-
let network_graph = NetworkGraph::new(block_hash);
248+
let logger = TestLogger::new();
249+
let network_graph = NetworkGraph::new(block_hash, &logger);
247250

248251
let example_input = vec![
249252
76, 68, 75, 1, 111, 226, 140, 10, 182, 241, 179, 114, 193, 166, 162, 70, 174, 99, 247,
@@ -282,7 +285,8 @@ mod tests {
282285
];
283286

284287
let block_hash = genesis_block(Network::Bitcoin).block_hash();
285-
let network_graph = NetworkGraph::new(block_hash);
288+
let logger = TestLogger::new();
289+
let network_graph = NetworkGraph::new(block_hash, &logger);
286290

287291
assert_eq!(network_graph.read_only().channels().len(), 0);
288292

@@ -315,7 +319,8 @@ mod tests {
315319
];
316320

317321
let block_hash = genesis_block(Network::Bitcoin).block_hash();
318-
let network_graph = NetworkGraph::new(block_hash);
322+
let logger = TestLogger::new();
323+
let network_graph = NetworkGraph::new(block_hash, &logger);
319324

320325
assert_eq!(network_graph.read_only().channels().len(), 0);
321326

@@ -351,7 +356,8 @@ mod tests {
351356
];
352357

353358
let block_hash = genesis_block(Network::Bitcoin).block_hash();
354-
let network_graph = NetworkGraph::new(block_hash);
359+
let logger = TestLogger::new();
360+
let network_graph = NetworkGraph::new(block_hash, &logger);
355361

356362
assert_eq!(network_graph.read_only().channels().len(), 0);
357363

@@ -417,7 +423,8 @@ mod tests {
417423
];
418424

419425
let block_hash = genesis_block(Network::Bitcoin).block_hash();
420-
let network_graph = NetworkGraph::new(block_hash);
426+
let logger = TestLogger::new();
427+
let network_graph = NetworkGraph::new(block_hash, &logger);
421428

422429
assert_eq!(network_graph.read_only().channels().len(), 0);
423430

@@ -476,7 +483,8 @@ mod tests {
476483
];
477484

478485
let block_hash = genesis_block(Network::Bitcoin).block_hash();
479-
let network_graph = NetworkGraph::new(block_hash);
486+
let logger = TestLogger::new();
487+
let network_graph = NetworkGraph::new(block_hash, &logger);
480488

481489
assert_eq!(network_graph.read_only().channels().len(), 0);
482490

0 commit comments

Comments
 (0)