2
0
Fork 0
mirror of https://git.asonix.dog/asonix/pict-rs synced 2024-12-25 12:01:24 +00:00

Fix dangling unprocessed uploads

Adds error boundary around backgrounded ingest
This commit is contained in:
asonix 2023-07-17 22:30:10 -05:00
parent 20daced620
commit b32e1cc6f6

View file

@ -1,6 +1,6 @@
use crate::{ use crate::{
config::ImageFormat, config::ImageFormat,
error::Error, error::{Error, UploadError},
ingest::Session, ingest::Session,
queue::{Base64Bytes, LocalBoxFuture, Process}, queue::{Base64Bytes, LocalBoxFuture, Process},
repo::{Alias, DeleteToken, FullRepo, UploadId, UploadResult}, repo::{Alias, DeleteToken, FullRepo, UploadId, UploadResult},
@ -75,24 +75,34 @@ async fn process_ingest<R, S>(
) -> Result<(), Error> ) -> Result<(), Error>
where where
R: FullRepo + 'static, R: FullRepo + 'static,
S: Store, S: Store + 'static,
{ {
let fut = async { let fut = async {
let unprocessed_identifier = S::Identifier::from_bytes(unprocessed_identifier)?; let unprocessed_identifier = S::Identifier::from_bytes(unprocessed_identifier)?;
let stream = store let ident = unprocessed_identifier.clone();
.to_stream(&unprocessed_identifier, None, None)
let store2 = store.clone();
let repo = repo.clone();
let error_boundary = actix_rt::spawn(async move {
let stream = store2
.to_stream(&ident, None, None)
.await? .await?
.map_err(Error::from); .map_err(Error::from);
let session = let session =
crate::ingest::ingest(repo, store, stream, declared_alias, should_validate).await?; crate::ingest::ingest(&repo, &store2, stream, declared_alias, should_validate)
.await?;
let token = session.delete_token().await?; let token = session.delete_token().await?;
Ok((session, token)) as Result<(Session<R, S>, DeleteToken), Error>
})
.await;
store.remove(&unprocessed_identifier).await?; store.remove(&unprocessed_identifier).await?;
Ok((session, token)) as Result<(Session<R, S>, DeleteToken), Error> error_boundary.map_err(|_| UploadError::Canceled)?
}; };
let result = match fut.await { let result = match fut.await {