timeout for demo download

This commit is contained in:
Robin Appelman 2022-05-12 20:49:37 +02:00
commit 8bf8e45dc0
2 changed files with 22 additions and 5 deletions

View file

@ -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?;
match timeout(Duration::from_secs(5 * 60), async {
if let Err(e) = demo.save(&self.client, file).await {
let _ = self.store.remove(name);
return Err(e.into());
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)?;

View file

@ -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]