fedimovies/src/job_queue/scheduler.rs

98 lines
3.4 KiB
Rust
Raw Normal View History

use std::collections::HashMap;
2021-04-09 00:22:17 +00:00
use std::time::Duration;
use chrono::{DateTime, Utc};
2023-04-25 13:49:35 +00:00
use fedimovies_config::Config;
use fedimovies_models::database::DbPool;
use super::periodic_tasks::*;
2021-04-09 00:22:17 +00:00
#[derive(Debug, Eq, Hash, PartialEq)]
2023-02-05 09:29:46 +00:00
enum PeriodicTask {
2022-08-28 12:01:26 +00:00
SubscriptionExpirationMonitor,
2023-02-05 09:29:46 +00:00
IncomingActivityQueueExecutor,
OutgoingActivityQueueExecutor,
DeleteExtraneousPosts,
DeleteEmptyProfiles,
2023-03-25 10:58:33 +00:00
PruneRemoteEmojis,
2023-04-25 11:19:04 +00:00
HandleMoviesMentions,
}
2023-02-05 09:29:46 +00:00
impl PeriodicTask {
/// Returns task period (in seconds)
fn period(&self) -> i64 {
match self {
2022-08-28 12:01:26 +00:00
Self::SubscriptionExpirationMonitor => 300,
2023-02-05 09:29:46 +00:00
Self::IncomingActivityQueueExecutor => 5,
Self::OutgoingActivityQueueExecutor => 5,
Self::DeleteExtraneousPosts => 3600,
Self::DeleteEmptyProfiles => 3600,
2023-03-25 10:58:33 +00:00
Self::PruneRemoteEmojis => 3600,
2023-04-25 11:19:04 +00:00
Self::HandleMoviesMentions => 5,
}
}
2023-02-05 09:29:46 +00:00
fn is_ready(&self, last_run: &Option<DateTime<Utc>>) -> bool {
match last_run {
Some(last_run) => {
let time_passed = Utc::now() - *last_run;
time_passed.num_seconds() >= self.period()
2023-04-24 15:35:32 +00:00
}
2023-02-05 09:29:46 +00:00
None => true,
}
}
}
2023-04-24 15:35:32 +00:00
pub fn run(config: Config, db_pool: DbPool) -> () {
tokio::spawn(async move {
2022-12-15 17:43:30 +00:00
let mut scheduler_state = HashMap::from([
2023-02-05 09:29:46 +00:00
(PeriodicTask::SubscriptionExpirationMonitor, None),
(PeriodicTask::IncomingActivityQueueExecutor, None),
(PeriodicTask::OutgoingActivityQueueExecutor, None),
2023-03-25 10:58:33 +00:00
(PeriodicTask::PruneRemoteEmojis, None),
2023-04-25 11:19:04 +00:00
(PeriodicTask::HandleMoviesMentions, None),
2022-12-15 17:43:30 +00:00
]);
if config.retention.extraneous_posts.is_some() {
scheduler_state.insert(PeriodicTask::DeleteExtraneousPosts, None);
};
if config.retention.empty_profiles.is_some() {
scheduler_state.insert(PeriodicTask::DeleteEmptyProfiles, None);
};
let mut interval = tokio::time::interval(Duration::from_secs(5));
2021-04-09 00:22:17 +00:00
loop {
interval.tick().await;
for (task, last_run) in scheduler_state.iter_mut() {
2023-02-05 09:29:46 +00:00
if !task.is_ready(last_run) {
continue;
};
let task_result = match task {
2023-02-05 09:29:46 +00:00
PeriodicTask::IncomingActivityQueueExecutor => {
incoming_activity_queue_executor(&config, &db_pool).await
2023-04-24 15:35:32 +00:00
}
2023-02-05 09:29:46 +00:00
PeriodicTask::OutgoingActivityQueueExecutor => {
outgoing_activity_queue_executor(&config, &db_pool).await
2023-04-24 15:35:32 +00:00
}
PeriodicTask::DeleteExtraneousPosts => {
delete_extraneous_posts(&config, &db_pool).await
2023-04-24 15:35:32 +00:00
}
PeriodicTask::DeleteEmptyProfiles => {
delete_empty_profiles(&config, &db_pool).await
2023-04-24 15:35:32 +00:00
}
PeriodicTask::PruneRemoteEmojis => prune_remote_emojis(&config, &db_pool).await,
2023-04-08 19:20:12 +00:00
PeriodicTask::SubscriptionExpirationMonitor => Ok(()),
2023-04-26 10:55:42 +00:00
PeriodicTask::HandleMoviesMentions => {
handle_movies_mentions(&config, &db_pool).await
}
};
task_result.unwrap_or_else(|err| {
log::error!("{:?}: {}", task, err);
});
*last_run = Some(Utc::now());
2023-04-24 15:35:32 +00:00
}
}
2021-04-09 00:22:17 +00:00
});
}