@@ -5,7 +5,7 @@ use std::net::SocketAddr;
55use std:: path:: PathBuf ;
66use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
77use std:: sync:: Arc ;
8- use std:: time:: { Duration , SystemTime } ;
8+ use std:: time:: Duration ;
99use tokio:: sync:: { broadcast, Mutex } ;
1010use tokio:: task:: JoinSet ;
1111use tokio:: time;
@@ -57,8 +57,6 @@ pub struct PeerNetworkManager {
5757 tasks : Arc < Mutex < JoinSet < ( ) > > > ,
5858 /// Initial peer addresses
5959 initial_peers : Vec < SocketAddr > ,
60- /// When we first started needing peers (for DNS delay)
61- peer_search_started : Arc < Mutex < Option < SystemTime > > > ,
6260 /// Current sync peer (sticky during sync operations)
6361 current_sync_peer : Arc < Mutex < Option < SocketAddr > > > ,
6462 /// Data directory for storage
@@ -115,7 +113,6 @@ impl PeerNetworkManager {
115113 shutdown_token : CancellationToken :: new ( ) ,
116114 tasks : Arc :: new ( Mutex :: new ( JoinSet :: new ( ) ) ) ,
117115 initial_peers : config. peers . clone ( ) ,
118- peer_search_started : Arc :: new ( Mutex :: new ( None ) ) ,
119116 current_sync_peer : Arc :: new ( Mutex :: new ( None ) ) ,
120117 data_dir,
121118 mempool_strategy : config. mempool_strategy ,
@@ -744,7 +741,6 @@ impl PeerNetworkManager {
744741 let addrv2_handler = self . addrv2_handler . clone ( ) ;
745742 let peer_store = self . peer_store . clone ( ) ;
746743 let reputation_manager = self . reputation_manager . clone ( ) ;
747- let peer_search_started = self . peer_search_started . clone ( ) ;
748744 let initial_peers = self . initial_peers . clone ( ) ;
749745 let connected_peer_count = self . connected_peer_count . clone ( ) ;
750746
@@ -762,6 +758,9 @@ impl PeerNetworkManager {
762758
763759 let mut tasks = self . tasks . lock ( ) . await ;
764760 tasks. spawn ( async move {
761+ // Periodic DNS discovery check (only active in non-exclusive mode)
762+ let mut dns_interval = time:: interval ( DNS_DISCOVERY_DELAY ) ;
763+
765764 while !shutdown_token. is_cancelled ( ) {
766765 // Clean up disconnected peers
767766 pool. cleanup_disconnected ( ) . await ;
@@ -787,21 +786,6 @@ impl PeerNetworkManager {
787786 } else {
788787 // Normal mode: try to maintain minimum peer count with discovery
789788 if count < MIN_PEERS {
790- // Track when we first started needing peers
791- let mut search_started = peer_search_started. lock ( ) . await ;
792- if search_started. is_none ( ) {
793- * search_started = Some ( SystemTime :: now ( ) ) ;
794- log:: info!( "Below minimum peers ({}/{}), starting peer search (will try DNS after {}s)" , count, MIN_PEERS , DNS_DISCOVERY_DELAY . as_secs( ) ) ;
795- }
796- let search_time = match * search_started {
797- Some ( time) => time,
798- None => {
799- log:: error!( "Search time not set when expected" ) ;
800- continue ;
801- }
802- } ;
803- drop ( search_started) ;
804-
805789 // Try known addresses first, sorted by reputation
806790 let known = addrv2_handler. get_known_addresses ( ) . await ;
807791 let needed = TARGET_PEERS . saturating_sub ( count) ;
@@ -825,51 +809,6 @@ impl PeerNetworkManager {
825809 }
826810 }
827811
828- // If still need more, check if we can use DNS (after 10 second delay)
829- let count = pool. peer_count ( ) . await ;
830- if count < MIN_PEERS {
831- let elapsed = SystemTime :: now ( )
832- . duration_since ( search_time)
833- . unwrap_or_else ( |e| {
834- log:: warn!( "System time error calculating elapsed time: {}" , e) ;
835- Duration :: ZERO
836- } ) ;
837- if elapsed >= DNS_DISCOVERY_DELAY {
838- log:: info!( "Using DNS discovery after {}s delay" , elapsed. as_secs( ) ) ;
839- let dns_peers = tokio:: select! {
840- peers = discovery. discover_peers( network) => peers,
841- _ = shutdown_token. cancelled( ) => {
842- log:: info!( "Maintenance loop shutting down during DNS discovery" ) ;
843- break ;
844- }
845- } ;
846- let mut dns_attempted = 0 ;
847- for addr in dns_peers. into_iter ( ) {
848- if !pool. is_connected ( & addr) . await && !pool. is_connecting ( & addr) . await {
849- tokio:: select! {
850- _= connect_fn( addr) => { } ,
851- _ = shutdown_token. cancelled( ) => {
852- log:: info!( "Maintenance loop shutting down during connection attempt (dns)" ) ;
853- break ;
854- }
855- }
856- dns_attempted += 1 ;
857- if dns_attempted >= needed {
858- break ;
859- }
860- }
861- }
862- } else {
863- log:: debug!( "Waiting for DNS delay: {}s elapsed, need {}s" , elapsed. as_secs( ) , DNS_DISCOVERY_DELAY . as_secs( ) ) ;
864- }
865- }
866- } else {
867- // We have enough peers, reset the search timer
868- let mut search_started = peer_search_started. lock ( ) . await ;
869- if search_started. is_some ( ) {
870- log:: trace!( "Peer count restored, resetting DNS delay timer" ) ;
871- * search_started = None ;
872- }
873812 }
874813 }
875814
@@ -909,6 +848,36 @@ impl PeerNetworkManager {
909848 _ = time:: sleep( MAINTENANCE_INTERVAL ) => {
910849 log:: debug!( "Maintenance interval elapsed" ) ;
911850 }
851+ _ = dns_interval. tick( ) , if !exclusive_mode => {
852+ let count = pool. peer_count( ) . await ;
853+ if count >= MIN_PEERS {
854+ continue ;
855+ }
856+ let dns_peers = tokio:: select! {
857+ peers = discovery. discover_peers( network) => peers,
858+ _ = shutdown_token. cancelled( ) => {
859+ log:: info!( "Maintenance loop shutting down during DNS discovery" ) ;
860+ break ;
861+ }
862+ } ;
863+ let needed = TARGET_PEERS . saturating_sub( count) ;
864+ let mut dns_attempted = 0 ;
865+ for addr in dns_peers. iter( ) {
866+ if !pool. is_connected( addr) . await && !pool. is_connecting( addr) . await {
867+ tokio:: select! {
868+ _= connect_fn( * addr) => { } ,
869+ _ = shutdown_token. cancelled( ) => {
870+ log:: info!( "Maintenance loop shutting down during connection attempt (dns)" ) ;
871+ break ;
872+ }
873+ }
874+ dns_attempted += 1 ;
875+ if dns_attempted >= needed {
876+ break ;
877+ }
878+ }
879+ }
880+ }
912881 _ = shutdown_token. cancelled( ) => {
913882 log:: info!( "Maintenance loop shutting down" ) ;
914883 break ;
@@ -1296,7 +1265,6 @@ impl Clone for PeerNetworkManager {
12961265 shutdown_token : self . shutdown_token . clone ( ) ,
12971266 tasks : self . tasks . clone ( ) ,
12981267 initial_peers : self . initial_peers . clone ( ) ,
1299- peer_search_started : self . peer_search_started . clone ( ) ,
13001268 current_sync_peer : self . current_sync_peer . clone ( ) ,
13011269 data_dir : self . data_dir . clone ( ) ,
13021270 mempool_strategy : self . mempool_strategy ,
0 commit comments