@@ -22,6 +22,7 @@ use util::logger::Logger;
2222
2323use std:: cmp;
2424use std:: sync:: { RwLock , Arc } ;
25+ use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
2526use std:: collections:: { HashMap , BinaryHeap , BTreeMap } ;
2627use std:: collections:: btree_map:: Entry as BtreeEntry ;
2728use std;
@@ -347,6 +348,7 @@ pub struct RouteHint {
347348pub struct Router {
348349 secp_ctx : Secp256k1 < secp256k1:: VerifyOnly > ,
349350 network_map : RwLock < NetworkMap > ,
351+ full_syncs_requested : AtomicUsize ,
350352 chain_monitor : Arc < ChainWatchInterface > ,
351353 logger : Arc < Logger > ,
352354}
@@ -390,6 +392,7 @@ impl<R: ::std::io::Read> ReadableArgs<R, RouterReadArgs> for Router {
390392 Ok ( Router {
391393 secp_ctx : Secp256k1 :: verification_only ( ) ,
392394 network_map : RwLock :: new ( network_map) ,
395+ full_syncs_requested : AtomicUsize :: new ( 0 ) ,
393396 chain_monitor : args. chain_monitor ,
394397 logger : args. logger ,
395398 } )
@@ -406,6 +409,7 @@ macro_rules! secp_verify_sig {
406409}
407410
408411impl RoutingMessageHandler for Router {
412+
409413 fn handle_node_announcement ( & self , msg : & msgs:: NodeAnnouncement ) -> Result < bool , LightningError > {
410414 let msg_hash = hash_to_message ! ( & Sha256dHash :: hash( & msg. contents. encode( ) [ ..] ) [ ..] ) ;
411415 secp_verify_sig ! ( self . secp_ctx, & msg_hash, & msg. signature, & msg. contents. node_id) ;
@@ -698,6 +702,17 @@ impl RoutingMessageHandler for Router {
698702 }
699703 result
700704 }
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+ }
701716}
702717
703718#[ derive( Eq , PartialEq ) ]
@@ -750,6 +765,7 @@ impl Router {
750765 our_node_id : our_pubkey,
751766 nodes : nodes,
752767 } ) ,
768+ full_syncs_requested : AtomicUsize :: new ( 0 ) ,
753769 chain_monitor,
754770 logger,
755771 }
@@ -1035,7 +1051,7 @@ mod tests {
10351051 use ln:: channelmanager;
10361052 use ln:: router:: { Router , NodeInfo , NetworkMap , ChannelInfo , DirectionalChannelInfo , RouteHint } ;
10371053 use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
1038- use ln:: msgs:: { LightningError , ErrorAction } ;
1054+ use ln:: msgs:: { ErrorAction , LightningError , RoutingMessageHandler } ;
10391055 use util:: test_utils;
10401056 use util:: test_utils:: TestVecWriter ;
10411057 use util:: logger:: Logger ;
@@ -1048,17 +1064,23 @@ mod tests {
10481064 use hex;
10491065
10501066 use secp256k1:: key:: { PublicKey , SecretKey } ;
1067+ use secp256k1:: All ;
10511068 use secp256k1:: Secp256k1 ;
10521069
10531070 use std:: sync:: Arc ;
10541071
1055- #[ test]
1056- fn route_test ( ) {
1072+ fn create_router ( ) -> ( Secp256k1 < All > , PublicKey , Router ) {
10571073 let secp_ctx = Secp256k1 :: new ( ) ;
10581074 let our_id = PublicKey :: from_secret_key ( & secp_ctx, & SecretKey :: from_slice ( & hex:: decode ( "0101010101010101010101010101010101010101010101010101010101010101" ) . unwrap ( ) [ ..] ) . unwrap ( ) ) ;
10591075 let logger: Arc < Logger > = Arc :: new ( test_utils:: TestLogger :: new ( ) ) ;
10601076 let chain_monitor = Arc :: new ( chaininterface:: ChainWatchInterfaceUtil :: new ( Network :: Testnet , Arc :: clone ( & logger) ) ) ;
10611077 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 ( ) ;
10621084
10631085 // Build network from our_id to node8:
10641086 //
@@ -1823,4 +1845,17 @@ mod tests {
18231845 assert ! ( <NetworkMap >:: read( & mut :: std:: io:: Cursor :: new( & w. 0 ) ) . unwrap( ) == * network) ;
18241846 }
18251847 }
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+ }
18261861}
0 commit comments