Skip to content

Commit a8a124f

Browse files
committed
refactor: simplify DNS discovery fallback
Use a `tokio::time::Interval` in the maintenance loop's `select!` instead of manual `SystemTime` elapsed tracking. The interval arm is disabled in exclusive mode via a select guard and skips DNS if peers are already enough. Also, the DNS lookup branch doesn't try to connect immediately but instead in the next loop cycle, which happens straight away.
1 parent b7ee2e4 commit a8a124f

File tree

1 file changed

+34
-66
lines changed

1 file changed

+34
-66
lines changed

dash-spv/src/network/manager.rs

Lines changed: 34 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::net::SocketAddr;
55
use std::path::PathBuf;
66
use std::sync::atomic::{AtomicUsize, Ordering};
77
use std::sync::Arc;
8-
use std::time::{Duration, SystemTime};
8+
use std::time::Duration;
99
use tokio::sync::{broadcast, Mutex};
1010
use tokio::task::JoinSet;
1111
use 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

Comments
 (0)