use std::sync::Arc;
use chrono::Utc;
use tokio::task::JoinHandle;
use torrust_tracker_configuration::Core;
use tracing::instrument;
use crate::core;
#[must_use]
#[instrument(skip(config, tracker))]
pub fn start_job(config: &Core, tracker: &Arc<core::Tracker>) -> JoinHandle<()> {
let weak_tracker = std::sync::Arc::downgrade(tracker);
let interval = config.inactive_peer_cleanup_interval;
tokio::spawn(async move {
let interval = std::time::Duration::from_secs(interval);
let mut interval = tokio::time::interval(interval);
interval.tick().await;
loop {
tokio::select! {
_ = tokio::signal::ctrl_c() => {
tracing::info!("Stopping torrent cleanup job..");
break;
}
_ = interval.tick() => {
if let Some(tracker) = weak_tracker.upgrade() {
let start_time = Utc::now().time();
tracing::info!("Cleaning up torrents..");
tracker.cleanup_torrents();
tracing::info!("Cleaned up torrents in: {}ms", (Utc::now().time() - start_time).num_milliseconds());
} else {
break;
}
}
}
}
})
}