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
This commit is contained in:
Oleg Kalnichevski 2008-10-27 13:27:39 +00:00
parent 9fd1aa6dc4
commit 0cdd9b7fc2
4 changed files with 17 additions and 4 deletions

View File

@ -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 <olegk at apache.org>
4.0 Beta 1 4.0 Beta 1
------------------- -------------------

View File

@ -315,6 +315,7 @@ public abstract class AbstractPoolEntry {
*/ */
protected void shutdownEntry() { protected void shutdownEntry() {
tracker = null; tracker = null;
state = null;
} }

View File

@ -82,6 +82,10 @@ public class BasicPoolEntry extends AbstractPoolEntry {
return this.reference; return this.reference;
} }
@Override
protected void shutdownEntry() {
super.shutdownEntry();
}
} // class BasicPoolEntry } // class BasicPoolEntry

View File

@ -151,15 +151,15 @@ public class RouteSpecificPool {
ListIterator<BasicPoolEntry> it = freeEntries.listIterator(freeEntries.size()); ListIterator<BasicPoolEntry> it = freeEntries.listIterator(freeEntries.size());
while (it.hasPrevious()) { while (it.hasPrevious()) {
BasicPoolEntry entry = it.previous(); BasicPoolEntry entry = it.previous();
if (LangUtils.equals(state, entry.getState())) { if (entry.getState() == null || LangUtils.equals(state, entry.getState())) {
it.remove(); it.remove();
return entry; return entry;
} }
} }
} }
if (!freeEntries.isEmpty()) { if (getCapacity() == 0 && !freeEntries.isEmpty()) {
BasicPoolEntry entry = freeEntries.remove(); BasicPoolEntry entry = freeEntries.remove();
entry.setState(null); entry.shutdownEntry();
OperatedClientConnection conn = entry.getConnection(); OperatedClientConnection conn = entry.getConnection();
try { try {
conn.close(); conn.close();