Author: markt
Date: Wed Jul 9 22:09:19 2014
New Revision: 1609329
URL: http://svn.apache.org/r1609329
Log:
Merge changes from Pool 2 to r1609323.
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/ (props changed)
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java
(contents, props changed)
tomcat/trunk/webapps/docs/changelog.xml
Propchange: tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/
------------------------------------------------------------------------------
Merged
/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2:r1593564-1609323
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseGenericObjectPool.java
Wed Jul 9 22:09:19 2014
@@ -63,6 +63,7 @@ public abstract class BaseGenericObjectP
private volatile long maxWaitMillis =
BaseObjectPoolConfig.DEFAULT_MAX_WAIT_MILLIS;
private volatile boolean lifo = BaseObjectPoolConfig.DEFAULT_LIFO;
+ private final boolean fairness;
private volatile boolean testOnCreate =
BaseObjectPoolConfig.DEFAULT_TEST_ON_CREATE;
private volatile boolean testOnBorrow =
@@ -135,6 +136,7 @@ public abstract class BaseGenericObjectP
// save the current CCL to be used later by the evictor Thread
factoryClassLoader = Thread.currentThread().getContextClassLoader();
+ fairness = config.getFairness();
}
@@ -247,6 +249,17 @@ public abstract class BaseGenericObjectP
public final boolean getLifo() {
return lifo;
}
+
+ /**
+ * Returns whether or not the pool serves threads waiting to borrow
objects fairly.
+ * True means that waiting threads are served as if waiting in a FIFO
queue.
+ *
+ * @return <code>true</code> if waiting threads are to be served
+ * by the pool in arrival order
+ */
+ public final boolean getFairness() {
+ return fairness;
+ }
/**
* Sets whether the pool has LIFO (last in, first out) behaviour with
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/BaseObjectPoolConfig.java
Wed Jul 9 22:09:19 2014
@@ -33,6 +33,13 @@ public abstract class BaseObjectPoolConf
* @see GenericKeyedObjectPool#getLifo()
*/
public static final boolean DEFAULT_LIFO = true;
+
+ /**
+ * The default value for the {@code fairness} configuration attribute.
+ * @see GenericObjectPool#getFairness()
+ * @see GenericKeyedObjectPool#getFairness()
+ */
+ public static final boolean DEFAULT_FAIRNESS = false;
/**
* The default value for the {@code maxWait} configuration attribute.
@@ -146,6 +153,8 @@ public abstract class BaseObjectPoolConf
private boolean lifo = DEFAULT_LIFO;
+
+ private boolean fairness = DEFAULT_FAIRNESS;
private long maxWaitMillis = DEFAULT_MAX_WAIT_MILLIS;
@@ -194,6 +203,20 @@ public abstract class BaseObjectPoolConf
public boolean getLifo() {
return lifo;
}
+
+ /**
+ * Get the value for the {@code fairness} configuration attribute for pools
+ * created with this configuration instance.
+ *
+ * @return The current setting of {@code fairness} for this configuration
+ * instance
+ *
+ * @see GenericObjectPool#getFairness()
+ * @see GenericKeyedObjectPool#getFairness()
+ */
+ public boolean getFairness() {
+ return fairness;
+ }
/**
* Set the value for the {@code lifo} configuration attribute for pools
@@ -208,6 +231,20 @@ public abstract class BaseObjectPoolConf
public void setLifo(boolean lifo) {
this.lifo = lifo;
}
+
+ /**
+ * Set the value for the {@code fairness} configuration attribute for pools
+ * created with this configuration instance.
+ *
+ * @param fairness The new setting of {@code fairness}
+ * for this configuration instance
+ *
+ * @see GenericObjectPool#getFairness()
+ * @see GenericKeyedObjectPool#getFairness()
+ */
+ public void setFairness(boolean fairness) {
+ this.fairness = fairness;
+ }
/**
* Get the value for the {@code maxWait} configuration attribute for pools
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPool.java
Wed Jul 9 22:09:19 2014
@@ -103,6 +103,7 @@ public class GenericKeyedObjectPool<K,T>
throw new IllegalArgumentException("factory may not be null");
}
this.factory = factory;
+ this.fairness = config.getFairness();
setConfig(config);
@@ -340,7 +341,7 @@ public class GenericKeyedObjectPool<K,T>
boolean blockWhenExhausted = getBlockWhenExhausted();
boolean create;
- long waitTime = 0;
+ long waitTime = System.currentTimeMillis();
ObjectDeque<T> objectDeque = register(key);
try {
@@ -356,10 +357,8 @@ public class GenericKeyedObjectPool<K,T>
if (borrowMaxWaitMillis < 0) {
p = objectDeque.getIdleObjects().takeFirst();
} else {
- waitTime = System.currentTimeMillis();
p = objectDeque.getIdleObjects().pollFirst(
borrowMaxWaitMillis,
TimeUnit.MILLISECONDS);
- waitTime = System.currentTimeMillis() - waitTime;
}
}
if (p == null) {
@@ -431,7 +430,7 @@ public class GenericKeyedObjectPool<K,T>
deregister(key);
}
- updateStatsBorrow(p, waitTime);
+ updateStatsBorrow(p, System.currentTimeMillis() - waitTime);
return p.getObject();
}
@@ -534,6 +533,12 @@ public class GenericKeyedObjectPool<K,T>
} else {
idleObjects.addLast(p);
}
+ if (isClosed()) {
+ // Pool closed while object was being added to idle objects.
+ // Make sure the returned object is destroyed rather than left
+ // in the idle object pool (which would effectively be a leak)
+ clear(key);
+ }
}
if (hasBorrowWaiters()) {
@@ -1083,7 +1088,7 @@ public class GenericKeyedObjectPool<K,T>
lock.lock();
objectDeque = poolMap.get(k);
if (objectDeque == null) {
- objectDeque = new ObjectDeque<>();
+ objectDeque = new ObjectDeque<>(fairness);
objectDeque.getNumInterested().incrementAndGet();
// NOTE: Keys must always be added to both poolMap and
// poolKeyList at the same time while protected by
@@ -1399,8 +1404,7 @@ public class GenericKeyedObjectPool<K,T>
*/
private class ObjectDeque<S> {
- private final LinkedBlockingDeque<PooledObject<S>> idleObjects =
- new LinkedBlockingDeque<>();
+ private final LinkedBlockingDeque<PooledObject<S>> idleObjects;
/*
* Number of instances created - number destroyed.
@@ -1425,6 +1429,15 @@ public class GenericKeyedObjectPool<K,T>
private final AtomicLong numInterested = new AtomicLong(0);
/**
+ * Create a new ObjecDeque with the given fairness policy.
+ * @param fairness true means client threads waiting to borrow /
return instances
+ * will be served as if waiting in a FIFO queue.
+ */
+ public ObjectDeque(boolean fairness) {
+ idleObjects = new LinkedBlockingDeque<>(fairness);
+ }
+
+ /**
* Obtain the idle objects for the current key.
*
* @return The idle objects
@@ -1470,6 +1483,7 @@ public class GenericKeyedObjectPool<K,T>
private volatile int maxTotalPerKey =
GenericKeyedObjectPoolConfig.DEFAULT_MAX_TOTAL_PER_KEY;
private final KeyedPooledObjectFactory<K,T> factory;
+ private final boolean fairness;
//--- internal attributes
--------------------------------------------------
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericKeyedObjectPoolMXBean.java
Wed Jul 9 22:09:19 2014
@@ -41,6 +41,11 @@ public interface GenericKeyedObjectPoolM
*/
boolean getBlockWhenExhausted();
/**
+ * See {@link GenericKeyedObjectPool#getFairness()}
+ * @return See {@link GenericKeyedObjectPool#getFairness()}
+ */
+ boolean getFairness();
+ /**
* See {@link GenericKeyedObjectPool#getLifo()}
* @return See {@link GenericKeyedObjectPool#getLifo()}
*/
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
(original)
+++ tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPool.java
Wed Jul 9 22:09:19 2014
@@ -109,6 +109,8 @@ public class GenericObjectPool<T> extend
}
this.factory = factory;
+ idleObjects = new LinkedBlockingDeque<>(config.getFairness());
+
setConfig(config);
startEvictor(getTimeBetweenEvictionRunsMillis());
@@ -420,7 +422,7 @@ public class GenericObjectPool<T> extend
boolean blockWhenExhausted = getBlockWhenExhausted();
boolean create;
- long waitTime = 0;
+ long waitTime = System.currentTimeMillis();
while (p == null) {
create = false;
@@ -434,10 +436,8 @@ public class GenericObjectPool<T> extend
if (borrowMaxWaitMillis < 0) {
p = idleObjects.takeFirst();
} else {
- waitTime = System.currentTimeMillis();
p = idleObjects.pollFirst(borrowMaxWaitMillis,
TimeUnit.MILLISECONDS);
- waitTime = System.currentTimeMillis() - waitTime;
}
}
if (p == null) {
@@ -506,7 +506,7 @@ public class GenericObjectPool<T> extend
}
}
- updateStatsBorrow(p, waitTime);
+ updateStatsBorrow(p, System.currentTimeMillis() - waitTime);
return p.getObject();
}
@@ -607,6 +607,12 @@ public class GenericObjectPool<T> extend
} else {
idleObjects.addLast(p);
}
+ if (isClosed()) {
+ // Pool closed while object was being added to idle objects.
+ // Make sure the returned object is destroyed rather than left
+ // in the idle object pool (which would effectively be a leak)
+ clear();
+ }
}
updateStatsReturn(activeTime);
}
@@ -903,6 +909,12 @@ public class GenericObjectPool<T> extend
idleObjects.addLast(p);
}
}
+ if (isClosed()) {
+ // Pool closed while object was being added to idle objects.
+ // Make sure the returned object is destroyed rather than left
+ // in the idle object pool (which would effectively be a leak)
+ clear();
+ }
}
/**
@@ -1097,8 +1109,7 @@ public class GenericObjectPool<T> extend
* {@link #_maxActive} objects created at any one time.
*/
private final AtomicLong createCount = new AtomicLong(0);
- private final LinkedBlockingDeque<PooledObject<T>> idleObjects =
- new LinkedBlockingDeque<>();
+ private final LinkedBlockingDeque<PooledObject<T>> idleObjects;
// JMX specific attributes
private static final String ONAME_BASE =
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/GenericObjectPoolMXBean.java
Wed Jul 9 22:09:19 2014
@@ -41,6 +41,11 @@ public interface GenericObjectPoolMXBean
* See {@link GenericObjectPool#getLifo()}
* @return See {@link GenericObjectPool#getLifo()}
*/
+ boolean getFairness();
+ /**
+ * See {@link GenericObjectPool#getFairness()}
+ * @return See {@link GenericObjectPool#getFairness()}
+ */
boolean getLifo();
/**
* See {@link GenericObjectPool#getMaxIdle()}
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/InterruptibleReentrantLock.java
Wed Jul 9 22:09:19 2014
@@ -34,6 +34,16 @@ class InterruptibleReentrantLock extends
private static final long serialVersionUID = 1L;
/**
+ * Create a new InterruptibleReentrantLock with the given fairness policy.
+ *
+ * @param fairness true means threads should acquire contended locks as if
+ * waiting in a FIFO queue
+ */
+ public InterruptibleReentrantLock(boolean fairness) {
+ super(fairness);
+ }
+
+ /**
* Interrupt the threads that are waiting on a specific condition
*
* @param condition the condition on which the threads are waiting.
Modified:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
---
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java
(original)
+++
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java
Wed Jul 9 22:09:19 2014
@@ -146,14 +146,13 @@ class LinkedBlockingDeque<E> extends Abs
private final int capacity;
/** Main lock guarding all access */
- private final InterruptibleReentrantLock lock =
- new InterruptibleReentrantLock();
+ private final InterruptibleReentrantLock lock;
/** Condition for waiting takes */
- private final Condition notEmpty = lock.newCondition();
+ private final Condition notEmpty;
/** Condition for waiting puts */
- private final Condition notFull = lock.newCondition();
+ private final Condition notFull;
/**
* Creates a {@code LinkedBlockingDeque} with a capacity of
@@ -162,6 +161,16 @@ class LinkedBlockingDeque<E> extends Abs
public LinkedBlockingDeque() {
this(Integer.MAX_VALUE);
}
+
+ /**
+ * Creates a {@code LinkedBlockingDeque} with a capacity of
+ * {@link Integer#MAX_VALUE} and the given fairness policy.
+ * @param fairness true means threads waiting on the deque should be served
+ * as if waiting in a FIFO request queue
+ */
+ public LinkedBlockingDeque(boolean fairness) {
+ this(Integer.MAX_VALUE, fairness);
+ }
/**
* Creates a {@code LinkedBlockingDeque} with the given (fixed) capacity.
@@ -170,8 +179,24 @@ class LinkedBlockingDeque<E> extends Abs
* @throws IllegalArgumentException if {@code capacity} is less than 1
*/
public LinkedBlockingDeque(int capacity) {
+ this(capacity, false);
+ }
+
+ /**
+ * Creates a {@code LinkedBlockingDeque} with the given (fixed) capacity
+ * and fairness policy.
+ *
+ * @param capacity the capacity of this deque
+ * @param fairness true means threads waiting on the deque should be served
+ * as if waiting in a FIFO request queue
+ * @throws IllegalArgumentException if {@code capacity} is less than 1
+ */
+ public LinkedBlockingDeque(int capacity, boolean fairness) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
+ lock = new InterruptibleReentrantLock(fairness);
+ notEmpty = lock.newCondition();
+ notFull = lock.newCondition();
}
/**
Propchange:
tomcat/trunk/java/org/apache/tomcat/dbcp/pool2/impl/LinkedBlockingDeque.java
('svn:mergeinfo' removed)
Modified: tomcat/trunk/webapps/docs/changelog.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1609329&r1=1609328&r2=1609329&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed Jul 9 22:09:19 2014
@@ -217,6 +217,10 @@
<bug>56685</bug>: Add quotes necessary for <code>daemon.sh</code> to
work correctly on Solaris. Based on a suggesiton by lfuka. (markt)
</fix>
+ <update>
+ Update package renamed Apache Commons Pool2 to r1609323 to pick various
+ bug fixes. (markt)
+ </update>
</changelog>
</subsection>
</section>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]