From f776e34e89d78f85d9ea8b212bcabf00d06c93a2 Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Wed, 28 Jan 2026 18:47:41 -0800 Subject: [PATCH] StrictConnPool: Fix FIFO implementation --- .../apache/hc/core5/pool/StrictConnPool.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java index 0bc0c1b6dc..f5c3e4285b 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/StrictConnPool.java @@ -157,7 +157,7 @@ public void close() { } private PerRoutePool getPool(final T route) { - return this.routeToPool.computeIfAbsent(route, r -> new PerRoutePool<>(route, this.disposalCallback)); + return this.routeToPool.computeIfAbsent(route, r -> new PerRoutePool<>(route, this.disposalCallback, this.policy)); } @Override @@ -755,11 +755,13 @@ static class PerRoutePool { private final Set> leased; private final LinkedList> available; private final DisposalCallback disposalCallback; + private final PoolReusePolicy policy; - PerRoutePool(final T route, final DisposalCallback disposalCallback) { + PerRoutePool(final T route, final DisposalCallback disposalCallback, final PoolReusePolicy policy) { super(); this.route = route; this.disposalCallback = disposalCallback; + this.policy = policy; this.leased = new HashSet<>(); this.available = new LinkedList<>(); } @@ -818,7 +820,16 @@ public void free(final PoolEntry entry, final boolean reusable) { final boolean found = this.leased.remove(entry); Asserts.check(found, "Entry %s has not been leased from this pool", entry); if (reusable) { - this.available.addFirst(entry); + switch (this.policy) { + case LIFO: + this.available.addFirst(entry); + break; + case FIFO: + this.available.addLast(entry); + break; + default: + throw new IllegalStateException("Unexpected ConnPoolPolicy value: " + policy); + } } }