From b75bdb2bf8caf5e9dfbb6dc23578952635e9ae0d Mon Sep 17 00:00:00 2001 From: Eric Rodrigues Pires Date: Fri, 12 Jun 2026 07:22:22 -0300 Subject: [PATCH] Fix dropped handlers not being removed from HTTP pools --- CHANGELOG.md | 4 ++++ src/http/http11.rs | 8 ++++---- src/http/http2.rs | 8 ++++---- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ae8639..be2eb8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ - Add `--channel-open-timeout` CLI flag. +### Fixed + +- Fix dropped handlers not being removed from HTTP pools. + ## 0.10.0 (2026-06-09) ### Added diff --git a/src/http/http11.rs b/src/http/http11.rs index d52d1bc..4facedf 100644 --- a/src/http/http11.rs +++ b/src/http/http11.rs @@ -228,12 +228,12 @@ where // Return pool item if connection is ready and not expired Ok(pooled) if pooled.connection.is_ready() && !pooled.is_expired(guard.max_idle_time, guard.max_reuse) => { - let mut pooled = deadpool::unmanaged::Object::take(pooled); + let mut pooled = deadpool::unmanaged::Object::take(pooled); pooled.touch(); break (pooled.connection, pooled.log_sender, guard) }, - // Connection is closed or expired; discard pool item - Ok(_) => { + Ok(expired) => { + let _ = deadpool::unmanaged::Object::take(expired); recv = guard.pool.get(); continue; }, @@ -262,10 +262,10 @@ where let guard = proxy_data.get_http11_pool_guard(key.clone()); match guard.pool.try_get() { Ok(pooled) => { + let mut pooled = deadpool::unmanaged::Object::take(pooled); if pooled.connection.is_ready() && !pooled.is_expired(guard.max_idle_time, guard.max_reuse) { - let mut pooled = deadpool::unmanaged::Object::take(pooled); pooled.touch(); break 'sender (pooled.connection, pooled.log_sender, guard); } diff --git a/src/http/http2.rs b/src/http/http2.rs index 325fe5d..c981b04 100644 --- a/src/http/http2.rs +++ b/src/http/http2.rs @@ -68,12 +68,12 @@ where // Return pool item if connection is ready and not expired Ok(pooled) if pooled.connection.is_ready() && !pooled.is_expired(guard.max_idle_time, guard.max_reuse) => { - let mut pooled = deadpool::unmanaged::Object::take(pooled); + let mut pooled = deadpool::unmanaged::Object::take(pooled); pooled.touch(); break (pooled.connection, pooled.log_sender, guard) }, - // Connection is closed or expired; discard pool item - Ok(_) => { + Ok(expired) => { + let _ = deadpool::unmanaged::Object::take(expired); recv = guard.pool.get(); continue; }, @@ -103,10 +103,10 @@ where let guard = proxy_data.get_http2_pool_guard(key.clone()); match guard.pool.try_get() { Ok(pooled) => { + let mut pooled = deadpool::unmanaged::Object::take(pooled); if pooled.connection.is_ready() && !pooled.is_expired(guard.max_idle_time, guard.max_reuse) { - let mut pooled = deadpool::unmanaged::Object::take(pooled); pooled.touch(); break 'sender (pooled.connection, pooled.log_sender, guard); } -- 2.51.2