Skip to content

Commit bcdd852

Browse files
committed
Parameterize NetGraphMsgHandler with NetworkGraph
NetworkGraph is owned by NetGraphMsgHandler, but DefaultRouter requires a reference to it. Introduce shared ownership to NetGraphMsgHandler so that both can use the same NetworkGraph.
1 parent c53048a commit bcdd852

File tree

7 files changed

+94
-76
lines changed

7 files changed

+94
-76
lines changed

fuzz/src/full_stack.rs

Lines changed: 2 additions & 2 deletions
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,7 +380,7 @@ 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());
383+
let network_graph = Arc::new(NetworkGraph::new(genesis_block(network).block_hash()));
384384
let net_graph_msg_handler = Arc::new(NetGraphMsgHandler::new(network_graph, None, Arc::clone(&logger)));
385385
let scorer = Scorer::with_fixed_penalty(0);
386386

lightning-background-processor/src/lib.rs

Lines changed: 14 additions & 11 deletions
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/src/ln/functional_test_utils.rs

Lines changed: 18 additions & 13 deletions
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>>,
@@ -243,9 +246,9 @@ impl<'a, 'b, 'c> Drop for Node<'a, 'b, 'c> {
243246
let network_graph_ser = &self.net_graph_msg_handler.network_graph;
244247
network_graph_ser.write(&mut w).unwrap();
245248
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);
249+
assert!(network_graph_deser == *self.net_graph_msg_handler.network_graph);
247250
let net_graph_msg_handler = NetGraphMsgHandler::new(
248-
network_graph_deser, Some(self.chain_source), self.logger
251+
&network_graph_deser, Some(self.chain_source), self.logger
249252
);
250253
let mut chan_progress = 0;
251254
loop {
@@ -1499,8 +1502,9 @@ pub fn create_chanmon_cfgs(node_count: usize) -> Vec<TestChanMonCfg> {
14991502
let persister = test_utils::TestPersister::new();
15001503
let seed = [i as u8; 32];
15011504
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
1505+
let network_graph = NetworkGraph::new(chain_source.genesis_hash);
15021506

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

15061510
chan_mon_cfgs
@@ -1521,6 +1525,7 @@ pub fn create_node_cfgs<'a>(node_count: usize, chanmon_cfgs: &'a Vec<TestChanMon
15211525
keys_manager: &chanmon_cfgs[i].keys_manager,
15221526
node_seed: seed,
15231527
features: InitFeatures::known(),
1528+
network_graph: &chanmon_cfgs[i].network_graph,
15241529
});
15251530
}
15261531

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

15681573
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),
1574+
let net_graph_msg_handler = NetGraphMsgHandler::new(cfgs[i].network_graph, None, cfgs[i].logger);
1575+
nodes.push(Node{
1576+
chain_source: cfgs[i].chain_source, tx_broadcaster: cfgs[i].tx_broadcaster,
1577+
chain_monitor: &cfgs[i].chain_monitor, keys_manager: &cfgs[i].keys_manager,
1578+
node: &chan_mgrs[i], network_graph: &cfgs[i].network_graph, net_graph_msg_handler,
1579+
node_seed: cfgs[i].node_seed, network_chan_count: chan_count.clone(),
1580+
network_payment_count: payment_count.clone(), logger: cfgs[i].logger,
1581+
blocks: Arc::clone(&cfgs[i].tx_broadcaster.blocks),
1582+
connect_style: Rc::clone(&connect_style),
15781583
})
15791584
}
15801585

lightning/src/ln/functional_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5454,7 +5454,7 @@ fn test_key_derivation_params() {
54545454
let seed = [42; 32];
54555455
let keys_manager = test_utils::TestKeysInterface::new(&seed, Network::Testnet);
54565456
let chain_monitor = test_utils::TestChainMonitor::new(Some(&chanmon_cfgs[0].chain_source), &chanmon_cfgs[0].tx_broadcaster, &chanmon_cfgs[0].logger, &chanmon_cfgs[0].fee_estimator, &chanmon_cfgs[0].persister, &keys_manager);
5457-
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, chain_monitor, keys_manager: &keys_manager, node_seed: seed, features: InitFeatures::known() };
5457+
let node = NodeCfg { chain_source: &chanmon_cfgs[0].chain_source, logger: &chanmon_cfgs[0].logger, tx_broadcaster: &chanmon_cfgs[0].tx_broadcaster, fee_estimator: &chanmon_cfgs[0].fee_estimator, chain_monitor, keys_manager: &keys_manager, network_graph: &chanmon_cfgs[0].network_graph, node_seed: seed, features: InitFeatures::known() };
54585458
let mut node_cfgs = create_node_cfgs(3, &chanmon_cfgs);
54595459
node_cfgs.remove(0);
54605460
node_cfgs.insert(0, node);

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use ln::wire;
2727
use util::atomic_counter::AtomicCounter;
2828
use util::events::{MessageSendEvent, MessageSendEventsProvider};
2929
use util::logger::Logger;
30-
use routing::network_graph::NetGraphMsgHandler;
30+
use routing::network_graph::{NetworkGraph, NetGraphMsgHandler};
3131

3232
use prelude::*;
3333
use io;
@@ -375,15 +375,15 @@ struct PeerHolder<Descriptor: SocketDescriptor> {
375375
/// lifetimes). Other times you can afford a reference, which is more efficient, in which case
376376
/// SimpleRefPeerManager is the more appropriate type. Defining these type aliases prevents
377377
/// issues such as overly long function definitions.
378-
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<C>, Arc<L>>>, Arc<L>, Arc<IgnoringMessageHandler>>;
378+
pub type SimpleArcPeerManager<SD, M, T, F, C, L> = PeerManager<SD, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<NetGraphMsgHandler<Arc<NetworkGraph>, Arc<C>, Arc<L>>>, Arc<L>, Arc<IgnoringMessageHandler>>;
379379

380380
/// SimpleRefPeerManager is a type alias for a PeerManager reference, and is the reference
381381
/// counterpart to the SimpleArcPeerManager type alias. Use this type by default when you don't
382382
/// need a PeerManager with a static lifetime. You'll need a static lifetime in cases such as
383383
/// usage of lightning-net-tokio (since tokio::spawn requires parameters with static lifetimes).
384384
/// But if this is not necessary, using a reference is more efficient. Defining these type aliases
385385
/// helps with issues such as long function definitions.
386-
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g C, &'f L>, &'f L, IgnoringMessageHandler>;
386+
pub type SimpleRefPeerManager<'a, 'b, 'c, 'd, 'e, 'f, 'g, 'h, SD, M, T, F, C, L> = PeerManager<SD, SimpleRefChannelManager<'a, 'b, 'c, 'd, 'e, M, T, F, L>, &'e NetGraphMsgHandler<&'g NetworkGraph, &'h C, &'f L>, &'f L, IgnoringMessageHandler>;
387387

388388
/// A PeerManager manages a set of peers, described by their [`SocketDescriptor`] and marshalls
389389
/// socket events into messages which it passes on to its [`MessageHandler`].

0 commit comments

Comments
 (0)