@@ -5671,29 +5671,15 @@ mod tests {
5671
5671
return ;
5672
5672
} ,
5673
5673
} ;
5674
+
5674
5675
let logger = ln_test_utils:: TestLogger :: new ( ) ;
5675
5676
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 ( ) ;
5678
5677
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 ) ;
5697
5683
}
5698
5684
5699
5685
#[ test]
@@ -5710,28 +5696,12 @@ mod tests {
5710
5696
} ;
5711
5697
let logger = ln_test_utils:: TestLogger :: new ( ) ;
5712
5698
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 ( ) ;
5716
5699
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 ) ;
5735
5705
}
5736
5706
5737
5707
#[ test]
@@ -5919,7 +5889,21 @@ mod tests {
5919
5889
5920
5890
#[ cfg( all( test, not( feature = "no-std" ) ) ) ]
5921
5891
pub ( crate ) mod bench_utils {
5892
+ use super :: * ;
5922
5893
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
+
5923
5907
/// Tries to open a network graph file, or panics with a URL to fetch it.
5924
5908
pub ( crate ) fn get_route_file ( ) -> Result < std:: fs:: File , & ' static str > {
5925
5909
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 {
5942
5926
#[ cfg( not( require_route_graph_test) ) ]
5943
5927
return res;
5944
5928
}
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 ;
5961
5929
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 ( ) )
5972
5932
}
5973
5933
5974
- fn payer_pubkey ( ) -> PublicKey {
5934
+ pub ( crate ) fn payer_pubkey ( ) -> PublicKey {
5975
5935
let secp_ctx = Secp256k1 :: new ( ) ;
5976
5936
PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & [ 42 ; 32 ] ) . unwrap ( ) )
5977
5937
}
5978
5938
5979
5939
#[ inline]
5980
- fn first_hop ( node_id : PublicKey ) -> ChannelDetails {
5940
+ pub ( crate ) fn first_hop ( node_id : PublicKey ) -> ChannelDetails {
5981
5941
ChannelDetails {
5982
5942
channel_id : [ 0 ; 32 ] ,
5983
5943
counterparty : ChannelCounterparty {
@@ -6016,63 +5976,27 @@ mod benches {
6016
5976
}
6017
5977
}
6018
5978
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 ) > {
6058
5982
let payer = payer_pubkey ( ) ;
6059
5983
let keys_manager = KeysManager :: new ( & [ 0u8 ; 32 ] , 42 , 42 ) ;
6060
5984
let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
6061
5985
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 ( ) ;
6064
5987
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 {
6067
5991
loop {
6068
- seed *= 0xdeadbeef ;
5992
+ seed = seed . overflowing_mul ( 0xdeadbeef ) . 0 ;
6069
5993
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 ;
6071
5995
let dst = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
6072
5996
let params = PaymentParameters :: from_node_id ( dst, 42 ) . with_features ( features. clone ( ) ) ;
6073
5997
let first_hop = first_hop ( src) ;
6074
5998
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) {
6076
6000
routes. push ( route) ;
6077
6001
route_endpoints. push ( ( first_hop, params, amt) ) ;
6078
6002
continue ' load_endpoints;
@@ -6099,10 +6023,79 @@ mod benches {
6099
6023
// selected destinations, possibly causing us to fail because, eg, the newly-selected path
6100
6024
// requires a too-high CLTV delta.
6101
6025
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 ( )
6103
6027
} ) ;
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 ) ;
6106
6099
6107
6100
// ...then benchmark finding paths between the nodes we learned.
6108
6101
let mut idx = 0 ;
0 commit comments