Skip to content

Commit d216d21

Browse files
authored
refactor: simplify DNS discovery fallback (#423)
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 73fd339 commit d216d21

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,
@@ -774,7 +771,6 @@ impl PeerNetworkManager {
774771
let addrv2_handler = self.addrv2_handler.clone();
775772
let peer_store = self.peer_store.clone();
776773
let reputation_manager = self.reputation_manager.clone();
777-
let peer_search_started = self.peer_search_started.clone();
778774
let initial_peers = self.initial_peers.clone();
779775
let connected_peer_count = self.connected_peer_count.clone();
780776

@@ -792,6 +788,9 @@ impl PeerNetworkManager {
792788

793789
let mut tasks = self.tasks.lock().await;
794790
tasks.spawn(async move {
791+
// Periodic DNS discovery check (only active in non-exclusive mode)
792+
let mut dns_interval = time::interval(DNS_DISCOVERY_DELAY);
793+
795794
while !shutdown_token.is_cancelled() {
796795
// Clean up disconnected peers
797796
pool.cleanup_disconnected().await;
@@ -817,21 +816,6 @@ impl PeerNetworkManager {
817816
} else {
818817
// Normal mode: try to maintain minimum peer count with discovery
819818
if count < MIN_PEERS {
820-
// Track when we first started needing peers
821-
let mut search_started = peer_search_started.lock().await;
822-
if search_started.is_none() {
823-
*search_started = Some(SystemTime::now());
824-
log::info!("Below minimum peers ({}/{}), starting peer search (will try DNS after {}s)", count, MIN_PEERS, DNS_DISCOVERY_DELAY.as_secs());
825-
}
826-
let search_time = match *search_started {
827-
Some(time) => time,
828-
None => {
829-
log::error!("Search time not set when expected");
830-
continue;
831-
}
832-
};
833-
drop(search_started);
834-
835819
// Try known addresses first, sorted by reputation
836820
let known = addrv2_handler.get_known_addresses().await;
837821
let needed = TARGET_PEERS.saturating_sub(count);
@@ -855,51 +839,6 @@ impl PeerNetworkManager {
855839
}
856840
}
857841

858-
// If still need more, check if we can use DNS (after 10 second delay)
859-
let count = pool.peer_count().await;
860-
if count < MIN_PEERS {
861-
let elapsed = SystemTime::now()
862-
.duration_since(search_time)
863-
.unwrap_or_else(|e| {
864-
log::warn!("System time error calculating elapsed time: {}", e);
865-
Duration::ZERO
866-
});
867-
if elapsed >= DNS_DISCOVERY_DELAY {
868-
log::info!("Using DNS discovery after {}s delay", elapsed.as_secs());
869-
let dns_peers = tokio::select! {
870-
peers = discovery.discover_peers(network) => peers,
871-
_ = shutdown_token.cancelled() => {
872-
log::info!("Maintenance loop shutting down during DNS discovery");
873-
break;
874-
}
875-
};
876-
let mut dns_attempted = 0;
877-
for addr in dns_peers.into_iter() {
878-
if !pool.is_connected(&addr).await && !pool.is_connecting(&addr).await {
879-
tokio::select! {
880-
_= connect_fn(addr) => {},
881-
_ = shutdown_token.cancelled() => {
882-
log::info!("Maintenance loop shutting down during connection attempt (dns)");
883-
break;
884-
}
885-
}
886-
dns_attempted += 1;
887-
if dns_attempted >= needed {
888-
break;
889-
}
890-
}
891-
}
892-
} else {
893-
log::debug!("Waiting for DNS delay: {}s elapsed, need {}s", elapsed.as_secs(), DNS_DISCOVERY_DELAY.as_secs());
894-
}
895-
}
896-
} else {
897-
// We have enough peers, reset the search timer
898-
let mut search_started = peer_search_started.lock().await;
899-
if search_started.is_some() {
900-
log::trace!("Peer count restored, resetting DNS delay timer");
901-
*search_started = None;
902-
}
903842
}
904843
}
905844

@@ -939,6 +878,36 @@ impl PeerNetworkManager {
939878
_ = time::sleep(MAINTENANCE_INTERVAL) => {
940879
log::debug!("Maintenance interval elapsed");
941880
}
881+
_ = dns_interval.tick(), if !exclusive_mode => {
882+
let count = pool.peer_count().await;
883+
if count >= MIN_PEERS {
884+
continue;
885+
}
886+
let dns_peers = tokio::select! {
887+
peers = discovery.discover_peers(network) => peers,
888+
_ = shutdown_token.cancelled() => {
889+
log::info!("Maintenance loop shutting down during DNS discovery");
890+
break;
891+
}
892+
};
893+
let needed = TARGET_PEERS.saturating_sub(count);
894+
let mut dns_attempted = 0;
895+
for addr in dns_peers.iter() {
896+
if !pool.is_connected(addr).await && !pool.is_connecting(addr).await {
897+
tokio::select! {
898+
_= connect_fn(*addr) => {},
899+
_ = shutdown_token.cancelled() => {
900+
log::info!("Maintenance loop shutting down during connection attempt (dns)");
901+
break;
902+
}
903+
}
904+
dns_attempted += 1;
905+
if dns_attempted >= needed {
906+
break;
907+
}
908+
}
909+
}
910+
}
942911
_ = shutdown_token.cancelled() => {
943912
log::info!("Maintenance loop shutting down");
944913
break;
@@ -1326,7 +1295,6 @@ impl Clone for PeerNetworkManager {
13261295
shutdown_token: self.shutdown_token.clone(),
13271296
tasks: self.tasks.clone(),
13281297
initial_peers: self.initial_peers.clone(),
1329-
peer_search_started: self.peer_search_started.clone(),
13301298
current_sync_peer: self.current_sync_peer.clone(),
13311299
data_dir: self.data_dir.clone(),
13321300
mempool_strategy: self.mempool_strategy,

0 commit comments

Comments
 (0)