@@ -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 ,
@@ -746,7 +743,6 @@ impl PeerNetworkManager {
746743 let addrv2_handler = self . addrv2_handler . clone ( ) ;
747744 let peer_store = self . peer_store . clone ( ) ;
748745 let reputation_manager = self . reputation_manager . clone ( ) ;
749- let peer_search_started = self . peer_search_started . clone ( ) ;
750746 let initial_peers = self . initial_peers . clone ( ) ;
751747 let connected_peer_count = self . connected_peer_count . clone ( ) ;
752748
@@ -764,6 +760,9 @@ impl PeerNetworkManager {
764760
765761 let mut tasks = self . tasks . lock ( ) . await ;
766762 tasks. spawn ( async move {
763+ // Periodic DNS discovery check (only active in non-exclusive mode)
764+ let mut dns_interval = time:: interval ( DNS_DISCOVERY_DELAY ) ;
765+
767766 while !shutdown_token. is_cancelled ( ) {
768767 // Clean up disconnected peers
769768 pool. cleanup_disconnected ( ) . await ;
@@ -789,21 +788,6 @@ impl PeerNetworkManager {
789788 } else {
790789 // Normal mode: try to maintain minimum peer count with discovery
791790 if count < MIN_PEERS {
792- // Track when we first started needing peers
793- let mut search_started = peer_search_started. lock ( ) . await ;
794- if search_started. is_none ( ) {
795- * search_started = Some ( SystemTime :: now ( ) ) ;
796- log:: info!( "Below minimum peers ({}/{}), starting peer search (will try DNS after {}s)" , count, MIN_PEERS , DNS_DISCOVERY_DELAY . as_secs( ) ) ;
797- }
798- let search_time = match * search_started {
799- Some ( time) => time,
800- None => {
801- log:: error!( "Search time not set when expected" ) ;
802- continue ;
803- }
804- } ;
805- drop ( search_started) ;
806-
807791 // Try known addresses first, sorted by reputation
808792 let known = addrv2_handler. get_known_addresses ( ) . await ;
809793 let needed = TARGET_PEERS . saturating_sub ( count) ;
@@ -827,51 +811,6 @@ impl PeerNetworkManager {
827811 }
828812 }
829813
830- // If still need more, check if we can use DNS (after 10 second delay)
831- let count = pool. peer_count ( ) . await ;
832- if count < MIN_PEERS {
833- let elapsed = SystemTime :: now ( )
834- . duration_since ( search_time)
835- . unwrap_or_else ( |e| {
836- log:: warn!( "System time error calculating elapsed time: {}" , e) ;
837- Duration :: ZERO
838- } ) ;
839- if elapsed >= DNS_DISCOVERY_DELAY {
840- log:: info!( "Using DNS discovery after {}s delay" , elapsed. as_secs( ) ) ;
841- let dns_peers = tokio:: select! {
842- peers = discovery. discover_peers( network) => peers,
843- _ = shutdown_token. cancelled( ) => {
844- log:: info!( "Maintenance loop shutting down during DNS discovery" ) ;
845- break ;
846- }
847- } ;
848- let mut dns_attempted = 0 ;
849- for addr in dns_peers. into_iter ( ) {
850- if !pool. is_connected ( & addr) . await && !pool. is_connecting ( & addr) . await {
851- tokio:: select! {
852- _= connect_fn( addr) => { } ,
853- _ = shutdown_token. cancelled( ) => {
854- log:: info!( "Maintenance loop shutting down during connection attempt (dns)" ) ;
855- break ;
856- }
857- }
858- dns_attempted += 1 ;
859- if dns_attempted >= needed {
860- break ;
861- }
862- }
863- }
864- } else {
865- log:: debug!( "Waiting for DNS delay: {}s elapsed, need {}s" , elapsed. as_secs( ) , DNS_DISCOVERY_DELAY . as_secs( ) ) ;
866- }
867- }
868- } else {
869- // We have enough peers, reset the search timer
870- let mut search_started = peer_search_started. lock ( ) . await ;
871- if search_started. is_some ( ) {
872- log:: trace!( "Peer count restored, resetting DNS delay timer" ) ;
873- * search_started = None ;
874- }
875814 }
876815 }
877816
@@ -911,6 +850,36 @@ impl PeerNetworkManager {
911850 _ = time:: sleep( MAINTENANCE_INTERVAL ) => {
912851 log:: debug!( "Maintenance interval elapsed" ) ;
913852 }
853+ _ = dns_interval. tick( ) , if !exclusive_mode => {
854+ let count = pool. peer_count( ) . await ;
855+ if count >= MIN_PEERS {
856+ continue ;
857+ }
858+ let dns_peers = tokio:: select! {
859+ peers = discovery. discover_peers( network) => peers,
860+ _ = shutdown_token. cancelled( ) => {
861+ log:: info!( "Maintenance loop shutting down during DNS discovery" ) ;
862+ break ;
863+ }
864+ } ;
865+ let needed = TARGET_PEERS . saturating_sub( count) ;
866+ let mut dns_attempted = 0 ;
867+ for addr in dns_peers. iter( ) {
868+ if !pool. is_connected( addr) . await && !pool. is_connecting( addr) . await {
869+ tokio:: select! {
870+ _= connect_fn( * addr) => { } ,
871+ _ = shutdown_token. cancelled( ) => {
872+ log:: info!( "Maintenance loop shutting down during connection attempt (dns)" ) ;
873+ break ;
874+ }
875+ }
876+ dns_attempted += 1 ;
877+ if dns_attempted >= needed {
878+ break ;
879+ }
880+ }
881+ }
882+ }
914883 _ = shutdown_token. cancelled( ) => {
915884 log:: info!( "Maintenance loop shutting down" ) ;
916885 break ;
@@ -1298,7 +1267,6 @@ impl Clone for PeerNetworkManager {
12981267 shutdown_token : self . shutdown_token . clone ( ) ,
12991268 tasks : self . tasks . clone ( ) ,
13001269 initial_peers : self . initial_peers . clone ( ) ,
1301- peer_search_started : self . peer_search_started . clone ( ) ,
13021270 current_sync_peer : self . current_sync_peer . clone ( ) ,
13031271 data_dir : self . data_dir . clone ( ) ,
13041272 mempool_strategy : self . mempool_strategy ,
0 commit comments