You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2012/10/03 16:34:45 UTC
svn commit: r1393511 - in /httpcomponents/httpcore/trunk: ./
httpcore-nio/src/main/java/org/apache/http/nio/pool/
httpcore-nio/src/test/java/org/apache/http/nio/pool/
Author: olegk
Date: Wed Oct 3 14:34:44 2012
New Revision: 1393511
URL: http://svn.apache.org/viewvc?rev=1393511&view=rev
Log:
HTTPCORE-315: AbstractNIOConnPool fails to correctly deallocate connection if it is immediately released from the session request callback causing a resource leak
Contributed by Scott Stanton <snstanton at gmail.com>
Modified:
httpcomponents/httpcore/trunk/RELEASE_NOTES.txt
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java
httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java
httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java
Modified: httpcomponents/httpcore/trunk/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt?rev=1393511&r1=1393510&r2=1393511&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpcore/trunk/RELEASE_NOTES.txt Wed Oct 3 14:34:44 2012
@@ -1,4 +1,8 @@
-Changes since 4.2.1
+Changes in trunk
+
+* [HTTPCORE-315] AbstractNIOConnPool fails to correctly deallocate connection if it is immediately
+ released from the session request callback causing a resource leak.
+ Contributed by Scott Stanton <snstanton at gmail.com>
* [HTTPCORE-313] ContentType#parse now ignores empty and blank charset attributes.
HttpEntityUtils#toString now throws checked I/O exception ifit encounters an unsupported charset.
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java?rev=1393511&r1=1393510&r2=1393511&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java Wed Oct 3 14:34:44 2012
@@ -335,8 +335,10 @@ public abstract class AbstractNIOConnPoo
IOSession session = request.getSession();
try {
C conn = this.connFactory.create(route, session);
- E entry = pool.completed(request, conn);
+ E entry = pool.createEntry(request, conn);
this.leased.add(entry);
+ pool.completed(request, entry);
+
} catch (IOException ex) {
pool.failed(request, ex);
}
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java?rev=1393511&r1=1393510&r2=1393511&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/pool/RouteSpecificPool.java Wed Oct 3 14:34:44 2012
@@ -144,14 +144,17 @@ abstract class RouteSpecificPool<T, C, E
return future;
}
- public E completed(final SessionRequest request, final C conn) {
- BasicFuture<E> future = removeRequest(request);
+ public E createEntry(final SessionRequest request, final C conn) {
E entry = createEntry(this.route, conn);
this.leased.add(entry);
- future.completed(entry);
return entry;
}
+ public void completed(SessionRequest request, E entry) {
+ BasicFuture<E> future = removeRequest(request);
+ future.completed(entry);
+ }
+
public void cancelled(final SessionRequest request) {
BasicFuture<E> future = removeRequest(request);
future.cancel(true);
Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java?rev=1393511&r1=1393510&r2=1393511&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/pool/TestRouteSpecificPool.java Wed Oct 3 14:34:44 2012
@@ -95,9 +95,12 @@ public class TestRouteSpecificPool {
Assert.assertEquals(0, pool.getAvailableCount());
Assert.assertEquals(0, pool.getLeasedCount());
Assert.assertEquals(1, pool.getPendingCount());
- LocalPoolEntry entry = pool.completed(sessionRequest, session);
+ LocalPoolEntry entry = pool.createEntry(sessionRequest, session);
Assert.assertNotNull(entry);
Assert.assertSame(session, entry.getConnection());
+ Assert.assertFalse(future.isDone());
+ Assert.assertFalse(future.isCancelled());
+ pool.completed(sessionRequest, entry);
Assert.assertTrue(future.isDone());
Assert.assertFalse(future.isCancelled());
@@ -201,11 +204,14 @@ public class TestRouteSpecificPool {
Assert.assertEquals(0, pool.getLeasedCount());
Assert.assertEquals(3, pool.getPendingCount());
- LocalPoolEntry entry1 = pool.completed(sessionRequest1, session1);
+ LocalPoolEntry entry1 = pool.createEntry(sessionRequest1, session1);
+ pool.completed(sessionRequest1, entry1);
Assert.assertNotNull(entry1);
- LocalPoolEntry entry2 = pool.completed(sessionRequest2, session2);
+ LocalPoolEntry entry2 = pool.createEntry(sessionRequest2, session2);
+ pool.completed(sessionRequest2, entry2);
Assert.assertNotNull(entry2);
- LocalPoolEntry entry3 = pool.completed(sessionRequest3, session3);
+ LocalPoolEntry entry3 = pool.createEntry(sessionRequest3, session3);
+ pool.completed(sessionRequest3, entry3);
Assert.assertNotNull(entry3);
Assert.assertEquals(3, pool.getAllocatedCount());
@@ -258,11 +264,14 @@ public class TestRouteSpecificPool {
Assert.assertEquals(0, pool.getLeasedCount());
Assert.assertEquals(3, pool.getPendingCount());
- LocalPoolEntry entry1 = pool.completed(sessionRequest1, session1);
+ LocalPoolEntry entry1 = pool.createEntry(sessionRequest1, session1);
+ pool.completed(sessionRequest1, entry1);
Assert.assertNotNull(entry1);
- LocalPoolEntry entry2 = pool.completed(sessionRequest2, session2);
+ LocalPoolEntry entry2 = pool.createEntry(sessionRequest2, session2);
+ pool.completed(sessionRequest2, entry2);
Assert.assertNotNull(entry2);
- LocalPoolEntry entry3 = pool.completed(sessionRequest3, session3);
+ LocalPoolEntry entry3 = pool.createEntry(sessionRequest3, session3);
+ pool.completed(sessionRequest3, entry3);
Assert.assertNotNull(entry3);
Assert.assertEquals(3, pool.getAllocatedCount());
@@ -301,11 +310,14 @@ public class TestRouteSpecificPool {
BasicFuture<LocalPoolEntry> future3 = new BasicFuture<LocalPoolEntry>(null);
pool.addPending(sessionRequest3, future3);
- LocalPoolEntry entry1 = pool.completed(sessionRequest1, session1);
+ LocalPoolEntry entry1 = pool.createEntry(sessionRequest1, session1);
+ pool.completed(sessionRequest1, entry1);
Assert.assertNotNull(entry1);
- LocalPoolEntry entry2 = pool.completed(sessionRequest2, session2);
+ LocalPoolEntry entry2 = pool.createEntry(sessionRequest2, session2);
+ pool.completed(sessionRequest2, entry2);
Assert.assertNotNull(entry2);
- LocalPoolEntry entry3 = pool.completed(sessionRequest3, session3);
+ LocalPoolEntry entry3 = pool.createEntry(sessionRequest3, session3);
+ pool.completed(sessionRequest3, entry3);
Assert.assertNotNull(entry3);
entry2.setState(Boolean.FALSE);
@@ -365,11 +377,14 @@ public class TestRouteSpecificPool {
Assert.assertEquals(0, pool.getLeasedCount());
Assert.assertEquals(3, pool.getPendingCount());
- LocalPoolEntry entry1 = pool.completed(sessionRequest1, session1);
+ LocalPoolEntry entry1 = pool.createEntry(sessionRequest1, session1);
+ pool.completed(sessionRequest1, entry1);
Assert.assertNotNull(entry1);
- LocalPoolEntry entry2 = pool.completed(sessionRequest2, session2);
+ LocalPoolEntry entry2 = pool.createEntry(sessionRequest2, session2);
+ pool.completed(sessionRequest2, entry2);
Assert.assertNotNull(entry2);
- LocalPoolEntry entry3 = pool.completed(sessionRequest3, session3);
+ LocalPoolEntry entry3 = pool.createEntry(sessionRequest3, session3);
+ pool.completed(sessionRequest3, entry3);
Assert.assertNotNull(entry3);
Assert.assertEquals(3, pool.getAllocatedCount());
@@ -433,9 +448,11 @@ public class TestRouteSpecificPool {
BasicFuture<LocalPoolEntry> future3 = new BasicFuture<LocalPoolEntry>(null);
pool.addPending(sessionRequest3, future3);
- LocalPoolEntry entry1 = pool.completed(sessionRequest1, session1);
+ LocalPoolEntry entry1 = pool.createEntry(sessionRequest1, session1);
+ pool.completed(sessionRequest1, entry1);
Assert.assertNotNull(entry1);
- LocalPoolEntry entry2 = pool.completed(sessionRequest2, session2);
+ LocalPoolEntry entry2 = pool.createEntry(sessionRequest2, session2);
+ pool.completed(sessionRequest2, entry2);
Assert.assertNotNull(entry2);
pool.free(entry1, true);