@@ -5671,29 +5671,15 @@ mod tests {
56715671 return ;
56725672 } ,
56735673 } ;
5674+
56745675 let logger = ln_test_utils:: TestLogger :: new ( ) ;
56755676 let graph = NetworkGraph :: read ( & mut d, & logger) . unwrap ( ) ;
5676- let keys_manager = ln_test_utils:: TestKeysInterface :: new ( & [ 0u8 ; 32 ] , Network :: Testnet ) ;
5677- let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
56785677
5679- // First, get 100 (source, destination) pairs for which route-getting actually succeeds...
5680- let mut seed = random_init_seed ( ) as usize ;
5681- let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
5682- ' load_endpoints: for _ in 0 ..10 {
5683- loop {
5684- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
5685- let src = & PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
5686- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
5687- let dst = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
5688- let payment_params = PaymentParameters :: from_node_id ( dst, 42 ) ;
5689- let amt = seed as u64 % 200_000_000 ;
5690- let params = ProbabilisticScoringParameters :: default ( ) ;
5691- let scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5692- if get_route ( src, & payment_params, & graph. read_only ( ) , None , amt, & logger, & scorer, & random_seed_bytes) . is_ok ( ) {
5693- continue ' load_endpoints;
5694- }
5695- }
5696- }
5678+ let params = ProbabilisticScoringParameters :: default ( ) ;
5679+ let mut scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5680+ let features = super :: InvoiceFeatures :: empty ( ) ;
5681+
5682+ super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) as usize , 2 ) ;
56975683 }
56985684
56995685 #[ test]
@@ -5710,28 +5696,12 @@ mod tests {
57105696 } ;
57115697 let logger = ln_test_utils:: TestLogger :: new ( ) ;
57125698 let graph = NetworkGraph :: read ( & mut d, & logger) . unwrap ( ) ;
5713- let keys_manager = ln_test_utils:: TestKeysInterface :: new ( & [ 0u8 ; 32 ] , Network :: Testnet ) ;
5714- let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
5715- let config = UserConfig :: default ( ) ;
57165699
5717- // First, get 100 (source, destination) pairs for which route-getting actually succeeds...
5718- let mut seed = random_init_seed ( ) as usize ;
5719- let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
5720- ' load_endpoints: for _ in 0 ..10 {
5721- loop {
5722- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
5723- let src = & PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
5724- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
5725- let dst = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
5726- let payment_params = PaymentParameters :: from_node_id ( dst, 42 ) . with_features ( channelmanager:: provided_invoice_features ( & config) ) ;
5727- let amt = seed as u64 % 200_000_000 ;
5728- let params = ProbabilisticScoringParameters :: default ( ) ;
5729- let scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5730- if get_route ( src, & payment_params, & graph. read_only ( ) , None , amt, & logger, & scorer, & random_seed_bytes) . is_ok ( ) {
5731- continue ' load_endpoints;
5732- }
5733- }
5734- }
5700+ let params = ProbabilisticScoringParameters :: default ( ) ;
5701+ let mut scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5702+ let features = channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ;
5703+
5704+ super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) as usize , 2 ) ;
57355705 }
57365706
57375707 #[ test]
@@ -5919,7 +5889,21 @@ mod tests {
59195889
59205890#[ cfg( all( test, not( feature = "no-std" ) ) ) ]
59215891pub ( crate ) mod bench_utils {
5892+ use super :: * ;
59225893 use std:: fs:: File ;
5894+
5895+ use bitcoin:: hashes:: Hash ;
5896+ use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
5897+
5898+ use crate :: chain:: transaction:: OutPoint ;
5899+ use crate :: chain:: keysinterface:: { EntropySource , KeysManager } ;
5900+ use crate :: ln:: channelmanager:: { self , ChannelCounterparty , ChannelDetails } ;
5901+ use crate :: ln:: features:: InvoiceFeatures ;
5902+ use crate :: routing:: gossip:: NetworkGraph ;
5903+ use crate :: util:: config:: UserConfig ;
5904+ use crate :: util:: ser:: ReadableArgs ;
5905+ use crate :: util:: test_utils:: TestLogger ;
5906+
59235907 /// Tries to open a network graph file, or panics with a URL to fetch it.
59245908 pub ( crate ) fn get_route_file ( ) -> Result < std:: fs:: File , & ' static str > {
59255909 let res = File :: open ( "net_graph-2023-01-18.bin" ) // By default we're run in RL/lightning
@@ -5942,42 +5926,18 @@ pub(crate) mod bench_utils {
59425926 #[ cfg( not( require_route_graph_test) ) ]
59435927 return res;
59445928 }
5945- }
5946-
5947- #[ cfg( all( test, feature = "_bench_unstable" , not( feature = "no-std" ) ) ) ]
5948- mod benches {
5949- use super :: * ;
5950- use bitcoin:: hashes:: Hash ;
5951- use bitcoin:: secp256k1:: { PublicKey , Secp256k1 , SecretKey } ;
5952- use crate :: chain:: transaction:: OutPoint ;
5953- use crate :: chain:: keysinterface:: { EntropySource , KeysManager } ;
5954- use crate :: ln:: channelmanager:: { self , ChannelCounterparty , ChannelDetails } ;
5955- use crate :: ln:: features:: InvoiceFeatures ;
5956- use crate :: routing:: gossip:: NetworkGraph ;
5957- use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScorer , ProbabilisticScoringParameters } ;
5958- use crate :: util:: config:: UserConfig ;
5959- use crate :: util:: logger:: { Logger , Record } ;
5960- use crate :: util:: ser:: ReadableArgs ;
59615929
5962- use test:: Bencher ;
5963-
5964- struct DummyLogger { }
5965- impl Logger for DummyLogger {
5966- fn log ( & self , _record : & Record ) { }
5967- }
5968-
5969- fn read_network_graph ( logger : & DummyLogger ) -> NetworkGraph < & DummyLogger > {
5970- let mut d = bench_utils:: get_route_file ( ) . unwrap ( ) ;
5971- NetworkGraph :: read ( & mut d, logger) . unwrap ( )
5930+ pub ( crate ) fn read_network_graph ( logger : & TestLogger ) -> Result < NetworkGraph < & TestLogger > , & ' static str > {
5931+ get_route_file ( ) . map ( |mut f| NetworkGraph :: read ( & mut f, logger) . unwrap ( ) )
59725932 }
59735933
5974- fn payer_pubkey ( ) -> PublicKey {
5934+ pub ( crate ) fn payer_pubkey ( ) -> PublicKey {
59755935 let secp_ctx = Secp256k1 :: new ( ) ;
59765936 PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) )
59775937 }
59785938
59795939 #[ inline]
5980- fn first_hop ( node_id : PublicKey ) -> ChannelDetails {
5940+ pub ( crate ) fn first_hop ( node_id : PublicKey ) -> ChannelDetails {
59815941 ChannelDetails {
59825942 channel_id : [ 0 ; 32 ] ,
59835943 counterparty : ChannelCounterparty {
@@ -6016,63 +5976,27 @@ mod benches {
60165976 }
60175977 }
60185978
6019- #[ bench]
6020- fn generate_routes_with_zero_penalty_scorer ( bench : & mut Bencher ) {
6021- let logger = DummyLogger { } ;
6022- let network_graph = read_network_graph ( & logger) ;
6023- let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6024- generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6025- }
6026-
6027- #[ bench]
6028- fn generate_mpp_routes_with_zero_penalty_scorer ( bench : & mut Bencher ) {
6029- let logger = DummyLogger { } ;
6030- let network_graph = read_network_graph ( & logger) ;
6031- let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6032- generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6033- }
6034-
6035- #[ bench]
6036- fn generate_routes_with_probabilistic_scorer ( bench : & mut Bencher ) {
6037- let logger = DummyLogger { } ;
6038- let network_graph = read_network_graph ( & logger) ;
6039- let params = ProbabilisticScoringParameters :: default ( ) ;
6040- let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6041- generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6042- }
6043-
6044- #[ bench]
6045- fn generate_mpp_routes_with_probabilistic_scorer ( bench : & mut Bencher ) {
6046- let logger = DummyLogger { } ;
6047- let network_graph = read_network_graph ( & logger) ;
6048- let params = ProbabilisticScoringParameters :: default ( ) ;
6049- let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6050- generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6051- }
6052-
6053- fn generate_routes < S : Score > (
6054- bench : & mut Bencher , graph : & NetworkGraph < & DummyLogger > , mut scorer : S ,
6055- features : InvoiceFeatures
6056- ) {
6057- let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
5979+ pub ( crate ) fn generate_test_routes < S : Score > ( graph : & NetworkGraph < & TestLogger > , scorer : & mut S ,
5980+ features : InvoiceFeatures , mut seed : usize , route_count : usize ,
5981+ ) -> Vec < ( ChannelDetails , PaymentParameters , u64 ) > {
60585982 let payer = payer_pubkey ( ) ;
60595983 let keys_manager = KeysManager :: new ( & [ 0u8 ; 32 ] , 42 , 42 ) ;
60605984 let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
60615985
6062- // First, get 100 (source, destination) pairs for which route-getting actually succeeds...
6063- let mut routes = Vec :: new ( ) ;
5986+ let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
60645987 let mut route_endpoints = Vec :: new ( ) ;
6065- let mut seed: usize = 0xdeadbeef ;
6066- ' load_endpoints: for _ in 0 ..150 {
5988+ let mut routes = Vec :: new ( ) ;
5989+
5990+ ' load_endpoints: for _ in 0 ..route_count * 3 /2 {
60675991 loop {
6068- seed *= 0xdeadbeef ;
5992+ seed = seed . overflowing_mul ( 0xdeadbeef ) . 0 ;
60695993 let src = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
6070- seed *= 0xdeadbeef ;
5994+ seed = seed . overflowing_mul ( 0xdeadbeef ) . 0 ;
60715995 let dst = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
60725996 let params = PaymentParameters :: from_node_id ( dst, 42 ) . with_features ( features. clone ( ) ) ;
60735997 let first_hop = first_hop ( src) ;
60745998 let amt = seed as u64 % 1_000_000 ;
6075- if let Ok ( route) = get_route ( & payer, & params, & graph. read_only ( ) , Some ( & [ & first_hop] ) , amt, & DummyLogger { } , & scorer, & random_seed_bytes) {
5999+ if let Ok ( route) = get_route ( & payer, & params, & graph. read_only ( ) , Some ( & [ & first_hop] ) , amt, & TestLogger :: new ( ) , & scorer, & random_seed_bytes) {
60766000 routes. push ( route) ;
60776001 route_endpoints. push ( ( first_hop, params, amt) ) ;
60786002 continue ' load_endpoints;
@@ -6099,10 +6023,79 @@ mod benches {
60996023 // selected destinations, possibly causing us to fail because, eg, the newly-selected path
61006024 // requires a too-high CLTV delta.
61016025 route_endpoints. retain ( |( first_hop, params, amt) | {
6102- get_route ( & payer, params, & graph. read_only ( ) , Some ( & [ first_hop] ) , * amt, & DummyLogger { } , & scorer, & random_seed_bytes) . is_ok ( )
6026+ get_route ( & payer, params, & graph. read_only ( ) , Some ( & [ first_hop] ) , * amt, & TestLogger :: new ( ) , & scorer, & random_seed_bytes) . is_ok ( )
61036027 } ) ;
6104- route_endpoints. truncate ( 100 ) ;
6105- assert_eq ! ( route_endpoints. len( ) , 100 ) ;
6028+ route_endpoints. truncate ( route_count) ;
6029+ assert_eq ! ( route_endpoints. len( ) , route_count) ;
6030+ route_endpoints
6031+ }
6032+ }
6033+
6034+ #[ cfg( all( test, feature = "_bench_unstable" , not( feature = "no-std" ) ) ) ]
6035+ mod benches {
6036+ use super :: * ;
6037+ use crate :: chain:: keysinterface:: { EntropySource , KeysManager } ;
6038+ use crate :: ln:: channelmanager;
6039+ use crate :: ln:: features:: InvoiceFeatures ;
6040+ use crate :: routing:: gossip:: NetworkGraph ;
6041+ use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScorer , ProbabilisticScoringParameters } ;
6042+ use crate :: util:: config:: UserConfig ;
6043+ use crate :: util:: logger:: { Logger , Record } ;
6044+ use crate :: util:: test_utils:: TestLogger ;
6045+
6046+ use test:: Bencher ;
6047+
6048+ struct DummyLogger { }
6049+ impl Logger for DummyLogger {
6050+ fn log ( & self , _record : & Record ) { }
6051+ }
6052+
6053+
6054+ #[ bench]
6055+ fn generate_routes_with_zero_penalty_scorer ( bench : & mut Bencher ) {
6056+ let logger = TestLogger :: new ( ) ;
6057+ let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6058+ let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6059+ generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6060+ }
6061+
6062+ #[ bench]
6063+ fn generate_mpp_routes_with_zero_penalty_scorer ( bench : & mut Bencher ) {
6064+ let logger = TestLogger :: new ( ) ;
6065+ let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6066+ let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6067+ generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6068+ }
6069+
6070+ #[ bench]
6071+ fn generate_routes_with_probabilistic_scorer ( bench : & mut Bencher ) {
6072+ let logger = TestLogger :: new ( ) ;
6073+ let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6074+ let params = ProbabilisticScoringParameters :: default ( ) ;
6075+ let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6076+ generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6077+ }
6078+
6079+ #[ bench]
6080+ fn generate_mpp_routes_with_probabilistic_scorer ( bench : & mut Bencher ) {
6081+ let logger = TestLogger :: new ( ) ;
6082+ let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6083+ let params = ProbabilisticScoringParameters :: default ( ) ;
6084+ let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6085+ generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6086+ }
6087+
6088+
6089+ fn generate_routes < S : Score > (
6090+ bench : & mut Bencher , graph : & NetworkGraph < & TestLogger > , mut scorer : S ,
6091+ features : InvoiceFeatures ,
6092+ ) {
6093+ let payer = bench_utils:: payer_pubkey ( ) ;
6094+ let keys_manager = KeysManager :: new ( & [ 0u8 ; 32 ] , 42 , 42 ) ;
6095+ let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
6096+
6097+ // First, get 100 (source, destination) pairs for which route-getting actually succeeds...
6098+ let route_endpoints = bench_utils:: generate_test_routes ( graph, & mut scorer, features, 0xdeadbeef , 100 ) ;
61066099
61076100 // ...then benchmark finding paths between the nodes we learned.
61086101 let mut idx = 0 ;
0 commit comments