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: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org