Author: markt
Date: Thu May 28 20:10:13 2015
New Revision: 1682322
URL: http://svn.apache.org/r1682322
Log:
Update Commons Pool fork to 2.4.0
Modified:
tomcat/tc8.0.x/trunk/ (props changed)
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/ (props changed)
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
Propchange: tomcat/tc8.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu May 28 20:10:13 2015
@@ -1 +1 @@
-/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357-1645358,1645455,1645465,1645469,1645471,1645473,1645475,1645486-1645488,1645626,1645641,1645685,1645743,1645763,1645951-1645953,1645955,1645993,1646098-1646106,1646178,1646220,1646302,1646304,1646420,1646470-1646471,1646476,1646559,1646717-1646723,1646773,1647026,1647042,1647530,1647655,1648304,1648815,1648907,1650081,1650365,1651116,1651120,1651280,1651470,1652938,1652970,1653041,1653471,1653550,1653574,1653797,1653815-1653816,1653819,1653840,1653857,1653888,1653972,1654013,1654030,1654050,1654123,1654148,1654159,1654513,1654515,1654517,1654522,1654524,1654725,1654735,1654766,1654785,1654851-1654852,1654978,1655122-1655124,1655126-1655127,1655129-1655130,1655132-1655133,1655312,1655438,1655441,1655454,1655558,1656087,1656299,1656319,1656331,1656345,1656350,1656590,1656648-1656650,1656657,1657041,1657054,1657374,1657492,1657510,1657565,1657580,1657584,1657586,1657589,1657592,1657607,1657609,1657682,1657
907,1658207,1658734,1658781,1658790,1658799,1658802,1658804,1658833,1658840,1658966,1659043,1659053,1659059,1659188-1659189,1659216,1659263,1659293,1659304,1659306-1659307,1659382,1659384,1659428,1659471,1659486,1659505,1659516,1659521,1659524,1659559,1659562,1659803,1659806,1659814,1659833,1659862,1659905,1659919,1659948,1659967,1659983-1659984,1660060,1660074,1660077,1660133,1660168,1660331-1660332,1660353,1660358,1660924,1661386,1661867,1661972,1661990,1662200,1662308-1662309,1662548,1662614,1662736,1662985,1662988-1662989,1663264,1663277,1663298,1663534,1663562,1663676,1663715,1663754,1663768,1663772,1663781,1663893,1663995,1664143,1664163,1664174,1664301,1664317,1664347,1664657,1664659,1664710,1664863-1664864,1664866,1665085,1665292,1665559,1665653,1665661,1665672,1665694,1665697,1665736,1665779,1665976-1665977,1665980-1665981,1665985-1665986,1665989,1665998,1666004,1666008,1666013,1666017,1666024,1666116,1666386-1666387,1666494,1666496,1666552,1666569,1666579,1666637,1666649,1
666757,1666966,1666972,1666985,1666995,1666997,1667292,1667402,1667406,1667546,1667615,1667630,1667636,1667688,1667764,1667871,1668026,1668135,1668193,1668593,1668596,1668630,1668639,1668843,1669353,1669370,1669451,1669800,1669838,1669876,1669882,1670394,1670433,1670591,1670598-1670600,1670610,1670631,1670719,1670724,1670726,1670730,1670940,1671112,1672272,1672284,1673754,1674294,1675461,1675486,1675594,1675830,1676231,1676250-1676251,1676364,1676381,1676393,1676479,1676525,1676552,1676615,1676630,1676634,1676721,1676926,1676943,1677140,1677802,1678011,1678162,1678174,1678339,1678426-1678427,1678694,1678701,1679534,1679708,1679710,1679716,1680034,1680246,1681056,1681123,1681138,1681280,1681283,1681286,1681450,1681701,1681729,1681770,1681779,1681793,1681807,1681837-1681838,1681854,1681862,1681958,1682028,1682033,1682311,1682315,1682317
+/tomcat/trunk:1636524,1637156,1637176,1637188,1637331,1637684,1637695,1638720-1638725,1639653,1640010,1640083-1640084,1640088,1640275,1640322,1640347,1640361,1640365,1640403,1640410,1640652,1640655-1640658,1640688,1640700-1640883,1640903,1640976,1640978,1641000,1641026,1641038-1641039,1641051-1641052,1641058,1641064,1641300,1641369,1641374,1641380,1641486,1641634,1641656-1641692,1641704,1641707-1641718,1641720-1641722,1641735,1641981,1642233,1642280,1642554,1642564,1642595,1642606,1642668,1642679,1642697,1642699,1642766,1643002,1643045,1643054-1643055,1643066,1643121,1643128,1643206,1643209-1643210,1643216,1643249,1643270,1643283,1643309-1643310,1643323,1643365-1643366,1643370-1643371,1643465,1643474,1643536,1643570,1643634,1643649,1643651,1643654,1643675,1643731,1643733-1643734,1643761,1643766,1643814,1643937,1643963,1644017,1644169,1644201-1644203,1644321,1644323,1644516,1644523,1644529,1644535,1644730,1644768,1644784-1644785,1644790,1644793,1644815,1644884,1644886,1644890,1644892
,1644910,1644924,1644929-1644930,1644935,1644989,1645011,1645247,1645355,1645357-1645358,1645455,1645465,1645469,1645471,1645473,1645475,1645486-1645488,1645626,1645641,1645685,1645743,1645763,1645951-1645953,1645955,1645993,1646098-1646106,1646178,1646220,1646302,1646304,1646420,1646470-1646471,1646476,1646559,1646717-1646723,1646773,1647026,1647042,1647530,1647655,1648304,1648815,1648907,1650081,1650365,1651116,1651120,1651280,1651470,1652938,1652970,1653041,1653471,1653550,1653574,1653797,1653815-1653816,1653819,1653840,1653857,1653888,1653972,1654013,1654030,1654050,1654123,1654148,1654159,1654513,1654515,1654517,1654522,1654524,1654725,1654735,1654766,1654785,1654851-1654852,1654978,1655122-1655124,1655126-1655127,1655129-1655130,1655132-1655133,1655312,1655438,1655441,1655454,1655558,1656087,1656299,1656319,1656331,1656345,1656350,1656590,1656648-1656650,1656657,1657041,1657054,1657374,1657492,1657510,1657565,1657580,1657584,1657586,1657589,1657592,1657607,1657609,1657682,1657
907,1658207,1658734,1658781,1658790,1658799,1658802,1658804,1658833,1658840,1658966,1659043,1659053,1659059,1659188-1659189,1659216,1659263,1659293,1659304,1659306-1659307,1659382,1659384,1659428,1659471,1659486,1659505,1659516,1659521,1659524,1659559,1659562,1659803,1659806,1659814,1659833,1659862,1659905,1659919,1659948,1659967,1659983-1659984,1660060,1660074,1660077,1660133,1660168,1660331-1660332,1660353,1660358,1660924,1661386,1661867,1661972,1661990,1662200,1662308-1662309,1662548,1662614,1662736,1662985,1662988-1662989,1663264,1663277,1663298,1663534,1663562,1663676,1663715,1663754,1663768,1663772,1663781,1663893,1663995,1664143,1664163,1664174,1664301,1664317,1664347,1664657,1664659,1664710,1664863-1664864,1664866,1665085,1665292,1665559,1665653,1665661,1665672,1665694,1665697,1665736,1665779,1665976-1665977,1665980-1665981,1665985-1665986,1665989,1665998,1666004,1666008,1666013,1666017,1666024,1666116,1666386-1666387,1666494,1666496,1666552,1666569,1666579,1666637,1666649,1
666757,1666966,1666972,1666985,1666995,1666997,1667292,1667402,1667406,1667546,1667615,1667630,1667636,1667688,1667764,1667871,1668026,1668135,1668193,1668593,1668596,1668630,1668639,1668843,1669353,1669370,1669451,1669800,1669838,1669876,1669882,1670394,1670433,1670591,1670598-1670600,1670610,1670631,1670719,1670724,1670726,1670730,1670940,1671112,1672272,1672284,1673754,1674294,1675461,1675486,1675594,1675830,1676231,1676250-1676251,1676364,1676381,1676393,1676479,1676525,1676552,1676615,1676630,1676634,1676721,1676926,1676943,1677140,1677802,1678011,1678162,1678174,1678339,1678426-1678427,1678694,1678701,1679534,1679708,1679710,1679716,1680034,1680246,1681056,1681123,1681138,1681280,1681283,1681286,1681450,1681701,1681729,1681770,1681779,1681793,1681807,1681837-1681838,1681854,1681862,1681958,1682028,1682033,1682311,1682315,1682317,1682320
Propchange: tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Thu May 28 20:10:13 2015
@@ -1,2 +1,2 @@
-/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2:1593516-1648905
-/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2:1643814,1648907
+/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2:1593516-1682319
+/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2:1643814,1648907,1682320
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java?rev=1682322&r1=1682321&r2=1682322&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
Thu May 28 20:10:13 2015
@@ -21,6 +21,7 @@ import java.io.StringWriter;
import java.io.Writer;
import java.lang.management.ManagementFactory;
import java.lang.ref.WeakReference;
+import java.util.Deque;
import java.util.Iterator;
import java.util.TimerTask;
import java.util.concurrent.atomic.AtomicLong;
@@ -89,7 +90,7 @@ public abstract class BaseGenericObjectP
volatile boolean closed = false;
final Object evictionLock = new Object();
private Evictor evictor = null; // @GuardedBy("evictionLock")
- Iterator<PooledObject<T>> evictionIterator = null; //
@GuardedBy("evictionLock")
+ EvictionIterator evictionIterator = null; // @GuardedBy("evictionLock")
/*
* Class loader for evictor thread to use since, in a JavaEE or similar
* environment, the context class loader for the evictor thread may not
have
@@ -583,7 +584,9 @@ public abstract class BaseGenericObjectP
/**
* Sets the name of the {@link EvictionPolicy} implementation that is
- * used by this pool.
+ * used by this pool. The Pool will attempt to load the class using the
+ * thread context class loader. If that fails, the Pool will attempt to
load
+ * the class using the class loader that loaded this class.
*
* @param evictionPolicyClassName the fully qualified class name of the
* new eviction policy
@@ -593,8 +596,13 @@ public abstract class BaseGenericObjectP
public final void setEvictionPolicyClassName(
String evictionPolicyClassName) {
try {
- Class<?> clazz = Class.forName(evictionPolicyClassName, true,
- Thread.currentThread().getContextClassLoader());
+ Class<?> clazz;
+ try {
+ clazz = Class.forName(evictionPolicyClassName, true,
+ Thread.currentThread().getContextClassLoader());
+ } catch (ClassNotFoundException e) {
+ clazz = Class.forName(evictionPolicyClassName);
+ }
Object policy = clazz.newInstance();
if (policy instanceof EvictionPolicy<?>) {
@SuppressWarnings("unchecked") // safe, because we just
checked the class
@@ -645,9 +653,11 @@ public abstract class BaseGenericObjectP
/**
* Returns the {@link EvictionPolicy} defined for this pool.
+ *
* @return the eviction policy
+ * @since 2.4
*/
- final EvictionPolicy<T> getEvictionPolicy() {
+ protected EvictionPolicy<T> getEvictionPolicy() {
return evictionPolicy;
}
@@ -1098,4 +1108,96 @@ public abstract class BaseGenericObjectP
return (long) result;
}
}
+
+ /**
+ * The idle object eviction iterator. Holds a reference to the idle
objects.
+ */
+ class EvictionIterator implements Iterator<PooledObject<T>> {
+
+ private final Deque<PooledObject<T>> idleObjects;
+ private final Iterator<PooledObject<T>> idleObjectIterator;
+
+ /**
+ * Create an EvictionIterator for the provided idle instance deque.
+ * @param idleObjects underlying deque
+ */
+ EvictionIterator(final Deque<PooledObject<T>> idleObjects) {
+ this.idleObjects = idleObjects;
+
+ if (getLifo()) {
+ idleObjectIterator = idleObjects.descendingIterator();
+ } else {
+ idleObjectIterator = idleObjects.iterator();
+ }
+ }
+
+ /**
+ * Returns the idle object deque referenced by this iterator.
+ * @return the idle object deque
+ */
+ public Deque<PooledObject<T>> getIdleObjects() {
+ return idleObjects;
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public boolean hasNext() {
+ return idleObjectIterator.hasNext();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public PooledObject<T> next() {
+ return idleObjectIterator.next();
+ }
+
+ /** {@inheritDoc} */
+ @Override
+ public void remove() {
+ idleObjectIterator.remove();
+ }
+
+ }
+
+ /**
+ * Wrapper for objects under management by the pool.
+ *
+ * GenericObjectPool and GenericKeyedObjectPool maintain references to all
+ * objects under management using maps keyed on the objects. This wrapper
+ * class ensures that objects can work as hash keys.
+ *
+ * @param <T> type of objects in the pool
+ */
+ static class IdentityWrapper<T> {
+ /** Wrapped object */
+ private final T instance;
+
+ /**
+ * Create a wrapper for an instance.
+ *
+ * @param instance object to wrap
+ */
+ public IdentityWrapper(T instance) {
+ this.instance = instance;
+ }
+
+ @Override
+ public int hashCode() {
+ return System.identityHashCode(instance);
+ }
+
+ @Override
+ @SuppressWarnings("rawtypes")
+ public boolean equals(Object other) {
+ return ((IdentityWrapper) other).instance == instance;
+ }
+
+ /**
+ * @return the wrapped object
+ */
+ public T getObject() {
+ return instance;
+ }
+ }
+
}
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java?rev=1682322&r1=1682321&r2=1682322&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
Thu May 28 20:10:13 2015
@@ -17,6 +17,7 @@
package org.apache.tomcat.dbcp.pool2.impl;
import java.util.ArrayList;
+import java.util.Deque;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -468,13 +469,23 @@ public class GenericKeyedObjectPool<K,T>
ObjectDeque<T> objectDeque = poolMap.get(key);
- PooledObject<T> p = objectDeque.getAllObjects().get(obj);
+ PooledObject<T> p = objectDeque.getAllObjects().get(new
IdentityWrapper<>(obj));
if (p == null) {
throw new IllegalStateException(
"Returned object not currently part of this pool");
}
+ synchronized(p) {
+ final PooledObjectState state = p.getState();
+ if (state != PooledObjectState.ALLOCATED) {
+ throw new IllegalStateException(
+ "Object has already been returned to this pool or is
invalid");
+ } else {
+ p.markReturning(); // Keep from being marked abandoned (once
GKOP does this)
+ }
+ }
+
long activeTime = p.getActiveTimeMillis();
if (getTestOnReturn()) {
@@ -572,7 +583,7 @@ public class GenericKeyedObjectPool<K,T>
ObjectDeque<T> objectDeque = poolMap.get(key);
- PooledObject<T> p = objectDeque.getAllObjects().get(obj);
+ PooledObject<T> p = objectDeque.getAllObjects().get(new
IdentityWrapper<>(obj));
if (p == null) {
throw new IllegalStateException(
"Object not currently part of this pool");
@@ -878,8 +889,6 @@ public class GenericKeyedObjectPool<K,T>
boolean testWhileIdle = getTestWhileIdle();
- LinkedBlockingDeque<PooledObject<T>> idleObjects = null;
-
for (int i = 0, m = getNumTests(); i < m; i++) {
if(evictionIterator == null || !evictionIterator.hasNext()) {
if (evictionKeyIterator == null ||
@@ -900,13 +909,9 @@ public class GenericKeyedObjectPool<K,T>
if (objectDeque == null) {
continue;
}
- idleObjects = objectDeque.getIdleObjects();
- if (getLifo()) {
- evictionIterator =
idleObjects.descendingIterator();
- } else {
- evictionIterator = idleObjects.iterator();
- }
+ final Deque<PooledObject<T>> idleObjects =
objectDeque.getIdleObjects();
+ evictionIterator = new EvictionIterator(idleObjects);
if (evictionIterator.hasNext()) {
break;
}
@@ -917,8 +922,10 @@ public class GenericKeyedObjectPool<K,T>
// Pools exhausted
return;
}
+ final Deque<PooledObject<T>> idleObjects;
try {
underTest = evictionIterator.next();
+ idleObjects = evictionIterator.getIdleObjects();
} catch (NoSuchElementException nsee) {
// Object was borrowed in another thread
// Don't count this as an eviction test so reduce i;
@@ -964,14 +971,12 @@ public class GenericKeyedObjectPool<K,T>
destroyedByEvictorCount.incrementAndGet();
}
if (active) {
- if (!factory.validateObject(evictionKey,
- underTest)) {
+ if (!factory.validateObject(evictionKey,
underTest)) {
destroy(evictionKey, underTest, true);
destroyedByEvictorCount.incrementAndGet();
} else {
try {
- factory.passivateObject(evictionKey,
- underTest);
+ factory.passivateObject(evictionKey,
underTest);
} catch (Exception e) {
destroy(evictionKey, underTest, true);
destroyedByEvictorCount.incrementAndGet();
@@ -1040,7 +1045,7 @@ public class GenericKeyedObjectPool<K,T>
}
createdCount.incrementAndGet();
- objectDeque.getAllObjects().put(p.getObject(), p);
+ objectDeque.getAllObjects().put(new IdentityWrapper<>(p.getObject()),
p);
return p;
}
@@ -1063,7 +1068,7 @@ public class GenericKeyedObjectPool<K,T>
boolean isIdle = objectDeque.getIdleObjects().remove(toDestroy);
if (isIdle || always) {
- objectDeque.getAllObjects().remove(toDestroy.getObject());
+ objectDeque.getAllObjects().remove(new
IdentityWrapper<>(toDestroy.getObject()));
toDestroy.invalidate();
try {
@@ -1247,8 +1252,7 @@ public class GenericKeyedObjectPool<K,T>
*
* @param key - The key to register for pool control.
*
- * @throws Exception If the associated factory fails to create the
necessary
- * number of idle instances
+ * @throws Exception If the associated factory throws an exception
*/
public void preparePool(K key) throws Exception {
int minIdlePerKeySave = getMinIdlePerKey();
@@ -1432,11 +1436,10 @@ public class GenericKeyedObjectPool<K,T>
private final AtomicInteger createCount = new AtomicInteger(0);
/*
- * The map is keyed on pooled instances. Note: pooled instances
- * <em>must</em> be distinguishable by equals for this structure to
- * work properly.
+ * The map is keyed on pooled instances, wrapped to ensure that
+ * they work properly as keys.
*/
- private final Map<S, PooledObject<S>> allObjects =
+ private final Map<IdentityWrapper<S>, PooledObject<S>> allObjects =
new ConcurrentHashMap<>();
/*
@@ -1489,9 +1492,10 @@ public class GenericKeyedObjectPool<K,T>
*
* @return All the objects
*/
- public Map<S, PooledObject<S>> getAllObjects() {
+ public Map<IdentityWrapper<S>, PooledObject<S>> getAllObjects() {
return allObjects;
}
+
}
//--- configuration attributes
---------------------------------------------
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java?rev=1682322&r1=1682321&r2=1682322&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolConfig.java
Thu May 28 20:10:13 2015
@@ -47,7 +47,7 @@ public class GenericKeyedObjectPoolConfi
public static final int DEFAULT_MIN_IDLE_PER_KEY = 0;
/**
- * The default value for the {@code minIdlePerKey} configuration attribute.
+ * The default value for the {@code maxIdlePerKey} configuration attribute.
* @see GenericKeyedObjectPool#getMaxIdlePerKey()
*/
public static final int DEFAULT_MAX_IDLE_PER_KEY = 8;
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java?rev=1682322&r1=1682321&r2=1682322&view=diff
==============================================================================
---
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
(original)
+++
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
Thu May 28 20:10:13 2015
@@ -532,27 +532,24 @@ public class GenericObjectPool<T> extend
*/
@Override
public void returnObject(T obj) {
- PooledObject<T> p = allObjects.get(obj);
+ PooledObject<T> p = allObjects.get(new IdentityWrapper<>(obj));
- if (!isAbandonedConfig()) {
- if (p == null) {
+ if (p == null) {
+ if (!isAbandonedConfig()) {
throw new IllegalStateException(
"Returned object not currently part of this pool");
+ } else {
+ return; // Object was abandoned and removed
}
- } else {
- if (p == null) {
- return; // Object was abandoned and removed
+ }
+
+ synchronized(p) {
+ final PooledObjectState state = p.getState();
+ if (state != PooledObjectState.ALLOCATED) {
+ throw new IllegalStateException(
+ "Object has already been returned to this pool or is
invalid");
} else {
- // Make sure object is not being reclaimed
- synchronized(p) {
- final PooledObjectState state = p.getState();
- if (state != PooledObjectState.ALLOCATED) {
- throw new IllegalStateException(
- "Object has already been returned to this pool
or is invalid");
- } else {
- p.markReturning(); // Keep from being marked abandoned
- }
- }
+ p.markReturning(); // Keep from being marked abandoned
}
}
@@ -633,7 +630,7 @@ public class GenericObjectPool<T> extend
*/
@Override
public void invalidateObject(T obj) throws Exception {
- PooledObject<T> p = allObjects.get(obj);
+ PooledObject<T> p = allObjects.get(new IdentityWrapper<>(obj));
if (p == null) {
if (isAbandonedConfig()) {
return;
@@ -751,11 +748,7 @@ public class GenericObjectPool<T> extend
for (int i = 0, m = getNumTests(); i < m; i++) {
if (evictionIterator == null ||
!evictionIterator.hasNext()) {
- if (getLifo()) {
- evictionIterator =
idleObjects.descendingIterator();
- } else {
- evictionIterator = idleObjects.iterator();
- }
+ evictionIterator = new EvictionIterator(idleObjects);
}
if (!evictionIterator.hasNext()) {
// Pool exhausted, nothing to do here
@@ -837,6 +830,20 @@ public class GenericObjectPool<T> extend
}
/**
+ * Tries to ensure that {@link #getMinIdle()} idle instances are available
+ * in the pool.
+ *
+ * @throws Exception If the associated factory throws an exception
+ * @since 2.4
+ */
+ public void preparePool() throws Exception {
+ if (getMinIdle() < 1) {
+ return;
+ }
+ ensureMinIdle();
+ }
+
+ /**
* Attempts to create a new wrapped pooled object.
* <p>
* If there are {@link #getMaxTotal()} objects already in circulation
@@ -869,7 +876,7 @@ public class GenericObjectPool<T> extend
}
createdCount.incrementAndGet();
- allObjects.put(p.getObject(), p);
+ allObjects.put(new IdentityWrapper<>(p.getObject()), p);
return p;
}
@@ -884,7 +891,7 @@ public class GenericObjectPool<T> extend
private void destroy(PooledObject<T> toDestory) throws Exception {
toDestory.invalidate();
idleObjects.remove(toDestory);
- allObjects.remove(toDestory.getObject());
+ allObjects.remove(new IdentityWrapper<>(toDestory.getObject()));
try {
factory.destroyObject(toDestory);
} finally {
@@ -939,6 +946,9 @@ public class GenericObjectPool<T> extend
/**
* Create an object, and place it into the pool. addObject() is useful for
* "pre-loading" a pool with idle objects.
+ * <p>
+ * If there is no capacity available to add to the pool, this is a no-op
+ * (no exception, no impact to the pool). </p>
*/
@Override
public void addObject() throws Exception {
@@ -953,7 +963,8 @@ public class GenericObjectPool<T> extend
/**
* Add the provided wrapped pooled object to the set of idle objects for
- * this pool. The object must already be part of the pool.
+ * this pool. The object must already be part of the pool. If {@code p}
+ * is null, this is a no-op (no exception, but no impact on the pool).
*
* @param p The object to make idle
*
@@ -1032,7 +1043,7 @@ public class GenericObjectPool<T> extend
public void use(T pooledObject) {
AbandonedConfig ac = this.abandonedConfig;
if (ac != null && ac.getUseUsageTracking()) {
- PooledObject<T> wrapper = allObjects.get(pooledObject);
+ PooledObject<T> wrapper = allObjects.get(new
IdentityWrapper<>(pooledObject));
wrapper.use();
}
}
@@ -1118,7 +1129,7 @@ public class GenericObjectPool<T> extend
* #_maxActive}. Map keys are pooled objects, values are the PooledObject
* wrappers used internally by the pool.
*/
- private final Map<T, PooledObject<T>> allObjects =
+ private final Map<IdentityWrapper<T>, PooledObject<T>> allObjects =
new ConcurrentHashMap<>();
/*
* The combined count of the currently created objects and those in the
Modified: tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml?rev=1682322&r1=1682321&r2=1682322&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.0.x/trunk/webapps/docs/changelog.xml Thu May 28 20:10:13 2015
@@ -104,6 +104,9 @@
Update package renamed Apache Commons DBCP to r1682314 to pick up the
DBCP 2.1 release and additional fixes since then. (markt)
</update>
+ <update>
+ Update package renamed Apache Commons Pool to the 2.4 release. (markt)
+ </update>
</changelog>
</subsection>
</section>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]