use std::time::Duration;
use tracing::{info, warn};
pub fn notify_ready() {
if let Err(e) = sd_notify::notify(false, &[sd_notify::NotifyState::Ready]) {
warn!("sd-notify ready signal failed: {}", e);
}
}
pub fn spawn_watchdog() {
let Some(interval) = watchdog_interval() else {
return;
};
info!("Watchdog enabled; sending heartbeats every {:?}", interval);
tokio::spawn(async move {
let mut ticker = tokio::time::interval(interval);
loop {
ticker.tick().await;
if let Err(e) =
sd_notify::notify(false, &[sd_notify::NotifyState::Watchdog])
{
warn!("sd-notify watchdog heartbeat failed: {}", e);
}
}
});
}
fn watchdog_interval() -> Option<Duration> {
let mut usec = 0u64;
sd_notify::watchdog_enabled(false, &mut usec)
.then(|| Duration::from_micros(usec / 2))
}