You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2017/02/09 13:41:09 UTC
svn commit: r1782329 - in /commons/proper/pool/trunk/src: changes/changes.xml
main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
Author: markt
Date: Thu Feb 9 13:41:09 2017
New Revision: 1782329
URL: http://svn.apache.org/viewvc?rev=1782329&view=rev
Log:
Fix issue reported on users list.
Ensure that a call to GKOP preparePool() takes account of other threads that might create objects concurrently, particularly the Evictor.
Modified:
commons/proper/pool/trunk/src/changes/changes.xml
commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
Modified: commons/proper/pool/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/changes/changes.xml?rev=1782329&r1=1782328&r2=1782329&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/changes/changes.xml (original)
+++ commons/proper/pool/trunk/src/changes/changes.xml Thu Feb 9 13:41:09 2017
@@ -79,6 +79,10 @@ The <action> type attribute can be add,u
an Evictor to allow the associated thread time to complete and current
evictions and to terminate.
</action>
+ <action dev="markt" type="fix">
+ Ensure that a call to GKOP preparePool() takes account of other threads
+ that might create objects concurrently, particularly the Evictor.
+ </action>
</release>
<release version="2.4.2" date="2015-08-01" description=
"This is a patch release, including bug fixes only.">
Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1782329&r1=1782328&r2=1782329&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java Thu Feb 9 13:41:09 2017
@@ -76,7 +76,7 @@ import org.apache.commons.pool2.Swallowe
* @since 2.0
*/
public class GenericKeyedObjectPool<K,T> extends BaseGenericObjectPool<T>
- implements KeyedObjectPool<K,T>, GenericKeyedObjectPoolMXBean<K> {
+implements KeyedObjectPool<K,T>, GenericKeyedObjectPoolMXBean<K> {
/**
* Create a new <code>GenericKeyedObjectPool</code> using defaults from
@@ -524,7 +524,7 @@ public class GenericKeyedObjectPool<K,T>
final int maxIdle = getMaxIdlePerKey();
final LinkedBlockingDeque<PooledObject<T>> idleObjects =
- objectDeque.getIdleObjects();
+ objectDeque.getIdleObjects();
if (isClosed() || maxIdle > -1 && maxIdle <= idleObjects.size()) {
try {
@@ -758,7 +758,7 @@ public class GenericKeyedObjectPool<K,T>
// for zero
int itemsToRemove = ((int) (map.size() * 0.15)) + 1;
final Iterator<Map.Entry<PooledObject<T>, K>> iter =
- map.entrySet().iterator();
+ map.entrySet().iterator();
while (iter.hasNext() && itemsToRemove > 0) {
final Map.Entry<PooledObject<T>, K> entry = iter.next();
@@ -843,7 +843,7 @@ public class GenericKeyedObjectPool<K,T>
final ObjectDeque<T> deque = entry.getValue();
if (deque != null) {
final LinkedBlockingDeque<PooledObject<T>> pool =
- deque.getIdleObjects();
+ deque.getIdleObjects();
if(pool.hasTakeWaiters()) {
return true;
}
@@ -1210,7 +1210,7 @@ public class GenericKeyedObjectPool<K,T>
*/
private void ensureMinIdle(final K key) throws Exception {
// Calculate current pool objects
- final ObjectDeque<T> objectDeque = poolMap.get(key);
+ ObjectDeque<T> objectDeque = poolMap.get(key);
// objectDeque == null is OK here. It is handled correctly by both
// methods called below.
@@ -1224,6 +1224,12 @@ public class GenericKeyedObjectPool<K,T>
for (int i = 0; i < deficit && calculateDeficit(objectDeque) > 0; i++) {
addObject(key);
+ // If objectDeque was null, it won't be any more. Obtain a reference
+ // to it so the deficit can be correctly calculated. It needs to
+ // take account of objects created in other threads.
+ if (objectDeque == null) {
+ objectDeque = poolMap.get(key);
+ }
}
}
@@ -1548,9 +1554,9 @@ public class GenericKeyedObjectPool<K,T>
private volatile int maxIdlePerKey =
GenericKeyedObjectPoolConfig.DEFAULT_MAX_IDLE_PER_KEY;
private volatile int minIdlePerKey =
- GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY;
+ GenericKeyedObjectPoolConfig.DEFAULT_MIN_IDLE_PER_KEY;
private volatile int maxTotalPerKey =
- GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
+ GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
private final KeyedPooledObjectFactory<K,T> factory;
private final boolean fairness;
@@ -1584,7 +1590,7 @@ public class GenericKeyedObjectPool<K,T>
// JMX specific attributes
private static final String ONAME_BASE =
- "org.apache.commons.pool2:type=GenericKeyedObjectPool,name=";
+ "org.apache.commons.pool2:type=GenericKeyedObjectPool,name=";
@Override
protected void toStringAppendFields(final StringBuilder builder) {