Skip to content

Commit 6e86776

Browse files
authored
Merge pull request #1149 from jkczyz/2021-11-network-graph
Shared ownership of NetworkGraph
2 parents 61341df + c4d7b9d commit 6e86776

File tree

10 files changed

+208
-191
lines changed

10 files changed

+208
-191
lines changed

fuzz/src/full_stack.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ type ChannelMan = ChannelManager<
161161
EnforcingSigner,
162162
Arc<chainmonitor::ChainMonitor<EnforcingSigner, Arc<dyn chain::Filter>, Arc<TestBroadcaster>, Arc<FuzzEstimator>, Arc<dyn Logger>, Arc<TestPersister>>>,
163163
Arc<TestBroadcaster>, Arc<KeyProvider>, Arc<FuzzEstimator>, Arc<dyn Logger>>;
164-
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
164+
type PeerMan<'a> = PeerManager<Peer<'a>, Arc<ChannelMan>, Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<dyn chain::Access>, Arc<dyn Logger>>>, Arc<dyn Logger>, IgnoringMessageHandler>;
165165

166166
struct MoneyLossDetector<'a> {
167167
manager: Arc<ChannelMan>,
@@ -380,8 +380,8 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
380380
};
381381
let channelmanager = Arc::new(ChannelManager::new(fee_est.clone(), monitor.clone(), broadcast.clone(), Arc::clone(&logger), keys_manager.clone(), config, params));
382382
let our_id = PublicKey::from_secret_key(&Secp256k1::signing_only(), &keys_manager.get_node_secret());
383-
let network_graph = NetworkGraph::new(genesis_block(network).block_hash());
384-
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
383+
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash()));
384+
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(Arc::clone(&network_graph), None, Arc::clone(&logger)));
385385
let scorer = Scorer::with_fixed_penalty(0);
386386

387387
let peers = RefCell::new([false; 256]);
@@ -444,7 +444,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
444444
final_value_msat,
445445
final_cltv_expiry_delta: 42,
446446
};
447-
let route = match find_route(&our_id, &params, &net_graph_msg_handler.network_graph, None, Arc::clone(&logger), &scorer) {
447+
let route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer) {
448448
Ok(route) => route,
449449
Err(_) => return,
450450
};
@@ -467,7 +467,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
467467
final_value_msat,
468468
final_cltv_expiry_delta: 42,
469469
};
470-
let mut route = match find_route(&our_id, &params, &net_graph_msg_handler.network_graph, None, Arc::clone(&logger), &scorer) {
470+
let mut route = match find_route(&our_id, &params, &network_graph, None, Arc::clone(&logger), &scorer) {
471471
Ok(route) => route,
472472
Err(_) => return,
473473
};

lightning-background-processor/src/lib.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use lightning::chain::keysinterface::{Sign, KeysInterface};
1515
use lightning::ln::channelmanager::ChannelManager;
1616
use lightning::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
1717
use lightning::ln::peer_handler::{CustomMessageHandler, PeerManager, SocketDescriptor};
18-
use lightning::routing::network_graph::NetGraphMsgHandler;
18+
use lightning::routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
1919
use lightning::util::events::{Event, EventHandler, EventsProvider};
2020
use lightning::util::logger::Logger;
2121
use std::sync::Arc;
@@ -103,7 +103,8 @@ ChannelManagerPersister<Signer, M, T, K, F, L> for Fun where
103103
/// Decorates an [`EventHandler`] with common functionality provided by standard [`EventHandler`]s.
104104
struct DecoratingEventHandler<
105105
E: EventHandler,
106-
N: Deref<Target = NetGraphMsgHandler<A, L>>,
106+
N: Deref<Target = NetGraphMsgHandler<G, A, L>>,
107+
G: Deref<Target = NetworkGraph>,
107108
A: Deref,
108109
L: Deref,
109110
>
@@ -114,10 +115,11 @@ where A::Target: chain::Access, L::Target: Logger {
114115

115116
impl<
116117
E: EventHandler,
117-
N: Deref<Target = NetGraphMsgHandler<A, L>>,
118+
N: Deref<Target = NetGraphMsgHandler<G, A, L>>,
119+
G: Deref<Target = NetworkGraph>,
118120
A: Deref,
119121
L: Deref,
120-
> EventHandler for DecoratingEventHandler<E, N, A, L>
122+
> EventHandler for DecoratingEventHandler<E, N, G, A, L>
121123
where A::Target: chain::Access, L::Target: Logger {
122124
fn handle_event(&self, event: &Event) {
123125
if let Some(event_handler) = &self.net_graph_msg_handler {
@@ -168,6 +170,7 @@ impl BackgroundProcessor {
168170
T: 'static + Deref + Send + Sync,
169171
K: 'static + Deref + Send + Sync,
170172
F: 'static + Deref + Send + Sync,
173+
G: 'static + Deref<Target = NetworkGraph> + Send + Sync,
171174
L: 'static + Deref + Send + Sync,
172175
P: 'static + Deref + Send + Sync,
173176
Descriptor: 'static + SocketDescriptor + Send + Sync,
@@ -177,7 +180,7 @@ impl BackgroundProcessor {
177180
CMP: 'static + Send + ChannelManagerPersister<Signer, CW, T, K, F, L>,
178181
M: 'static + Deref<Target = ChainMonitor<Signer, CF, T, F, L, P>> + Send + Sync,
179182
CM: 'static + Deref<Target = ChannelManager<Signer, CW, T, K, F, L>> + Send + Sync,
180-
NG: 'static + Deref<Target = NetGraphMsgHandler<CA, L>> + Send + Sync,
183+
NG: 'static + Deref<Target = NetGraphMsgHandler<G, CA, L>> + Send + Sync,
181184
UMH: 'static + Deref + Send + Sync,
182185
PM: 'static + Deref<Target = PeerManager<Descriptor, CMH, RMH, L, UMH>> + Send + Sync,
183186
>(
@@ -340,11 +343,12 @@ mod tests {
340343

341344
struct Node {
342345
node: Arc<SimpleArcChannelManager<ChainMonitor, test_utils::TestBroadcaster, test_utils::TestFeeEstimator, test_utils::TestLogger>>,
343-
net_graph_msg_handler: Option<Arc<NetGraphMsgHandler<Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
346+
net_graph_msg_handler: Option<Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<test_utils::TestChainSource>, Arc<test_utils::TestLogger>>>>,
344347
peer_manager: Arc<PeerManager<TestDescriptor, Arc<test_utils::TestChannelMessageHandler>, Arc<test_utils::TestRoutingMessageHandler>, Arc<test_utils::TestLogger>, IgnoringMessageHandler>>,
345348
chain_monitor: Arc<ChainMonitor>,
346349
persister: Arc<FilesystemPersister>,
347350
tx_broadcaster: Arc<test_utils::TestBroadcaster>,
351+
network_graph: Arc<NetworkGraph>,
348352
logger: Arc<test_utils::TestLogger>,
349353
best_block: BestBlock,
350354
}
@@ -382,11 +386,11 @@ mod tests {
382386
let best_block = BestBlock::from_genesis(network);
383387
let params = ChainParameters { network, best_block };
384388
let manager = Arc::new(ChannelManager::new(fee_estimator.clone(), chain_monitor.clone(), tx_broadcaster.clone(), logger.clone(), keys_manager.clone(), UserConfig::default(), params));
385-
let network_graph = NetworkGraph::new(genesis_block.header.block_hash());
386-
let net_graph_msg_handler = Some(Arc::new(NetGraphMsgHandler::new(network_graph, Some(chain_source.clone()), logger.clone())));
389+
let network_graph = Arc::new(NetworkGraph::new(genesis_block.header.block_hash()));
390+
let net_graph_msg_handler = Some(Arc::new(NetGraphMsgHandler::new(network_graph.clone(), Some(chain_source.clone()), logger.clone())));
387391
let msg_handler = MessageHandler { chan_handler: Arc::new(test_utils::TestChannelMessageHandler::new()), route_handler: Arc::new(test_utils::TestRoutingMessageHandler::new() )};
388392
let peer_manager = Arc::new(PeerManager::new(msg_handler, keys_manager.get_node_secret(), &seed, logger.clone(), IgnoringMessageHandler{}));
389-
let node = Node { node: manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, logger, best_block };
393+
let node = Node { node: manager, net_graph_msg_handler, peer_manager, chain_monitor, persister, tx_broadcaster, network_graph, logger, best_block };
390394
nodes.push(node);
391395
}
392396

@@ -630,8 +634,7 @@ mod tests {
630634
// Initiate the background processors to watch each node.
631635
let data_dir = nodes[0].persister.get_data_dir();
632636
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);
633-
let network_graph = Arc::new(NetworkGraph::new(genesis_block(Network::Testnet).header.block_hash()));
634-
let router = DefaultRouter::new(network_graph, Arc::clone(&nodes[0].logger));
637+
let router = DefaultRouter::new(Arc::clone(&nodes[0].network_graph), Arc::clone(&nodes[0].logger));
635638
let scorer = Arc::new(Mutex::new(Scorer::default()));
636639
let invoice_payer = Arc::new(InvoicePayer::new(Arc::clone(&nodes[0].node), router, scorer, Arc::clone(&nodes[0].logger), |_: &_| {}, RetryAttempts(2)));
637640
let event_handler = Arc::clone(&invoice_payer);

lightning-invoice/src/utils.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ mod test {
181181
final_cltv_expiry_delta: invoice.min_final_cltv_expiry() as u32,
182182
};
183183
let first_hops = nodes[0].node.list_usable_channels();
184-
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
184+
let network_graph = node_cfgs[0].network_graph;
185185
let logger = test_utils::TestLogger::new();
186186
let scorer = Scorer::with_fixed_penalty(0);
187187
let route = find_route(

lightning/src/ln/channelmanager.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -6338,8 +6338,8 @@ mod tests {
63386338
final_cltv_expiry_delta: TEST_FINAL_CLTV,
63396339
};
63406340
let route = find_route(
6341-
&nodes[0].node.get_our_node_id(), &params,
6342-
&nodes[0].net_graph_msg_handler.network_graph, None, nodes[0].logger, &scorer
6341+
&nodes[0].node.get_our_node_id(), &params, nodes[0].network_graph, None,
6342+
nodes[0].logger, &scorer
63436343
).unwrap();
63446344
nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
63456345
check_added_monitors!(nodes[0], 1);
@@ -6369,8 +6369,8 @@ mod tests {
63696369
// To start (2), send a keysend payment but don't claim it.
63706370
let payment_preimage = PaymentPreimage([42; 32]);
63716371
let route = find_route(
6372-
&nodes[0].node.get_our_node_id(), &params,
6373-
&nodes[0].net_graph_msg_handler.network_graph, None, nodes[0].logger, &scorer
6372+
&nodes[0].node.get_our_node_id(), &params, nodes[0].network_graph, None,
6373+
nodes[0].logger, &scorer
63746374
).unwrap();
63756375
let (payment_hash, _) = nodes[0].node.send_spontaneous_payment(&route, Some(payment_preimage)).unwrap();
63766376
check_added_monitors!(nodes[0], 1);
@@ -6428,7 +6428,7 @@ mod tests {
64286428
final_value_msat: 10000,
64296429
final_cltv_expiry_delta: 40,
64306430
};
6431-
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
6431+
let network_graph = nodes[0].network_graph;
64326432
let first_hops = nodes[0].node.list_usable_channels();
64336433
let scorer = Scorer::with_fixed_penalty(0);
64346434
let route = find_route(
@@ -6471,7 +6471,7 @@ mod tests {
64716471
final_value_msat: 10000,
64726472
final_cltv_expiry_delta: 40,
64736473
};
6474-
let network_graph = &nodes[0].net_graph_msg_handler.network_graph;
6474+
let network_graph = nodes[0].network_graph;
64756475
let first_hops = nodes[0].node.list_usable_channels();
64766476
let scorer = Scorer::with_fixed_penalty(0);
64776477
let route = find_route(

lightning/src/ln/functional_test_utils.rs

+22-21
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ pub struct TestChanMonCfg {
190190
pub persister: test_utils::TestPersister,
191191
pub logger: test_utils::TestLogger,
192192
pub keys_manager: test_utils::TestKeysInterface,
193+
pub network_graph: NetworkGraph,
193194
}
194195

195196
pub struct NodeCfg<'a> {
@@ -199,6 +200,7 @@ pub struct NodeCfg<'a> {
199200
pub chain_monitor: test_utils::TestChainMonitor<'a>,
200201
pub keys_manager: &'a test_utils::TestKeysInterface,
201202
pub logger: &'a test_utils::TestLogger,
203+
pub network_graph: &'a NetworkGraph,
202204
pub node_seed: [u8; 32],
203205
pub features: InitFeatures,
204206
}
@@ -209,7 +211,8 @@ pub struct Node<'a, 'b: 'a, 'c: 'b> {
209211
pub chain_monitor: &'b test_utils::TestChainMonitor<'c>,
210212
pub keys_manager: &'b test_utils::TestKeysInterface,
211213
pub node: &'a ChannelManager<EnforcingSigner, &'b TestChainMonitor<'c>, &'c test_utils::TestBroadcaster, &'b test_utils::TestKeysInterface, &'c test_utils::TestFeeEstimator, &'c test_utils::TestLogger>,
212-
pub net_graph_msg_handler: NetGraphMsgHandler<&'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
214+
pub network_graph: &'c NetworkGraph,
215+
pub net_graph_msg_handler: NetGraphMsgHandler<&'c NetworkGraph, &'c test_utils::TestChainSource, &'c test_utils::TestLogger>,
213216
pub node_seed: [u8; 32],
214217
pub network_payment_count: Rc<RefCell<u8>>,
215218
pub network_chan_count: Rc<RefCell<u32>>,
@@ -240,12 +243,11 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
240243
// Check that if we serialize the Router, we can deserialize it again.
241244
{
242245
let mut w = test_utils::TestVecWriter(Vec::new());
243-
let network_graph_ser = &self.net_graph_msg_handler.network_graph;
244-
network_graph_ser.write(&mut w).unwrap();
246+
self.network_graph.write(&mut w).unwrap();
245247
let network_graph_deser = <NetworkGraph>::read(&mut io::Cursor::new(&w.0)).unwrap();
246-
assert!(network_graph_deser == self.net_graph_msg_handler.network_graph);
248+
assert!(network_graph_deser == *self.network_graph);
247249
let net_graph_msg_handler = NetGraphMsgHandler::new(
248-
network_graph_deser, Some(self.chain_source), self.logger
250+
&network_graph_deser, Some(self.chain_source), self.logger
249251
);
250252
let mut chan_progress = 0;
251253
loop {
@@ -1014,10 +1016,9 @@ macro_rules! get_route_and_payment_hash {
10141016
let payee = $crate::routing::router::Payee::new($recv_node.node.get_our_node_id())
10151017
.with_features($crate::ln::features::InvoiceFeatures::known())
10161018
.with_route_hints($last_hops);
1017-
let net_graph_msg_handler = &$send_node.net_graph_msg_handler;
10181019
let scorer = ::routing::scorer::Scorer::with_fixed_penalty(0);
10191020
let route = ::routing::router::get_route(
1020-
&$send_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
1021+
&$send_node.node.get_our_node_id(), &payee, $send_node.network_graph,
10211022
Some(&$send_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
10221023
$recv_value, $cltv, $send_node.logger, &scorer
10231024
).unwrap();
@@ -1352,10 +1353,9 @@ pub const TEST_FINAL_CLTV: u32 = 70;
13521353
pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) -> (PaymentPreimage, PaymentHash, PaymentSecret) {
13531354
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
13541355
.with_features(InvoiceFeatures::known());
1355-
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
13561356
let scorer = Scorer::with_fixed_penalty(0);
13571357
let route = get_route(
1358-
&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph,
1358+
&origin_node.node.get_our_node_id(), &payee, &origin_node.network_graph,
13591359
Some(&origin_node.node.list_usable_channels().iter().collect::<Vec<_>>()),
13601360
recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13611361
assert_eq!(route.paths.len(), 1);
@@ -1371,9 +1371,8 @@ pub fn route_payment<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route:
13711371
pub fn route_over_limit<'a, 'b, 'c>(origin_node: &Node<'a, 'b, 'c>, expected_route: &[&Node<'a, 'b, 'c>], recv_value: u64) {
13721372
let payee = Payee::new(expected_route.last().unwrap().node.get_our_node_id())
13731373
.with_features(InvoiceFeatures::known());
1374-
let net_graph_msg_handler = &origin_node.net_graph_msg_handler;
13751374
let scorer = Scorer::with_fixed_penalty(0);
1376-
let route = get_route(&origin_node.node.get_our_node_id(), &payee, &net_graph_msg_handler.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
1375+
let route = get_route(&origin_node.node.get_our_node_id(), &payee, origin_node.network_graph, None, recv_value, TEST_FINAL_CLTV, origin_node.logger, &scorer).unwrap();
13771376
assert_eq!(route.paths.len(), 1);
13781377
assert_eq!(route.paths[0].len(), expected_route.len());
13791378
for (node, hop) in expected_route.iter().zip(route.paths[0].iter()) {
@@ -1499,8 +1498,9 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
14991498
let persister = test_utils::TestPersister::new();
15001499
let seed = [i as u8; 32];
15011500
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
1501+
let network_graph = NetworkGraph::new(chain_source.genesis_hash);
15021502

1503-
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager });
1503+
chan_mon_cfgs.push(TestChanMonCfg{ tx_broadcaster, fee_estimator, chain_source, logger, persister, keys_manager, network_graph });
15041504
}
15051505

15061506
chan_mon_cfgs
@@ -1521,6 +1521,7 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
15211521
keys_manager: &chanmon_cfgs[i].keys_manager,
15221522
node_seed: seed,
15231523
features: InitFeatures::known(),
1524+
network_graph: &chanmon_cfgs[i].network_graph,
15241525
});
15251526
}
15261527

@@ -1566,15 +1567,15 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
15661567
let connect_style = Rc::new(RefCell::new(ConnectStyle::FullBlockViaListen));
15671568

15681569
for i in 0..node_count {
1569-
let network_graph = NetworkGraph::new(cfgs[i].chain_source.genesis_hash);
1570-
let net_graph_msg_handler = NetGraphMsgHandler::new(network_graph, None, cfgs[i].logger);
1571-
nodes.push(Node{ chain_source: cfgs[i].chain_source,
1572-
tx_broadcaster: cfgs[i].tx_broadcaster, chain_monitor: &cfgs[i].chain_monitor,
1573-
keys_manager: &cfgs[i].keys_manager, node: &chan_mgrs[i], net_graph_msg_handler,
1574-
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
1575-
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
1576-
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
1577-
connect_style: Rc::clone(&connect_style),
1570+
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].network_graph, None, cfgs[i].logger);
1571+
nodes.push(Node{
1572+
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
1573+
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
1574+
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, net_graph_msg_handler,
1575+
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
1576+
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
1577+
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
1578+
connect_style: Rc::clone(&connect_style),
15781579
})
15791580
}
15801581

0 commit comments

Comments
 (0)