Skip to content

Commit 9b87261

Browse files
Benchmark onion message pathfinding
1 parent dcf2129 commit 9b87261

File tree

2 files changed

+108
-34
lines changed

2 files changed

+108
-34
lines changed

lightning/src/routing/onion_message.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,72 @@ mod tests {
183183
assert_eq!(path.len(), 19);
184184
}
185185
}
186+
187+
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
188+
mod benches {
189+
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
190+
use routing::gossip::NetworkGraph;
191+
use routing::router::bench_utils;
192+
use super::find_path;
193+
use test::Bencher;
194+
use util::logger::{Logger, Record};
195+
use util::ser::ReadableArgs;
196+
197+
struct DummyLogger {}
198+
impl Logger for DummyLogger {
199+
fn log(&self, _record: &Record) {}
200+
}
201+
202+
fn read_network_graph(logger: &DummyLogger) -> NetworkGraph<&DummyLogger> {
203+
let mut d = bench_utils::get_route_file().unwrap();
204+
NetworkGraph::read(&mut d, logger).unwrap()
205+
}
206+
207+
#[bench]
208+
fn generate_simple_routes(bench: &mut Bencher) {
209+
let logger = DummyLogger {};
210+
let network_graph = read_network_graph(&logger);
211+
generate_routes(bench, &network_graph);
212+
}
213+
214+
fn payer_pubkey() -> PublicKey {
215+
let secp_ctx = Secp256k1::new();
216+
PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
217+
}
218+
219+
fn generate_routes(
220+
bench: &mut Bencher, graph: &NetworkGraph<&DummyLogger>,
221+
) {
222+
let nodes = graph.read_only().nodes().clone();
223+
let payer = payer_pubkey();
224+
225+
// Get 100 (source, destination) pairs for which route-getting actually succeeds...
226+
let mut routes = Vec::new();
227+
let mut route_endpoints = Vec::new();
228+
let mut seed: usize = 0xdeadbeef;
229+
'load_endpoints: for _ in 0..150 {
230+
loop {
231+
seed *= 0xdeadbeef;
232+
let src = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
233+
let first_hop = bench_utils::first_hop(src);
234+
seed *= 0xdeadbeef;
235+
let dst = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
236+
if let Ok(route) = find_path(&payer, &dst, &graph, Some(&[&first_hop]), &DummyLogger{}) {
237+
routes.push(route);
238+
route_endpoints.push((first_hop, dst));
239+
continue 'load_endpoints;
240+
}
241+
}
242+
}
243+
route_endpoints.truncate(100);
244+
assert_eq!(route_endpoints.len(), 100);
245+
246+
// Benchmark finding paths between the nodes we learned.
247+
let mut idx = 0;
248+
bench.iter(|| {
249+
let (first_hop, dst) = &route_endpoints[idx % route_endpoints.len()];
250+
assert!(find_path(&payer, &dst, &graph, Some(&[first_hop]), &DummyLogger{}).is_ok());
251+
idx += 1;
252+
});
253+
}
254+
}

lightning/src/routing/router.rs

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5388,6 +5388,7 @@ mod tests {
53885388
#[cfg(all(test, not(feature = "no-std")))]
53895389
pub(crate) mod bench_utils {
53905390
use std::fs::File;
5391+
53915392
/// Tries to open a network graph file, or panics with a URL to fetch it.
53925393
pub(crate) fn get_route_file() -> Result<std::fs::File, &'static str> {
53935394
let res = File::open("net_graph-2021-05-31.bin") // By default we're run in RL/lightning
@@ -5410,41 +5411,15 @@ pub(crate) mod bench_utils {
54105411
#[cfg(not(require_route_graph_test))]
54115412
return res;
54125413
}
5413-
}
5414-
5415-
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
5416-
mod benches {
5417-
use super::*;
5418-
use bitcoin::hashes::Hash;
5419-
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
5420-
use chain::transaction::OutPoint;
5421-
use chain::keysinterface::{KeysManager,KeysInterface};
5422-
use ln::channelmanager::{self, ChannelCounterparty, ChannelDetails};
5423-
use ln::features::{InitFeatures, InvoiceFeatures};
5424-
use routing::gossip::NetworkGraph;
5425-
use routing::scoring::{FixedPenaltyScorer, ProbabilisticScorer, ProbabilisticScoringParameters};
5426-
use util::logger::{Logger, Record};
5427-
use util::ser::ReadableArgs;
5428-
5429-
use test::Bencher;
5430-
5431-
struct DummyLogger {}
5432-
impl Logger for DummyLogger {
5433-
fn log(&self, _record: &Record) {}
5434-
}
5435-
5436-
fn read_network_graph(logger: &DummyLogger) -> NetworkGraph<&DummyLogger> {
5437-
let mut d = bench_utils::get_route_file().unwrap();
5438-
NetworkGraph::read(&mut d, logger).unwrap()
5439-
}
5440-
5441-
fn payer_pubkey() -> PublicKey {
5442-
let secp_ctx = Secp256k1::new();
5443-
PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
5444-
}
54455414

54465415
#[inline]
5447-
fn first_hop(node_id: PublicKey) -> ChannelDetails {
5416+
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
5417+
pub(crate) fn first_hop(node_id: PublicKey) -> ChannelDetails {
5418+
use bitcoin::hashes::Hash;
5419+
use bitcoin::secp256k1::PublicKey;
5420+
use chain::transaction::OutPoint;
5421+
use ln::channelmanager::{self, ChannelCounterparty, ChannelDetails};
5422+
54485423
ChannelDetails {
54495424
channel_id: [0; 32],
54505425
counterparty: ChannelCounterparty {
@@ -5480,6 +5455,36 @@ mod benches {
54805455
config: None,
54815456
}
54825457
}
5458+
}
5459+
5460+
#[cfg(all(test, feature = "_bench_unstable", not(feature = "no-std")))]
5461+
mod benches {
5462+
use super::*;
5463+
use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
5464+
use chain::keysinterface::{KeysManager,KeysInterface};
5465+
use ln::channelmanager;
5466+
use ln::features::InvoiceFeatures;
5467+
use routing::gossip::NetworkGraph;
5468+
use routing::scoring::{FixedPenaltyScorer, ProbabilisticScorer, ProbabilisticScoringParameters};
5469+
use util::logger::{Logger, Record};
5470+
use util::ser::ReadableArgs;
5471+
5472+
use test::Bencher;
5473+
5474+
struct DummyLogger {}
5475+
impl Logger for DummyLogger {
5476+
fn log(&self, _record: &Record) {}
5477+
}
5478+
5479+
fn read_network_graph(logger: &DummyLogger) -> NetworkGraph<&DummyLogger> {
5480+
let mut d = bench_utils::get_route_file().unwrap();
5481+
NetworkGraph::read(&mut d, logger).unwrap()
5482+
}
5483+
5484+
fn payer_pubkey() -> PublicKey {
5485+
let secp_ctx = Secp256k1::new();
5486+
PublicKey::from_secret_key(&secp_ctx, &SecretKey::from_slice(&[42; 32]).unwrap())
5487+
}
54835488

54845489
#[bench]
54855490
fn generate_routes_with_zero_penalty_scorer(bench: &mut Bencher) {
@@ -5535,7 +5540,7 @@ mod benches {
55355540
seed *= 0xdeadbeef;
55365541
let dst = PublicKey::from_slice(nodes.keys().skip(seed % nodes.len()).next().unwrap().as_slice()).unwrap();
55375542
let params = PaymentParameters::from_node_id(dst).with_features(features.clone());
5538-
let first_hop = first_hop(src);
5543+
let first_hop = bench_utils::first_hop(src);
55395544
let amt = seed as u64 % 1_000_000;
55405545
if let Ok(route) = get_route(&payer, &params, &graph.read_only(), Some(&[&first_hop]), amt, 42, &DummyLogger{}, &scorer, &random_seed_bytes) {
55415546
routes.push(route);

0 commit comments

Comments
 (0)