From 942ccf1c40fabe018b0fb47be165ace572451b94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Sun, 20 Jun 2021 16:46:45 +0200 Subject: [PATCH] mark failed jobs with a specific state, prevent from lingering in ui --- src/filesystem.rs | 13 +++++++++++-- src/jobs.rs | 12 +++++++++++- ui/src/components/Jobs.vue | 2 +- ui/src/types/base.ts | 1 + 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/filesystem.rs b/src/filesystem.rs index ba192f5..10cc313 100644 --- a/src/filesystem.rs +++ b/src/filesystem.rs @@ -6,7 +6,7 @@ use crate::database::{ TYPE_INSTANCED_ATTR, TYPE_IS_ATTR, TYPE_REQUIRES_ATTR, }; use crate::hash::Hashable; -use crate::jobs::{Job, JobContainer, JobId}; +use crate::jobs::{Job, JobContainer, JobId, State}; use crate::models; use crate::models::File; use anyhow::{anyhow, Error, Result}; @@ -363,11 +363,20 @@ pub async fn rescan_vault( .add_job(Job::new("REIMPORT", "Reimporting vault...")) .unwrap(); + let job_container_rescan = job_container.clone(); let result = - actix_web::web::block(move || _rescan_vault(pool, directory, job_container, job_id)).await; + actix_web::web::block(move || _rescan_vault(pool, directory, job_container_rescan, job_id)) + .await; + if result.is_err() { let err = result.err().unwrap(); error!("Update did not succeed! {:?}", err); + + job_container + .write() + .unwrap() + .update_state(&job_id, State::Failed) + .unwrap(); } } diff --git a/src/jobs.rs b/src/jobs.rs index 5112a58..ad03790 100644 --- a/src/jobs.rs +++ b/src/jobs.rs @@ -27,6 +27,7 @@ pub type JobType = String; pub enum State { InProgress, Done, + Failed, } impl Default for State { @@ -40,7 +41,7 @@ pub struct JobContainer { jobs: HashMap, } -#[derive(Clone, Hash, PartialEq, Eq)] +#[derive(Clone, Hash, PartialEq, Eq, Copy)] pub struct JobId { uuid: Uuid, } @@ -82,4 +83,13 @@ impl JobContainer { Err(anyhow!("No such job.")) } } + + pub fn update_state(&mut self, id: &JobId, state: State) -> Result<()> { + if let Some(job) = self.jobs.get_mut(id) { + job.state = state; + Ok(()) + } else { + Err(anyhow!("No such job.")) + } + } } diff --git a/ui/src/components/Jobs.vue b/ui/src/components/Jobs.vue index e5f91a8..adf3e2c 100644 --- a/ui/src/components/Jobs.vue +++ b/ui/src/components/Jobs.vue @@ -27,7 +27,7 @@ export default defineComponent({ computed: { activeJobs(): JobWithId[] { return Object.entries(this.jobs) - .filter(([_, job]) => job.progress < 100) + .filter(([_, job]) => job.state == "InProgress") .map(([id, job]) => { return { id, ...job }; }); diff --git a/ui/src/types/base.ts b/ui/src/types/base.ts index e5bfc56..a030931 100644 --- a/ui/src/types/base.ts +++ b/ui/src/types/base.ts @@ -14,6 +14,7 @@ export interface ListingResult { export interface Job { title: string; progress: number; + state: "InProgress" | "Done" | "Failed", } export interface IFile {