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 2014/01/16 12:05:58 UTC

svn commit: r1558756 - in /httpcomponents/httpcore/trunk: RELEASE_NOTES.txt httpcore-nio/src/main/java/org/apache/http/nio/pool/AbstractNIOConnPool.java httpcore/src/main/java/org/apache/http/pool/AbstractConnPool.java

Author: olegk
Date: Thu Jan 16 11:05:58 2014
New Revision: 1558756

URL: http://svn.apache.org/r1558756
Log:
(Regression) Fixed synchronization issue in blocking and non-blocking connection pool implementations caused by HTTPCORE-362

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/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=1558756&r1=1558755&r2=1558756&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/RELEASE_NOTES.txt (original)
+++ httpcomponents/httpcore/trunk/RELEASE_NOTES.txt Thu Jan 16 11:05:58 2014
@@ -1,3 +1,12 @@
+Changes since release 4.3.1
+-------------------
+
+* (Regression) Fixed synchronization issue in blocking and non-blocking connection pool 
+  implementations caused by HTTPCORE-362
+  Contributed by Oleg Kalnichevski <olegk at apache.org>
+
+
+
 Release 4.3.1
 -------------------
 

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=1558756&r1=1558755&r2=1558756&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 Jan 16 11:05:58 2014
@@ -667,7 +667,18 @@ public abstract class AbstractNIOConnPoo
     protected void enumAvailable(final PoolEntryCallback<T, C> callback) {
         this.lock.lock();
         try {
-            enumEntries(this.available.iterator(), callback);
+            final Iterator<E> it = this.available.iterator();
+            while (it.hasNext()) {
+                final E entry = it.next();
+                callback.process(entry);
+                if (entry.isClosed()) {
+                    final RouteSpecificPool<T, C, E> pool = getPool(entry.getRoute());
+                    pool.remove(entry);
+                    it.remove();
+                }
+            }
+            processPendingRequests();
+            purgePoolMap();
         } finally {
             this.lock.unlock();
         }
@@ -681,22 +692,28 @@ public abstract class AbstractNIOConnPoo
     protected void enumLeased(final PoolEntryCallback<T, C> callback) {
         this.lock.lock();
         try {
-            enumEntries(this.leased.iterator(), callback);
+            final Iterator<E> it = this.leased.iterator();
+            while (it.hasNext()) {
+                final E entry = it.next();
+                callback.process(entry);
+            }
+            processPendingRequests();
         } finally {
             this.lock.unlock();
         }
     }
 
-    //TODO: this method should be private
+    /**
+     * Use {@link #enumLeased(org.apache.http.pool.PoolEntryCallback)}
+     *  or {@link #enumAvailable(org.apache.http.pool.PoolEntryCallback)} instead.
+     *
+     * @deprecated (4.3.2)
+     */
+    @Deprecated
     protected void enumEntries(final Iterator<E> it, final PoolEntryCallback<T, C> callback) {
         while (it.hasNext()) {
             final E entry = it.next();
             callback.process(entry);
-            if (entry.isClosed()) {
-                final RouteSpecificPool<T, C, E> pool = getPool(entry.getRoute());
-                pool.remove(entry);
-                it.remove();
-            }
         }
         processPendingRequests();
     }
@@ -729,7 +746,6 @@ public abstract class AbstractNIOConnPoo
             }
 
         });
-        purgePoolMap();
     }
 
     public void closeExpired() {
@@ -744,7 +760,6 @@ public abstract class AbstractNIOConnPoo
             }
 
         });
-        purgePoolMap();
     }
 
     @Override

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=1558756&r1=1558755&r2=1558756&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 Jan 16 11:05:58 2014
@@ -441,7 +441,17 @@ public abstract class AbstractConnPool<T
     protected void enumAvailable(final PoolEntryCallback<T, C> callback) {
         this.lock.lock();
         try {
-            enumEntries(this.available.iterator(), callback);
+            final Iterator<E> it = this.available.iterator();
+            while (it.hasNext()) {
+                final E entry = it.next();
+                callback.process(entry);
+                if (entry.isClosed()) {
+                    final RouteSpecificPool<T, C, E> pool = getPool(entry.getRoute());
+                    pool.remove(entry);
+                    it.remove();
+                }
+            }
+            purgePoolMap();
         } finally {
             this.lock.unlock();
         }
@@ -455,24 +465,16 @@ public abstract class AbstractConnPool<T
     protected void enumLeased(final PoolEntryCallback<T, C> callback) {
         this.lock.lock();
         try {
-            enumEntries(this.leased.iterator(), callback);
+            final Iterator<E> it = this.leased.iterator();
+            while (it.hasNext()) {
+                final E entry = it.next();
+                callback.process(entry);
+            }
         } finally {
             this.lock.unlock();
         }
     }
 
-    private void enumEntries(final Iterator<E> it, final PoolEntryCallback<T, C> callback) {
-        while (it.hasNext()) {
-            final E entry = it.next();
-            callback.process(entry);
-            if (entry.isClosed()) {
-                final RouteSpecificPool<T, C, E> pool = getPool(entry.getRoute());
-                pool.remove(entry);
-                it.remove();
-            }
-        }
-    }
-
     private void purgePoolMap() {
         final Iterator<Map.Entry<T, RouteSpecificPool<T, C, E>>> it = this.routeToPool.entrySet().iterator();
         while (it.hasNext()) {
@@ -508,7 +510,6 @@ public abstract class AbstractConnPool<T
             }
 
         });
-        purgePoolMap();
     }
 
     /**
@@ -526,7 +527,6 @@ public abstract class AbstractConnPool<T
             }
 
         });
-        purgePoolMap();
     }
 
     @Override