[
https://issues.apache.org/jira/browse/POOL-303?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mark Thomas resolved POOL-303.
------------------------------
Resolution: Fixed
Fix Version/s: 2.4.3
Thanks for the report. I created a test case and, as a result, tweaked the
suggested fix. I also fixed the similar issue for GKOP.
> GenericObjectPool's borrowObject may stuck if create() always fail
> ------------------------------------------------------------------
>
> Key: POOL-303
> URL: https://issues.apache.org/jira/browse/POOL-303
> Project: Commons Pool
> Issue Type: Bug
> Reporter: Phil Yang
> Fix For: 2.4.3
>
> Attachments: 303.txt
>
>
> If GenericObjectPool's user use borrowObject() to get the object. The pool
> will try to pollFirst() first and if there is no idle object it will try to
> create it. In create() if createCount > maxTotal, it will not create any
> object and wait on idleObjects.takeFirst() or
> idleObjects.pollFirst(borrowMaxWaitMillis, TimeUnit.MILLISECONDS) for other
> thread return an object.
> If there are many threads (the number is more than maxTotal) to borrowObject
> concurrently, there will only maxTotal threads go to create the object, the
> others will wait on the queue. However, if the factory has some problem that
> makeObject() always throw Exception, there will not be any object created so
> no thread will return the object that should send a signal to one waiting
> thread. The thread wait on idleObjects.takeFirst() will stuck forever
> because it has no timeout.
> I think it can be fixed by adding a idleObjects.interuptTakeWaiters(); in
> create() before it throws the exception and let the waiting threads
> interrupted and retry to create.
> It seems that all 2.x version affected?
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)