From fb869dabb179f89d468c52e596386971ffd331e9 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 27 Mar 2022 16:59:44 +0200 Subject: [PATCH] Add job for checking the integrity Signed-off-by: trivernis --- .../mediarepo-socket/src/namespaces/jobs.rs | 38 +++++++++++++------ .../src/jobs/check_integrity.rs | 32 ++++++++++++++++ .../mediarepo-worker/src/jobs/mod.rs | 2 + mediarepo-daemon/mediarepo-worker/src/lib.rs | 8 +++- 4 files changed, 67 insertions(+), 13 deletions(-) create mode 100644 mediarepo-daemon/mediarepo-worker/src/jobs/check_integrity.rs diff --git a/mediarepo-daemon/mediarepo-socket/src/namespaces/jobs.rs b/mediarepo-daemon/mediarepo-socket/src/namespaces/jobs.rs index 273dd11..5025786 100644 --- a/mediarepo-daemon/mediarepo-socket/src/namespaces/jobs.rs +++ b/mediarepo-daemon/mediarepo-socket/src/namespaces/jobs.rs @@ -4,7 +4,10 @@ use mediarepo_core::error::RepoResult; use mediarepo_core::mediarepo_api::types::jobs::{JobType, RunJobRequest}; use mediarepo_core::type_keys::{RepoPathKey, SettingsKey, SizeMetadataKey}; use mediarepo_logic::dao::DaoProvider; -use mediarepo_worker::jobs::{CalculateSizesJob, GenerateMissingThumbsJob, VacuumJob}; +use mediarepo_worker::job_dispatcher::JobDispatcher; +use mediarepo_worker::jobs::{ + CalculateSizesJob, CheckIntegrityJob, GenerateMissingThumbsJob, Job, VacuumJob, +}; use crate::utils::{get_job_dispatcher_from_context, get_repo_from_context}; @@ -37,20 +40,19 @@ impl JobsNamespace { match run_request.job_type { JobType::MigrateContentDescriptors => job_dao.migrate_content_descriptors().await?, JobType::CalculateSizes => calculate_all_sizes(ctx).await?, - JobType::CheckIntegrity => job_dao.check_integrity().await?, + JobType::CheckIntegrity => { + dispatch_job(&dispatcher, CheckIntegrityJob::default(), run_request.sync).await? + } JobType::Vacuum => { - let mut handle = dispatcher.dispatch(VacuumJob::default()).await; - if run_request.sync { - handle.try_result().await?; - } + dispatch_job(&dispatcher, VacuumJob::default(), run_request.sync).await? } JobType::GenerateThumbnails => { - let mut handle = dispatcher - .dispatch(GenerateMissingThumbsJob::default()) - .await; - if run_request.sync { - handle.try_result().await?; - } + dispatch_job( + &dispatcher, + GenerateMissingThumbsJob::default(), + run_request.sync, + ) + .await? } } @@ -58,6 +60,18 @@ impl JobsNamespace { } } +async fn dispatch_job( + dispatcher: &JobDispatcher, + job: J, + sync: bool, +) -> RepoResult<()> { + let mut handle = dispatcher.dispatch(job).await; + if sync { + handle.try_result().await?; + } + Ok(()) +} + async fn calculate_all_sizes(ctx: &Context) -> RepoResult<()> { let (repo_path, settings) = { let data = ctx.data.read().await; diff --git a/mediarepo-daemon/mediarepo-worker/src/jobs/check_integrity.rs b/mediarepo-daemon/mediarepo-worker/src/jobs/check_integrity.rs new file mode 100644 index 0000000..8ef6d65 --- /dev/null +++ b/mediarepo-daemon/mediarepo-worker/src/jobs/check_integrity.rs @@ -0,0 +1,32 @@ +use crate::jobs::Job; +use crate::status_utils::SimpleProgress; +use async_trait::async_trait; +use mediarepo_core::error::RepoResult; +use mediarepo_logic::dao::repo::Repo; +use mediarepo_logic::dao::DaoProvider; +use std::sync::Arc; +use tokio::sync::RwLock; + +#[derive(Clone, Default)] +pub struct CheckIntegrityJob { + progress: Arc>, +} + +#[async_trait] +impl Job for CheckIntegrityJob { + type JobStatus = SimpleProgress; + type Result = (); + + fn status(&self) -> Arc> { + self.progress.clone() + } + + async fn run(&self, repo: Arc) -> RepoResult { + repo.job().check_integrity().await?; + { + let mut progress = self.progress.write().await; + progress.set_total(100); + } + Ok(()) + } +} diff --git a/mediarepo-daemon/mediarepo-worker/src/jobs/mod.rs b/mediarepo-daemon/mediarepo-worker/src/jobs/mod.rs index b56b4ed..f2d652f 100644 --- a/mediarepo-daemon/mediarepo-worker/src/jobs/mod.rs +++ b/mediarepo-daemon/mediarepo-worker/src/jobs/mod.rs @@ -1,8 +1,10 @@ mod calculate_sizes; +mod check_integrity; mod generate_missing_thumbnails; mod vacuum; pub use calculate_sizes::*; +pub use check_integrity::*; pub use generate_missing_thumbnails::*; use std::marker::PhantomData; use std::sync::Arc; diff --git a/mediarepo-daemon/mediarepo-worker/src/lib.rs b/mediarepo-daemon/mediarepo-worker/src/lib.rs index 1d6dde8..9dd35d8 100644 --- a/mediarepo-daemon/mediarepo-worker/src/lib.rs +++ b/mediarepo-daemon/mediarepo-worker/src/lib.rs @@ -1,5 +1,5 @@ use crate::job_dispatcher::JobDispatcher; -use crate::jobs::VacuumJob; +use crate::jobs::{CheckIntegrityJob, VacuumJob}; use mediarepo_core::error::RepoError; use mediarepo_core::tokio_graceful_shutdown::Toplevel; use mediarepo_logic::dao::repo::Repo; @@ -21,6 +21,12 @@ pub async fn start(top_level: Toplevel, repo: Repo) -> (Toplevel, JobDispatcher) dispatcher .dispatch_periodically(VacuumJob::default(), Duration::from_secs(60 * 30)) .await; + dispatcher + .dispatch_periodically( + CheckIntegrityJob::default(), + Duration::from_secs(60 * 60 * 24), + ) + .await; Ok(()) });