From 0cdd9b7fc215bcf99b3d5dd92dcdc2d60a204110 Mon Sep 17 00:00:00 2001 From: Oleg Kalnichevski Date: Mon, 27 Oct 2008 13:27:39 +0000 Subject: [PATCH] Fixed bug that can cause a managed connection to be returned from the pool in an inconsistent state git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk@708170 13f79535-47bb-0310-9956-ffa450edef68 --- RELEASE_NOTES.txt | 8 ++++++++ .../java/org/apache/http/impl/conn/AbstractPoolEntry.java | 1 + .../org/apache/http/impl/conn/tsccm/BasicPoolEntry.java | 4 ++++ .../apache/http/impl/conn/tsccm/RouteSpecificPool.java | 8 ++++---- 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index 2637071b5..3bb636426 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,3 +1,11 @@ +Changes since 4.0 beta 1 +------------------- + +* Fixed bug that can cause a managed connection to be returned from the + pool in an inconsistent state. + Contributed by Oleg Kalnichevski + + 4.0 Beta 1 ------------------- diff --git a/module-client/src/main/java/org/apache/http/impl/conn/AbstractPoolEntry.java b/module-client/src/main/java/org/apache/http/impl/conn/AbstractPoolEntry.java index 8459a0351..9f23820f8 100644 --- a/module-client/src/main/java/org/apache/http/impl/conn/AbstractPoolEntry.java +++ b/module-client/src/main/java/org/apache/http/impl/conn/AbstractPoolEntry.java @@ -315,6 +315,7 @@ public void layerProtocol(HttpContext context, HttpParams params) */ protected void shutdownEntry() { tracker = null; + state = null; } diff --git a/module-client/src/main/java/org/apache/http/impl/conn/tsccm/BasicPoolEntry.java b/module-client/src/main/java/org/apache/http/impl/conn/tsccm/BasicPoolEntry.java index fff0bb4c5..09b6c54bd 100644 --- a/module-client/src/main/java/org/apache/http/impl/conn/tsccm/BasicPoolEntry.java +++ b/module-client/src/main/java/org/apache/http/impl/conn/tsccm/BasicPoolEntry.java @@ -82,6 +82,10 @@ protected final BasicPoolEntryRef getWeakRef() { return this.reference; } + @Override + protected void shutdownEntry() { + super.shutdownEntry(); + } } // class BasicPoolEntry diff --git a/module-client/src/main/java/org/apache/http/impl/conn/tsccm/RouteSpecificPool.java b/module-client/src/main/java/org/apache/http/impl/conn/tsccm/RouteSpecificPool.java index 0cc6c61c5..9ff4d8ffd 100644 --- a/module-client/src/main/java/org/apache/http/impl/conn/tsccm/RouteSpecificPool.java +++ b/module-client/src/main/java/org/apache/http/impl/conn/tsccm/RouteSpecificPool.java @@ -151,15 +151,15 @@ public BasicPoolEntry allocEntry(final Object state) { ListIterator it = freeEntries.listIterator(freeEntries.size()); while (it.hasPrevious()) { BasicPoolEntry entry = it.previous(); - if (LangUtils.equals(state, entry.getState())) { + if (entry.getState() == null || LangUtils.equals(state, entry.getState())) { it.remove(); return entry; } } } - if (!freeEntries.isEmpty()) { - BasicPoolEntry entry = freeEntries.remove(); - entry.setState(null); + if (getCapacity() == 0 && !freeEntries.isEmpty()) { + BasicPoolEntry entry = freeEntries.remove(); + entry.shutdownEntry(); OperatedClientConnection conn = entry.getConnection(); try { conn.close();