[ 
https://issues.apache.org/jira/browse/POOL-340?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16459125#comment-16459125
 ] 

Phil Steitz commented on POOL-340:
----------------------------------

Another workaround-ish idea is to achieve the effect of propagation of the 
swallowed exception on returnObject by configuring a 
SwallowedExceptionListener.  See 
BaseGenericObjectPool#setSwallowedExceptionListener.

One more note on this.  If threads are waiting on borrow requests and there are 
no idle instances available and a return fails validation, the current code 
does try to create a new instance to "replace" the one failing validation.  If 
that create fails with an exception, the failure can be picked up with a 
SwallowedExceptionListener.

> borrowObject is stuck, if create fails
> --------------------------------------
>
>                 Key: POOL-340
>                 URL: https://issues.apache.org/jira/browse/POOL-340
>             Project: Commons Pool
>          Issue Type: Bug
>    Affects Versions: 2.4, 2.4.1, 2.4.2, 2.4.3, 2.5.0
>            Reporter: Pavel Kolesov
>            Priority: Critical
>
> After changes in 2.4.3 there is a high chance of a scenario, in which 
> borrowObject waits infinitely, if create fails or no one calls a create.
> {noformat}
>    java.lang.Thread.State: WAITING (parking)
>         at sun.misc.Unsafe.park(Native Method)
>         - parking to wait for  <0x0000000083cfd978> (a 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
>         at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
>         at 
> java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
>         at 
> org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583)
>         at 
> org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442)
>         at 
> org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
> {noformat}
> If pool is exhausted, when borrowObject tries to get idle object, it waits 
> for new object to be created.
> If all objects are returned to pool invalid and destroyed, and it is 
> impossible to create a new one, borrowObject will not return.
> Even if afterwards it is becomes possible to crate a new object but no one 
> creates it, borrowObject will not return either.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to