From 420869dab5dc73e86a7915f5cc29da4a9291a586 Mon Sep 17 00:00:00 2001 From: Daniel Schadt Date: Fri, 17 Jul 2020 16:07:39 +0200 Subject: retry uploading As it turns out, uploading is often the reason why the process crashes/exits. This is bad because it means that 1) we lose links to logs (as they are not being uploaded), leading to incomplete reporting and 2) we rely on an external watchdog to keep the service alive (and I'd rather just not have ezau crashing, especially on Windows where we usually don't supervise it with systemd). Therefore, a configuration setting has been added that lets ezau retry the upload process. This is not 100% good and failsafe, because 1) it always waits a hardcoded amount of seconds (instead of e.g. using a proper backoff timer) 2) it blocks the rest of the process, so no logs will be compressed while it is retrying a single log 3) after those retries, the process will still exit But it is a good first approximation, and the aforementioned issues can be fixed "relatively easily" (e.g. by moving the whole per-log logic into a separate thread(pool) and handling failures even better). --- src/config.rs | 3 +++ src/main.rs | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/config.rs b/src/config.rs index e4203de..6b9a89d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,6 +11,9 @@ pub struct Config { /// Flag indicating whether logs with an unknown boss should be uploaded. #[serde(default)] pub upload_unknown: bool, + /// How often the upload to dps.report should be retried. + #[serde(default)] + pub retries: u32, /// Option Discord information for bot postings. pub discord: Option, } diff --git a/src/main.rs b/src/main.rs index f2fa2ec..ddf54d8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::{ io::{BufReader, BufWriter, Read, Write}, path::{Path, PathBuf}, sync::mpsc::channel, + thread, time::Duration, }; @@ -23,6 +24,7 @@ mod discord; const DPS_REPORT_API: &str = "https://dps.report/uploadContent"; const WATCH_DELAY_SECONDS: u64 = 2; +const RETRY_DELAY: Duration = Duration::from_secs(5); #[derive(Clap, Debug, Clone, PartialEq, Eq, Hash)] #[clap(version = "0.1")] @@ -161,7 +163,24 @@ fn handle_file(config: &Config, filename: &Path) -> Result<()> { return Ok(()); } - let permalink = upload_log(filename)?; + let mut try_counter = 0; + let permalink = loop { + let result = upload_log(filename); + if let Ok(link) = result { + break link; + } + warn!( + "Upload try {} failed, retrying {} more times. Reason: {}", + try_counter + 1, + config.retries - try_counter, + result.as_ref().unwrap_err(), + ); + if try_counter == config.retries { + return Err(result.unwrap_err()); + } + try_counter += 1; + thread::sleep(RETRY_DELAY); + }; info!("Uploaded log, available at {}", permalink); if let Some(d) = &config.discord { -- cgit v1.2.3