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 2013/11/21 14:59:56 UTC

svn commit: r1544185 - in /httpcomponents/httpcore/trunk: ./ httpcore-nio/src/main/java/org/apache/http/nio/pool/ httpcore/src/main/java/org/apache/http/pool/

Author: olegk
Date: Thu Nov 21 13:59:56 2013
New Revision: 1544185

URL: http://svn.apache.org/r1544185
Log:
HTTPCORE-362: Purge pool per route map after closing out expired or idle connections

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/src/main/java/org/apache/http/pool/AbstractConnPool.java

Modified: httpcomponents/httpcore/trunk/RELEASE_NOTES.txt
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/RELEASE_NOTES.txt?rev=1544185&r1=1544184&r2=1544185&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpcore/trunk/RELEASE_NOTES.txt Thu Nov 21 13:59:56 2013
@@ -1,6 +1,10 @@
 Changes since 4.3
 -------------------
 
+* [HTTPCORE-362] Purge pool per route map after closing out expired or idle connections with 
+  #closeExpired and #closeIdle methods. 
+  Contributed by Oleg Kalnichevski <olegk at apache.org>
+
 * [HTTPCORE-361] Reduced intermediate garbage in HeaderGroup#getFirstHeader()
   Contributed by Oleg Kalnichevski <olegk at apache.org>
 

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=1544185&r1=1544184&r2=1544185&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 Thu Nov 21 13:59:56 2013
@@ -675,6 +675,7 @@ public abstract class AbstractNIOConnPoo
         }
     }
 
+    //TODO: this method should be private
     protected void enumEntries(final Iterator<E> it, final PoolEntryCallback<T, C> callback) {
         while (it.hasNext()) {
             final E entry = it.next();
@@ -688,6 +689,17 @@ public abstract class AbstractNIOConnPoo
         processPendingRequests();
     }
 
+    private void purgePoolMap() {
+        final Iterator<Map.Entry<T, RouteSpecificPool<T, C, E>>> it = this.routeToPool.entrySet().iterator();
+        while (it.hasNext()) {
+            final Map.Entry<T, RouteSpecificPool<T, C, E>> entry = it.next();
+            final RouteSpecificPool<T, C, E> pool = entry.getValue();
+            if (pool.getAllocatedCount() == 0) {
+                it.remove();
+            }
+        }
+    }
+
     public void closeIdle(final long idletime, final TimeUnit tunit) {
         Args.notNull(tunit, "Time unit");
         long time = tunit.toMillis(idletime);
@@ -704,6 +716,7 @@ public abstract class AbstractNIOConnPoo
             }
 
         });
+        purgePoolMap();
     }
 
     public void closeExpired() {
@@ -717,6 +730,7 @@ public abstract class AbstractNIOConnPoo
             }
 
         });
+        purgePoolMap();
     }
 
     @Override

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=1544185&r1=1544184&r2=1544185&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 Thu Nov 21 13:59:56 2013
@@ -57,6 +57,10 @@ abstract class RouteSpecificPool<T, C, E
         this.pending = new HashMap<SessionRequest, BasicFuture<E>>();
     }
 
+    public T getRoute() {
+        return this.route;
+    }
+
     protected abstract E createEntry(T route, C conn);
 
     public int getLeasedCount() {

Modified: httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java?rev=1544185&r1=1544184&r2=1544185&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java (original)
+++ httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java Thu Nov 21 13:59:56 2013
@@ -300,18 +300,6 @@ public abstract class AbstractConnPool<T
         }
     }
 
-    private void notifyPending(final RouteSpecificPool<T, C, E> pool) {
-        PoolEntryFuture<E> future = pool.nextPending();
-        if (future != null) {
-            this.pending.remove(future);
-        } else {
-            future = this.pending.poll();
-        }
-        if (future != null) {
-            future.wakeup();
-        }
-    }
-
     public void release(final E entry, final boolean reusable) {
         this.lock.lock();
         try {
@@ -324,7 +312,15 @@ public abstract class AbstractConnPool<T
                 } else {
                     entry.close();
                 }
-                notifyPending(pool);
+                PoolEntryFuture<E> future = pool.nextPending();
+                if (future != null) {
+                    this.pending.remove(future);
+                } else {
+                    future = this.pending.poll();
+                }
+                if (future != null) {
+                    future.wakeup();
+                }
             }
         } finally {
             this.lock.unlock();
@@ -467,6 +463,17 @@ public abstract class AbstractConnPool<T
         }
     }
 
+    private void purgePoolMap() {
+        final Iterator<Map.Entry<T, RouteSpecificPool<T, C, E>>> it = this.routeToPool.entrySet().iterator();
+        while (it.hasNext()) {
+            final Map.Entry<T, RouteSpecificPool<T, C, E>> entry = it.next();
+            final RouteSpecificPool<T, C, E> pool = entry.getValue();
+            if (pool.getPendingCount() + pool.getAllocatedCount() == 0) {
+                it.remove();
+            }
+        }
+    }
+
     /**
      * Closes connections that have been idle longer than the given period
      * of time and evicts them from the pool.
@@ -490,6 +497,7 @@ public abstract class AbstractConnPool<T
             }
 
         });
+        purgePoolMap();
     }
 
     /**
@@ -506,6 +514,7 @@ public abstract class AbstractConnPool<T
             }
 
         });
+        purgePoolMap();
     }
 
     @Override