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);