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 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<Fn() -> Vec<SocketAddr> + Send> {
|
|||
pub fn web_seeds() -> Box<Fn() -> Vec<SocketAddr> + 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::<Vec<_>>();
|
||||
debug!(LOGGER, "Retrieved seed addresses: {:?}", addrs);
|
||||
|
|
|
@ -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::<Vec<p2p::PeerData>>(url.as_str());
|
||||
assert!(peers_all.is_ok());
|
||||
assert_eq!(
|
||||
peers_all
|
||||
.unwrap()
|
||||
.iter()
|
||||
.filter(|x| x.flags == p2p::State::Healthy)
|
||||
.collect::<Vec<&p2p::PeerData>>()
|
||||
.len(),
|
||||
4
|
||||
let url = format!(
|
||||
"http://{}:{}/v1/peers/connected",
|
||||
&server_config.base_addr, 30020
|
||||
);
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue