Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Commit

Permalink
updater: apply exponential backoff after download failure (#8059)
Browse files Browse the repository at this point in the history
* updater: apply exponential backoff after download failure

* updater: reset backoff on new release
  • Loading branch information
andresilva authored and tomusdrw committed Mar 16, 2018
1 parent b7682da commit a56507e
Showing 1 changed file with 29 additions and 7 deletions.
36 changes: 29 additions & 7 deletions updater/src/updater.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use std::fs;
use std::io::Write;
use std::path::{PathBuf};
use std::sync::{Arc, Weak};
use std::time::{Duration, Instant};

use ethcore::client::{BlockId, BlockChainClient, ChainNotify};
use ethsync::{SyncProvider};
Expand Down Expand Up @@ -85,6 +86,8 @@ struct UpdaterState {
capability: CapState,

disabled: bool,

backoff: Option<(u32, Instant)>,
}

/// Service for checking for updates and determining whether we can achieve consensus.
Expand Down Expand Up @@ -216,7 +219,19 @@ impl Updater {
let fetched = s.fetching.take().unwrap();
let dest = self.updates_path(&Self::update_file_name(&fetched.version));
if !dest.exists() {
let b = result.map_err(|e| (format!("Unable to fetch update ({}): {:?}", fetched.version, e), false))?;
let b = match result {
Ok(b) => {
s.backoff = None;
b
},
Err(e) => {
let mut n = s.backoff.map(|b| b.0 + 1).unwrap_or(1);
s.backoff = Some((n, Instant::now() + Duration::from_secs(2usize.pow(n) as u64)));

return Err((format!("Unable to fetch update ({}): {:?}", fetched.version, e), false));
},
};

info!(target: "updater", "Fetched latest version ({}) OK to {}", fetched.version, b.display());
fs::create_dir_all(dest.parent().expect("at least one thing pushed; qed")).map_err(|e| (format!("Unable to create updates path: {:?}", e), true))?;
fs::copy(&b, &dest).map_err(|e| (format!("Unable to copy update: {:?}", e), true))?;
Expand Down Expand Up @@ -287,12 +302,14 @@ impl Updater {
drop(s);
self.fetch_done(Ok(PathBuf::new()));
} else {
info!(target: "updater", "Attempting to get parity binary {}", b);
s.fetching = Some(latest.track.clone());
drop(s);
let weak_self = self.weak_self.lock().clone();
let f = move |r: Result<PathBuf, fetch::Error>| if let Some(this) = weak_self.upgrade() { this.fetch_done(r) };
self.fetcher.lock().as_ref().expect("Created on `new`; qed").fetch(b, Box::new(f));
if s.backoff.iter().all(|&(_, instant)| Instant::now() >= instant) {
info!(target: "updater", "Attempting to get parity binary {}", b);
s.fetching = Some(latest.track.clone());
drop(s);
let weak_self = self.weak_self.lock().clone();
let f = move |r: Result<PathBuf, fetch::Error>| if let Some(this) = weak_self.upgrade() { this.fetch_done(r) };
self.fetcher.lock().as_ref().expect("Created on `new`; qed").fetch(b, Box::new(f));
}
}
}
}
Expand Down Expand Up @@ -321,6 +338,11 @@ impl Updater {
}

let mut s = self.state.lock();

if s.latest != latest {
s.backoff = None;
}

s.latest = latest;
s.capability = capability;
}
Expand Down

0 comments on commit a56507e

Please sign in to comment.