diff --git a/src/api2/admin/sync.rs b/src/api2/admin/sync.rs index ff1e5ebf..bea52a0a 100644 --- a/src/api2/admin/sync.rs +++ b/src/api2/admin/sync.rs @@ -57,7 +57,8 @@ pub fn list_sync_jobs( job.next_run = (|| -> Option { let schedule = job.schedule.as_ref()?; let event = parse_calendar_event(&schedule).ok()?; - compute_next_event(&event, last, false).ok() + // ignore errors + compute_next_event(&event, last, false).unwrap_or_else(|_| None) })(); } diff --git a/src/bin/proxmox-backup-proxy.rs b/src/bin/proxmox-backup-proxy.rs index dd081dfe..2b43c5ac 100644 --- a/src/bin/proxmox-backup-proxy.rs +++ b/src/bin/proxmox-backup-proxy.rs @@ -301,7 +301,8 @@ async fn schedule_datastore_garbage_collection() { }; let next = match compute_next_event(&event, last, false) { - Ok(next) => next, + Ok(Some(next)) => next, + Ok(None) => continue, Err(err) => { eprintln!("compute_next_event for '{}' failed - {}", event_str, err); continue; @@ -412,7 +413,8 @@ async fn schedule_datastore_prune() { }; let next = match compute_next_event(&event, last, false) { - Ok(next) => next, + Ok(Some(next)) => next, + Ok(None) => continue, Err(err) => { eprintln!("compute_next_event for '{}' failed - {}", event_str, err); continue; @@ -520,7 +522,8 @@ async fn schedule_datastore_sync_jobs() { }; let next = match compute_next_event(&event, last, false) { - Ok(next) => next, + Ok(Some(next)) => next, + Ok(None) => continue, Err(err) => { eprintln!("compute_next_event for '{}' failed - {}", event_str, err); continue; diff --git a/src/tools/systemd/time.rs b/src/tools/systemd/time.rs index 8bb2a8f7..2e99e289 100644 --- a/src/tools/systemd/time.rs +++ b/src/tools/systemd/time.rs @@ -1,4 +1,4 @@ -use anyhow::{bail, Error}; +use anyhow::Error; use bitflags::bitflags; pub use super::parse_time::*; @@ -155,7 +155,7 @@ pub fn compute_next_event( event: &CalendarEvent, last: i64, utc: bool, -) -> Result { +) -> Result, Error> { let last = last + 1; // at least one second later @@ -166,8 +166,9 @@ pub fn compute_next_event( let mut count = 0; loop { - if count > 1000 { // should not happen - bail!("unable to compute next calendar event"); + // cancel after 1000 loops + if count > 1000 { + return Ok(None); } else { count += 1; } @@ -235,13 +236,15 @@ pub fn compute_next_event( } let next = t.into_epoch()?; - return Ok(next) + return Ok(Some(next)) } } #[cfg(test)] mod test { + use anyhow::bail; + use super::*; use proxmox::tools::time::*; @@ -268,7 +271,7 @@ mod test { }; match compute_next_event(&event, last, true) { - Ok(next) => { + Ok(Some(next)) => { if next == expect { println!("next {:?} => {}", event, next); } else { @@ -276,6 +279,7 @@ mod test { event, gmtime(next), gmtime(expect)); } } + Ok(None) => bail!("next {:?} failed to find a timestamp", event), Err(err) => bail!("compute next for '{}' failed - {}", v, err), }