Repository navigation
Closed
Labels
A-clientArea: client.Area: client.C-bugCategory: bug. Something is wrong. This is bad!Category: bug. Something is wrong. This is bad!E-mediumEffort: medium. Some knowledge of how hyper internal works would be useful.Effort: medium. Some knowledge of how hyper internal works would be useful.E-pr-welcomeEffort: a pull request is welcome.Effort: a pull request is welcome.K-hyper-utilCrate: hyper-utilCrate: hyper-util
Description
Version
hyper-util 0.1.17, hyper 1.6.0
Platform
Linux 6.19.10 x86_64
Summary
I noticed that Deno's event loop continued spinning every pool idle timeout even after all connections were closed (see: denoland/deno#29444). I've tracked this down to hyper-util and have a proof of concept fix to cancel the IdleTask when the pool is empty here: hyperium/hyper-util#292.
(Sorry, I did not find the contribution guidelines until after filing the draft PR.)
Code Sample
$ DENO_LOG=hyper_util::client=trace deno run --allow-net 'data:,const client = Deno.createHttpClient({ poolIdleTimeout: 100 }); const res = await fetch("http:127.0.0.1:8000/", { client }); await res.bytes(); await new Promise(resolve=>setTimeout(resolve, 2000));'
TRACE RS - hyper_util::client::legacy::pool:679 - checkout waiting for idle connection: ("http", 127.0.0.1:8000)
TRACE RS - hyper_util::client::legacy::connect::http:482 - Http::connect; scheme=Some("http"), host=Some("127.0.0.1"), port=Some(Port(8000))
DEBUG RS - hyper_util::client::legacy::connect::http:768 - connecting to 127.0.0.1:8000
DEBUG RS - hyper_util::client::legacy::connect::http:771 - connected to 127.0.0.1:8000
TRACE RS - hyper_util::client::legacy::client:575 - http1 handshake complete, spawning background dispatcher task
TRACE RS - hyper_util::client::legacy::client:600 - waiting for connection to be ready
TRACE RS - hyper_util::client::legacy::client:610 - connection is ready
TRACE RS - hyper_util::client::legacy::pool:721 - checkout dropped for ("http", 127.0.0.1:8000)
TRACE RS - hyper_util::client::legacy::pool:348 - put; add idle connection for ("http", 127.0.0.1:8000)
DEBUG RS - hyper_util::client::legacy::pool:395 - pooling idle connection for ("http", 127.0.0.1:8000)
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:492 - idle interval evicting expired for ("http", 127.0.0.1:8000)
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:799 - idle interval checking for expired
TRACE RS - hyper_util::client::legacy::pool:810 - pool closed, canceling idle interval
Expected Behavior
When the client connection pool is empty the IdleTask should not wake the event loop.
Actual Behavior
IdleTask wakes the every pool_idle_timeout ms even when empty.
Additional Context
No response
Metadata
Metadata
Assignees
Labels
A-clientArea: client.Area: client.C-bugCategory: bug. Something is wrong. This is bad!Category: bug. Something is wrong. This is bad!E-mediumEffort: medium. Some knowledge of how hyper internal works would be useful.Effort: medium. Some knowledge of how hyper internal works would be useful.E-pr-welcomeEffort: a pull request is welcome.Effort: a pull request is welcome.K-hyper-utilCrate: hyper-utilCrate: hyper-util
Activity
Catwoman08 commentedon Aug 17, 2026
Thank you for your report. This looks like something we should fix.
Catwoman08 commentedon Aug 31, 2026
hyperium/hyper-util#292 fixes this issue.