From b6f8e3cbade24ed06b8d577439991e54a25f8aee Mon Sep 17 00:00:00 2001 From: Laurence Rowe Date: Wed, 19 Aug 2026 09:33:08 -0700 Subject: [PATCH] fix(client): cancel idle interval when pool empties --- src/client/legacy/pool.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/client/legacy/pool.rs b/src/client/legacy/pool.rs index e0d6f2ff..41f11a65 100644 --- a/src/client/legacy/pool.rs +++ b/src/client/legacy/pool.rs @@ -798,6 +798,11 @@ impl IdleTask { if let Ok(mut inner) = inner.lock() { trace!("idle interval checking for expired"); inner.clear_expired(); + if inner.idle.is_empty() { + inner.idle_interval_ref = None; + trace!("pool empty, canceling idle interval"); + return; + } } } @@ -996,6 +1001,7 @@ mod tests { pool.locked().idle.get(&key).map(|entries| entries.len()), Some(3) ); + assert!(pool.locked().idle_interval_ref.is_some()); // Let the timer tick passed the expiration... tokio::time::sleep(Duration::from_millis(30)).await; @@ -1005,6 +1011,7 @@ mod tests { pool.locked().idle.get(&key).map(|entries| entries.len()), Some(3) ); + assert!(pool.locked().idle_interval_ref.is_some()); // Now wait passed the minimum interval more tokio::time::sleep(Duration::from_millis(70)).await; @@ -1012,6 +1019,11 @@ mod tests { tokio::task::yield_now().await; assert!(!pool.locked().idle.contains_key(&key)); + assert!(pool.locked().idle_interval_ref.is_none()); + + // Insert new key and check timer is recreated + pool.pooled(c(key.clone()), Uniq(7)); + assert!(pool.locked().idle_interval_ref.is_some()); } #[tokio::test]