mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
Implement exponential backoff for peer monitoring at startup (#1459)
* Implement exponential backoff for peer monitoring at startup Fixes #1413
This commit is contained in:
parent
60d62bfb97
commit
fa00a0ebe6
2 changed files with 17 additions and 13 deletions
|
@ -63,10 +63,15 @@ pub fn connect_and_monitor(
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut prev = Utc::now() - Duration::seconds(60);
|
let mut prev = Utc::now() - Duration::seconds(60);
|
||||||
|
let mut start_attempt = 0;
|
||||||
|
let start_wait_base: i64 = 2;
|
||||||
loop {
|
loop {
|
||||||
let current_time = Utc::now();
|
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)
|
|| current_time - prev > Duration::seconds(20)
|
||||||
{
|
{
|
||||||
// try to connect to any address sent to the channel
|
// 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());
|
update_dandelion_relay(peers.clone(), dandelion_config.clone());
|
||||||
|
|
||||||
prev = current_time;
|
prev = current_time;
|
||||||
|
if start_attempt < 6 {
|
||||||
|
start_attempt += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
thread::sleep(time::Duration::from_secs(1));
|
thread::sleep(time::Duration::from_secs(1));
|
||||||
|
@ -305,7 +313,8 @@ pub fn dns_seeds() -> Box<Fn() -> Vec<SocketAddr> + Send> {
|
||||||
pub fn web_seeds() -> Box<Fn() -> Vec<SocketAddr> + Send> {
|
pub fn web_seeds() -> Box<Fn() -> Vec<SocketAddr> + Send> {
|
||||||
Box::new(|| {
|
Box::new(|| {
|
||||||
let text: String = api::client::get(SEEDS_URL).expect("Failed to resolve seeds");
|
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())
|
.map(|s| s.parse().unwrap())
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs);
|
debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs);
|
||||||
|
|
|
@ -123,18 +123,13 @@ fn simulate_seeding() {
|
||||||
thread::sleep(time::Duration::from_secs(5));
|
thread::sleep(time::Duration::from_secs(5));
|
||||||
|
|
||||||
// Check they all end up connected.
|
// Check they all end up connected.
|
||||||
let url = format!("http://{}:{}/v1/peers/all", &server_config.base_addr, 30020);
|
let url = format!(
|
||||||
let peers_all = api::client::get::<Vec<p2p::PeerData>>(url.as_str());
|
"http://{}:{}/v1/peers/connected",
|
||||||
assert!(peers_all.is_ok());
|
&server_config.base_addr, 30020
|
||||||
assert_eq!(
|
|
||||||
peers_all
|
|
||||||
.unwrap()
|
|
||||||
.iter()
|
|
||||||
.filter(|x| x.flags == p2p::State::Healthy)
|
|
||||||
.collect::<Vec<&p2p::PeerData>>()
|
|
||||||
.len(),
|
|
||||||
4
|
|
||||||
);
|
);
|
||||||
|
let peers_all = api::client::get::<Vec<p2p::PeerInfo>>(url.as_str());
|
||||||
|
assert!(peers_all.is_ok());
|
||||||
|
assert_eq!(peers_all.unwrap().len(), 4);
|
||||||
|
|
||||||
stop_all_servers(servers);
|
stop_all_servers(servers);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue