diff --git a/servers/src/grin/seed.rs b/servers/src/grin/seed.rs index 3072b17cf..191c695af 100644 --- a/servers/src/grin/seed.rs +++ b/servers/src/grin/seed.rs @@ -63,10 +63,15 @@ pub fn connect_and_monitor( ); let mut prev = Utc::now() - Duration::seconds(60); + let mut start_attempt = 0; + let start_wait_base: i64 = 2; loop { let current_time = Utc::now(); - if peers.peer_count() < p2p_server.config.peer_min_preferred_count() + // make several attempts to get peers as quick as possible with + // exponential backoff + if (peers.peer_count() < p2p_server.config.peer_min_preferred_count() + && current_time - prev > Duration::seconds(start_wait_base.pow(start_attempt))) || current_time - prev > Duration::seconds(20) { // try to connect to any address sent to the channel @@ -84,6 +89,9 @@ pub fn connect_and_monitor( update_dandelion_relay(peers.clone(), dandelion_config.clone()); prev = current_time; + if start_attempt < 6 { + start_attempt += 1; + } } thread::sleep(time::Duration::from_secs(1)); @@ -305,7 +313,8 @@ pub fn dns_seeds() -> Box Vec + Send> { pub fn web_seeds() -> Box Vec + Send> { Box::new(|| { let text: String = api::client::get(SEEDS_URL).expect("Failed to resolve seeds"); - let addrs = text.split_whitespace() + let addrs = text + .split_whitespace() .map(|s| s.parse().unwrap()) .collect::>(); debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs); diff --git a/servers/tests/simulnet.rs b/servers/tests/simulnet.rs index 5f9a9e9ed..28cab7a26 100644 --- a/servers/tests/simulnet.rs +++ b/servers/tests/simulnet.rs @@ -123,18 +123,13 @@ fn simulate_seeding() { thread::sleep(time::Duration::from_secs(5)); // Check they all end up connected. - let url = format!("http://{}:{}/v1/peers/all", &server_config.base_addr, 30020); - let peers_all = api::client::get::>(url.as_str()); - assert!(peers_all.is_ok()); - assert_eq!( - peers_all - .unwrap() - .iter() - .filter(|x| x.flags == p2p::State::Healthy) - .collect::>() - .len(), - 4 + let url = format!( + "http://{}:{}/v1/peers/connected", + &server_config.base_addr, 30020 ); + let peers_all = api::client::get::>(url.as_str()); + assert!(peers_all.is_ok()); + assert_eq!(peers_all.unwrap().len(), 4); stop_all_servers(servers);