Skip to content

Commit 5601598

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 f6c8e06 commit 5601598

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,
@@ -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

Comments
 (0)