torrust-tracker 3.0.0-alpha.1

A feature rich BitTorrent tracker.
Documentation
use std::sync::Arc;

use chrono::Utc;
use log::info;
use tokio::task::JoinHandle;
use torrust_tracker_configuration::Configuration;

use crate::tracker;

#[must_use]
pub fn start_job(config: &Arc<Configuration>, tracker: &Arc<tracker::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() => {
                    info!("Stopping torrent cleanup job..");
                    break;
                }
                _ = interval.tick() => {
                    if let Some(tracker) = weak_tracker.upgrade() {
                        let start_time = Utc::now().time();
                        info!("Cleaning up torrents..");
                        tracker.cleanup_torrents().await;
                        info!("Cleaned up torrents in: {}ms", (Utc::now().time() - start_time).num_milliseconds());
                    } else {
                        break;
                    }
                }
            }
        }
    })
}