@@ -22,6 +22,7 @@ use util::logger::Logger;
22
22
23
23
use std:: cmp;
24
24
use std:: sync:: { RwLock , Arc } ;
25
+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
25
26
use std:: collections:: { HashMap , BinaryHeap , BTreeMap } ;
26
27
use std:: collections:: btree_map:: Entry as BtreeEntry ;
27
28
use std;
@@ -347,6 +348,7 @@ pub struct RouteHint {
347
348
pub struct Router {
348
349
secp_ctx : Secp256k1 < secp256k1:: VerifyOnly > ,
349
350
network_map : RwLock < NetworkMap > ,
351
+ full_syncs_requested : AtomicUsize ,
350
352
chain_monitor : Arc < ChainWatchInterface > ,
351
353
logger : Arc < Logger > ,
352
354
}
@@ -390,6 +392,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, RouterReadArgs> for Router {
390
392
Ok ( Router {
391
393
secp_ctx : Secp256k1 :: verification_only ( ) ,
392
394
network_map : RwLock :: new ( network_map) ,
395
+ full_syncs_requested : AtomicUsize :: new ( 0 ) ,
393
396
chain_monitor : args. chain_monitor ,
394
397
logger : args. logger ,
395
398
} )
@@ -406,6 +409,7 @@ macro_rules! secp_verify_sig {
406
409
}
407
410
408
411
impl RoutingMessageHandler for Router {
412
+
409
413
fn handle_node_announcement ( & self , msg : & msgs:: NodeAnnouncement ) -> Result < bool , LightningError > {
410
414
let msg_hash = hash_to_message ! ( & Sha256dHash :: hash( & msg. contents. encode( ) [ ..] ) [ ..] ) ;
411
415
secp_verify_sig ! ( self . secp_ctx, & msg_hash, & msg. signature, & msg. contents. node_id) ;
@@ -698,6 +702,17 @@ impl RoutingMessageHandler for Router {
698
702
}
699
703
result
700
704
}
705
+
706
+ fn should_request_full_sync ( & self , _node_id : & PublicKey ) -> bool {
707
+ //TODO: Determine whether to request a full sync based on the network map.
708
+ const FULL_SYNCS_TO_REQUEST : usize = 5 ;
709
+ if self . full_syncs_requested . load ( Ordering :: Acquire ) < FULL_SYNCS_TO_REQUEST {
710
+ self . full_syncs_requested . fetch_add ( 1 , Ordering :: AcqRel ) ;
711
+ true
712
+ } else {
713
+ false
714
+ }
715
+ }
701
716
}
702
717
703
718
#[ derive( Eq , PartialEq ) ]
@@ -750,6 +765,7 @@ impl Router {
750
765
our_node_id : our_pubkey,
751
766
nodes : nodes,
752
767
} ) ,
768
+ full_syncs_requested : AtomicUsize :: new ( 0 ) ,
753
769
chain_monitor,
754
770
logger,
755
771
}
@@ -1035,7 +1051,7 @@ mod tests {
1035
1051
use ln:: channelmanager;
1036
1052
use ln:: router:: { Router , NodeInfo , NetworkMap , ChannelInfo , DirectionalChannelInfo , RouteHint } ;
1037
1053
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1038
- use ln:: msgs:: { LightningError , ErrorAction } ;
1054
+ use ln:: msgs:: { ErrorAction , LightningError , RoutingMessageHandler } ;
1039
1055
use util:: test_utils;
1040
1056
use util:: test_utils:: TestVecWriter ;
1041
1057
use util:: logger:: Logger ;
@@ -1048,17 +1064,23 @@ mod tests {
1048
1064
use hex;
1049
1065
1050
1066
use secp256k1:: key:: { PublicKey , SecretKey } ;
1067
+ use secp256k1:: All ;
1051
1068
use secp256k1:: Secp256k1 ;
1052
1069
1053
1070
use std:: sync:: Arc ;
1054
1071
1055
- #[ test]
1056
- fn route_test ( ) {
1072
+ fn create_router ( ) -> ( Secp256k1 < All > , PublicKey , Router ) {
1057
1073
let secp_ctx = Secp256k1 :: new ( ) ;
1058
1074
let our_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & hex:: decode ( "0101010101010101010101010101010101010101010101010101010101010101" ) . unwrap ( ) [ ..] ) . unwrap ( ) ) ;
1059
1075
let logger: Arc < Logger > = Arc :: new ( test_utils:: TestLogger :: new ( ) ) ;
1060
1076
let chain_monitor = Arc :: new ( chaininterface:: ChainWatchInterfaceUtil :: new ( Network :: Testnet , Arc :: clone ( & logger) ) ) ;
1061
1077
let router = Router :: new ( our_id, chain_monitor, Arc :: clone ( & logger) ) ;
1078
+ ( secp_ctx, our_id, router)
1079
+ }
1080
+
1081
+ #[ test]
1082
+ fn route_test ( ) {
1083
+ let ( secp_ctx, our_id, router) = create_router ( ) ;
1062
1084
1063
1085
// Build network from our_id to node8:
1064
1086
//
@@ -1823,4 +1845,17 @@ mod tests {
1823
1845
assert ! ( <NetworkMap >:: read( & mut :: std:: io:: Cursor :: new( & w. 0 ) ) . unwrap( ) == * network) ;
1824
1846
}
1825
1847
}
1848
+
1849
+ #[ test]
1850
+ fn request_full_sync_finite_times ( ) {
1851
+ let ( secp_ctx, _, router) = create_router ( ) ;
1852
+ let node_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & hex:: decode ( "0202020202020202020202020202020202020202020202020202020202020202" ) . unwrap ( ) [ ..] ) . unwrap ( ) ) ;
1853
+
1854
+ assert ! ( router. should_request_full_sync( & node_id) ) ;
1855
+ assert ! ( router. should_request_full_sync( & node_id) ) ;
1856
+ assert ! ( router. should_request_full_sync( & node_id) ) ;
1857
+ assert ! ( router. should_request_full_sync( & node_id) ) ;
1858
+ assert ! ( router. should_request_full_sync( & node_id) ) ;
1859
+ assert ! ( !router. should_request_full_sync( & node_id) ) ;
1860
+ }
1826
1861
}
0 commit comments