fedimovies/src/job_queue/scheduler.rs

97 lines
3.2 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};
use mitra_config::Config;
use mitra_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-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-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()
},
None => true,
}
}
}
2022-06-14 10:29:14 +00:00
pub fn run(
config: Config,
2022-12-03 21:23:52 +00:00
db_pool: DbPool,
2022-06-14 10:29:14 +00:00
) -> () {
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),
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-02-05 09:29:46 +00:00
PeriodicTask::OutgoingActivityQueueExecutor => {
outgoing_activity_queue_executor(&config, &db_pool).await
2022-12-11 18:41:08 +00:00
},
PeriodicTask::DeleteExtraneousPosts => {
delete_extraneous_posts(&config, &db_pool).await
},
PeriodicTask::DeleteEmptyProfiles => {
delete_empty_profiles(&config, &db_pool).await
},
2023-03-25 10:58:33 +00:00
PeriodicTask::PruneRemoteEmojis => {
prune_remote_emojis(&config, &db_pool).await
},
2023-04-08 19:20:12 +00:00
PeriodicTask::SubscriptionExpirationMonitor => Ok(()),
};
task_result.unwrap_or_else(|err| {
log::error!("{:?}: {}", task, err);
});
*last_run = Some(Utc::now());
};
2022-08-28 12:01:26 +00:00
};
2021-04-09 00:22:17 +00:00
});
}