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