From a27f12336d931f1965975da84e8f1e36f2213095 Mon Sep 17 00:00:00 2001 From: Wei Zhang Date: Thu, 16 Jan 2025 14:21:34 +0800 Subject: [PATCH] chore(job): change daily and hourly cron into standalone job Signed-off-by: Wei Zhang --- .../src/service/background_job/daily.rs | 32 ++++++++ .../src/service/background_job/hourly.rs | 73 +++++++++++++++++++ .../service/background_job/license_check.rs | 1 - .../src/service/background_job/mod.rs | 60 +++++++++------ 4 files changed, 141 insertions(+), 25 deletions(-) create mode 100644 ee/tabby-webserver/src/service/background_job/daily.rs create mode 100644 ee/tabby-webserver/src/service/background_job/hourly.rs diff --git a/ee/tabby-webserver/src/service/background_job/daily.rs b/ee/tabby-webserver/src/service/background_job/daily.rs new file mode 100644 index 000000000000..c2d162e2dec6 --- /dev/null +++ b/ee/tabby-webserver/src/service/background_job/daily.rs @@ -0,0 +1,32 @@ +use std::sync::Arc; + +use crate::service::background_job::LicenseCheckJob; +use chrono::Utc; +use serde::{Deserialize, Serialize}; +use tabby_schema::{license::LicenseService, notification::NotificationService}; + +use super::helper::Job; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct DailyJob; + +impl Job for DailyJob { + const NAME: &'static str = "daily"; +} + +impl DailyJob { + pub async fn run( + &self, + license_service: Arc, + notification_service: Arc, + ) -> tabby_schema::Result<()> { + let now = Utc::now(); + + if let Err(err) = + LicenseCheckJob::cron(now, license_service.clone(), notification_service.clone()).await + { + logkit::warn!("License check job failed: {err:?}"); + } + Ok(()) + } +} diff --git a/ee/tabby-webserver/src/service/background_job/hourly.rs b/ee/tabby-webserver/src/service/background_job/hourly.rs new file mode 100644 index 000000000000..fa0a8d39daca --- /dev/null +++ b/ee/tabby-webserver/src/service/background_job/hourly.rs @@ -0,0 +1,73 @@ +use std::sync::Arc; + +use crate::service::background_job::{ + db::DbMaintainanceJob, IndexGarbageCollection, SchedulerGitJob, SchedulerGithubGitlabJob, + SyncIntegrationJob, +}; +use chrono::Utc; +use serde::{Deserialize, Serialize}; +use tabby_db::DbConn; +use tabby_schema::{ + context::ContextService, + integration::IntegrationService, + job::JobService, + repository::{GitRepositoryService, RepositoryService, ThirdPartyRepositoryService}, +}; + +use super::helper::Job; + +#[derive(Debug, Serialize, Deserialize, Clone)] +pub struct HourlyJob; + +impl Job for HourlyJob { + const NAME: &'static str = "hourly"; +} + +impl HourlyJob { + pub async fn run( + &self, + db: DbConn, + context_service: Arc, + git_repository_service: Arc, + job_service: Arc, + integration_service: Arc, + third_party_repository_service: Arc, + repository_service: Arc, + ) -> tabby_schema::Result<()> { + let now = Utc::now(); + + if let Err(err) = DbMaintainanceJob::cron(now, context_service.clone(), db.clone()).await { + logkit::warn!("Database maintainance failed: {:?}", err); + } + + if let Err(err) = + SchedulerGitJob::cron(now, git_repository_service.clone(), job_service.clone()).await + { + logkit::warn!("Scheduler job failed: {:?}", err); + } + + if let Err(err) = + SyncIntegrationJob::cron(now, integration_service.clone(), job_service.clone()).await + { + logkit::warn!("Sync integration job failed: {:?}", err); + } + + if let Err(err) = SchedulerGithubGitlabJob::cron( + now, + third_party_repository_service.clone(), + job_service.clone(), + ) + .await + { + logkit::warn!("Index issues job failed: {err:?}"); + } + + if let Err(err) = IndexGarbageCollection + .run(repository_service.clone(), context_service.clone()) + .await + { + logkit::warn!("Index garbage collection job failed: {err:?}"); + } + Ok(()) + } +} diff --git a/ee/tabby-webserver/src/service/background_job/license_check.rs b/ee/tabby-webserver/src/service/background_job/license_check.rs index 3ce0fb91d9f2..2825a18ac211 100644 --- a/ee/tabby-webserver/src/service/background_job/license_check.rs +++ b/ee/tabby-webserver/src/service/background_job/license_check.rs @@ -3,7 +3,6 @@ use std::sync::Arc; use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use tabby_schema::{ - context::ContextService, license::{LicenseService, LicenseType}, notification::{NotificationRecipient, NotificationService}, }; diff --git a/ee/tabby-webserver/src/service/background_job/mod.rs b/ee/tabby-webserver/src/service/background_job/mod.rs index ce3075f7e6f1..e5b41d89881e 100644 --- a/ee/tabby-webserver/src/service/background_job/mod.rs +++ b/ee/tabby-webserver/src/service/background_job/mod.rs @@ -1,6 +1,8 @@ +mod daily; mod db; mod git; mod helper; +mod hourly; mod index_garbage_collection; mod license_check; mod third_party_integration; @@ -9,9 +11,11 @@ mod web_crawler; use std::{str::FromStr, sync::Arc}; use cron::Schedule; +use daily::DailyJob; use futures::StreamExt; use git::SchedulerGitJob; use helper::{CronStream, Job, JobLogger}; +use hourly::HourlyJob; use index_garbage_collection::IndexGarbageCollection; use juniper::ID; use license_check::LicenseCheckJob; @@ -31,7 +35,7 @@ use third_party_integration::SchedulerGithubGitlabJob; use tracing::{debug, warn}; pub use web_crawler::WebCrawlerJob; -use self::{db::DbMaintainanceJob, third_party_integration::SyncIntegrationJob}; +use self::third_party_integration::SyncIntegrationJob; #[derive(Debug, Serialize, Deserialize)] pub enum BackgroundJobEvent { @@ -40,6 +44,8 @@ pub enum BackgroundJobEvent { SyncThirdPartyRepositories(ID), WebCrawler(WebCrawlerJob), IndexGarbageCollection, + Hourly, + Daily, } impl BackgroundJobEvent { @@ -52,6 +58,8 @@ impl BackgroundJobEvent { BackgroundJobEvent::SyncThirdPartyRepositories(_) => SyncIntegrationJob::NAME, BackgroundJobEvent::WebCrawler(_) => WebCrawlerJob::NAME, BackgroundJobEvent::IndexGarbageCollection => IndexGarbageCollection::NAME, + BackgroundJobEvent::Hourly => HourlyJob::NAME, + BackgroundJobEvent::Daily => DailyJob::NAME, } } @@ -120,6 +128,25 @@ pub async fn start( let job = IndexGarbageCollection; job.run(repository_service.clone(), context_service.clone()).await } + BackgroundJobEvent::Hourly => { + let job = HourlyJob; + job.run( + db.clone(), + context_service.clone(), + git_repository_service.clone(), + job_service.clone(), + integration_service.clone(), + third_party_repository_service.clone(), + repository_service.clone(), + ).await + } + BackgroundJobEvent::Daily => { + let job = DailyJob; + job.run( + license_service.clone(), + notification_service.clone(), + ).await + } } { logkit::info!(exit_code = 1; "Job failed {}", err); } else { @@ -128,31 +155,16 @@ pub async fn start( logger.finalize().await; debug!("Background job {} completed", job.id); }, - Some(now) = hourly.next() => { - if let Err(err) = DbMaintainanceJob::cron(now, context_service.clone(), db.clone()).await { - warn!("Database maintainance failed: {:?}", err); - } - - if let Err(err) = SchedulerGitJob::cron(now, git_repository_service.clone(), job_service.clone()).await { - warn!("Scheduler job failed: {:?}", err); - } - - if let Err(err) = SyncIntegrationJob::cron(now, integration_service.clone(), job_service.clone()).await { - warn!("Sync integration job failed: {:?}", err); + Some(_) = hourly.next() => { + match job_service.trigger(BackgroundJobEvent::Hourly.to_command()).await { + Err(err) => warn!("Hourly background job failed {}", err), + Ok(id) => debug!("Hourly background job {} completed", id), } - - if let Err(err) = SchedulerGithubGitlabJob::cron(now, third_party_repository_service.clone(), job_service.clone()).await { - warn!("Index issues job failed: {err:?}"); - } - - if let Err(err) = IndexGarbageCollection.run(repository_service.clone(), context_service.clone()).await { - warn!("Index garbage collection job failed: {err:?}"); - } - }, - Some(now) = daily.next() => { - if let Err(err) = LicenseCheckJob::cron(now, license_service.clone(), notification_service.clone()).await { - warn!("License check job failed: {err:?}"); + Some(_) = daily.next() => { + match job_service.trigger(BackgroundJobEvent::Daily.to_command()).await { + Err(err) => warn!("Daily background job failed {}", err), + Ok(id) => debug!("Daily background job {} completed", id), } } else => {