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

Reply via email to