These counts only count threads waiting on the Deques. We don't track factory methods in progress other than creates; but it looks to me like the estimate could be made more accurate by adding (in GOP case) createCount - createdCount. This is probably not that important in practice, unless the pool has screwy settings leading to lots of object churn. A more likely scenario leading to negative bias is high validation latency. We might want to consider tracking the number of validations in progress.
Phil On 12/14/11 3:47 PM, ma...@apache.org wrote: > Author: markt > Date: Wed Dec 14 22:47:17 2011 > New Revision: 1214517 > > URL: http://svn.apache.org/viewvc?rev=1214517&view=rev > Log: > Fix POOL-159. Expose (an estimate of) the number of threads blocked waiting > for an object from the pool. > > Modified: > > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java > > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java > > Modified: > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java > URL: > http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1214517&r1=1214516&r2=1214517&view=diff > ============================================================================== > --- > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java > (original) > +++ > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java > Wed Dec 14 22:47:17 2011 > @@ -1816,6 +1816,50 @@ public class GenericKeyedObjectPool<K,T> > return maxBorrowWaitTimeMillis; > } > > + /** > + * Return an estimate of the number of threads currently blocked waiting > for > + * an object from the pool. This is intended for monitoring only, not for > + * synchronization control. > + * > + * @return An estimate of the number of threads currently blocked > waiting > + * for an object from the pool > + */ > + public int getNumWaiters() { > + int result = 0; > + > + if (getBlockWhenExhausted()) { > + Iterator<ObjectDeque<T>> iter = poolMap.values().iterator(); > + > + while (iter.hasNext()) { > + // Assume no overflow > + result += iter.next().getIdleObjects().getTakeQueueLength(); > + } > + } > + > + return result; > + } > + > + /** > + * Return an estimate of the number of threads currently blocked waiting > for > + * an object from the pool for the given key. This is intended for > + * monitoring only, not for synchronization control. > + * > + * @return An estimate of the number of threads currently blocked > waiting > + * for an object from the pool for the given key > + */ > + public int getNumWaiters(K key) { > + if (getBlockWhenExhausted()) { > + final ObjectDeque<T> objectDeque = poolMap.get(key); > + if (objectDeque == null) { > + return 0; > + } else { > + return objectDeque.getIdleObjects().getTakeQueueLength(); > + } > + } else { > + return 0; > + } > + } > + > //--- inner classes ---------------------------------------------- > > /** > > Modified: > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java > URL: > http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1214517&r1=1214516&r2=1214517&view=diff > ============================================================================== > --- > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java > (original) > +++ > commons/proper/pool/trunk/src/java/org/apache/commons/pool2/impl/GenericObjectPool.java > Wed Dec 14 22:47:17 2011 > @@ -1341,6 +1341,22 @@ public class GenericObjectPool<T> extend > return maxBorrowWaitTimeMillis; > } > > + /** > + * Return an estimate of the number of threads currently blocked waiting > for > + * an object from the pool. This is intended for monitoring only, not for > + * synchronization control. > + * > + * @return An estimate of the number of threads currently blocked > waiting > + * for an object from the pool > + */ > + public int getNumWaiters() { > + if (getBlockWhenExhausted()) { > + return idleObjects.getTakeQueueLength(); > + } else { > + return 0; > + } > + } > + > // --- inner classes ---------------------------------------------- > > /** > > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org