diff --git a/core/archipelago/src/crash_recovery.rs b/core/archipelago/src/crash_recovery.rs index a659c97b..35ed2d0c 100644 --- a/core/archipelago/src/crash_recovery.rs +++ b/core/archipelago/src/crash_recovery.rs @@ -445,6 +445,7 @@ pub fn spawn_snapshot_task(data_dir: PathBuf) { tokio::time::sleep(std::time::Duration::from_secs(120)).await; let mut interval = tokio::time::interval(std::time::Duration::from_secs(120)); + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); loop { interval.tick().await; if let Err(e) = save_container_snapshot(&data_dir).await { diff --git a/core/archipelago/src/health_monitor.rs b/core/archipelago/src/health_monitor.rs index e8bd4a2a..6ffc3a3f 100644 --- a/core/archipelago/src/health_monitor.rs +++ b/core/archipelago/src/health_monitor.rs @@ -487,6 +487,8 @@ pub fn spawn_health_monitor(state: Arc, data_dir: PathBuf) { let mut mem_tracker = MemoryTracker::new(); let mut mem_check_counter: u32 = 0; let mut interval = tokio::time::interval(std::time::Duration::from_secs(CHECK_INTERVAL_SECS)); + // Skip missed ticks — prevents burst of health checks after slow podman response + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); // Load persistent restart history and seed the in-memory tracker let mut restart_history = RestartHistory::load(&data_dir).await; diff --git a/core/archipelago/src/monitoring/mod.rs b/core/archipelago/src/monitoring/mod.rs index 703f2023..2f309ad2 100644 --- a/core/archipelago/src/monitoring/mod.rs +++ b/core/archipelago/src/monitoring/mod.rs @@ -29,6 +29,7 @@ pub fn spawn_metrics_collector( tokio::time::sleep(std::time::Duration::from_secs(60)).await; let mut interval = tokio::time::interval(std::time::Duration::from_secs(300)); + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); loop { interval.tick().await; diff --git a/core/archipelago/src/server.rs b/core/archipelago/src/server.rs index 9e561416..58542baf 100644 --- a/core/archipelago/src/server.rs +++ b/core/archipelago/src/server.rs @@ -277,9 +277,12 @@ impl Server { error!("Failed to scan containers: {}", e); } - // Periodic scan every 30 seconds (only broadcasts if state changed) + // Periodic scan every 60 seconds (only broadcasts if state changed) // Uses an in-flight guard to skip scans when a previous one is still running - let mut interval = tokio::time::interval(Duration::from_secs(30)); + let mut interval = tokio::time::interval(Duration::from_secs(60)); + // Skip missed ticks instead of catching up — prevents burst of scans + // after a slow podman response (which causes DB lock storms) + interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); let scanning = std::sync::Arc::new(std::sync::atomic::AtomicBool::new(false)); loop { interval.tick().await;