diff --git a/compute_tools/src/compute.rs b/compute_tools/src/compute.rs index b494c92722..1a8050e5ef 100644 --- a/compute_tools/src/compute.rs +++ b/compute_tools/src/compute.rs @@ -11,6 +11,7 @@ use std::sync::atomic::Ordering; use std::sync::{Condvar, Mutex, RwLock}; use std::thread; use std::time; +use std::time::Duration; use std::time::Instant; use std::time::SystemTime; @@ -1425,14 +1426,18 @@ fn lsn_lease_loop(configs: Vec, cmd: String) { loop { match lsn_lease_request(&configs, &cmd) { Ok(valid_until) => { - let now = SystemTime::now() + let valid_until_duration = Duration::from_millis(valid_until as u64); + + let sleep_duration = SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) - .expect("Time went backwards") - .as_millis(); + .unwrap_or(Duration::ZERO) + .checked_sub(valid_until_duration) + .unwrap_or(Duration::ZERO) + .checked_sub(Duration::from_secs(60)) + .unwrap_or(Duration::ZERO); - let sleep_duration_millis = valid_until - now - 60_000; - - let sleep_duration = time::Duration::from_millis(sleep_duration_millis as u64); + // Ensure the sleep duration is at least 60 seconds to avoid busy loops + let sleep_duration = std::cmp::max(sleep_duration, Duration::from_secs(60)); info!( "lsn_lease_request succeeded, sleeping for {} seconds", @@ -1455,7 +1460,7 @@ fn lsn_lease_request(configs: &[postgres::Config], cmd: &str) -> Result { .map(|config| { let mut client = config.connect(NoTls)?; let res = client.simple_query(cmd)?; - let msg = match res.get(0) { + let msg = match res.first() { Some(msg) => msg, None => bail!("empty response"), };