diff --git a/src/backup.rs b/src/backup.rs index 304a976..93762db 100644 --- a/src/backup.rs +++ b/src/backup.rs @@ -1,7 +1,9 @@ use crate::store::Store; use crate::Error; use demostf_client::{ApiClient, Demo, ListOrder, ListParams}; -use tracing::{info, instrument}; +use std::time::Duration; +use tokio::time::timeout; +use tracing::{error, info, instrument}; pub struct Backup { client: ApiClient, @@ -22,10 +24,23 @@ impl Backup { { let file = self.store.create(name).await?; - if let Err(e) = demo.save(&self.client, file).await { - let _ = self.store.remove(name); - return Err(e.into()); - } + match timeout(Duration::from_secs(5 * 60), async { + if let Err(e) = demo.save(&self.client, file).await { + let _ = self.store.remove(name); + Err::<(), Error>(e.into()) + } else { + Ok::<_, Error>(()) + } + }) + .await + { + Err(_timeout) => { + error!("timeout while downloading demo"); + let _ = self.store.remove(name); + Err(Error::Timeout) + } + Ok(res) => res, + }?; } let digest = self.store.hash(name)?; diff --git a/src/main.rs b/src/main.rs index aa84c19..3c95c1e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,8 @@ pub enum Error { Api(#[from] demostf_client::Error), #[error("MD5 digest mismatch for downloaded demo, expected {expected:?}, received {got:?}")] DigestMismatch { expected: [u8; 16], got: [u8; 16] }, + #[error("Backup timed out")] + Timeout, } #[tokio::main]