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

Phil Steitz edited comment on POOL-356 at 9/20/19 8:44 PM:
-----------------------------------------------------------

I am not sure this issue is really valid, but assuming there is a real use case 
to have maxIdle set to 0, the committed fix is not correct.  create() can 
return null and that will result in NPE in the put to idleObjects.  If I am 
missing something and it really does make sense to have minidle 0 (so you are 
basically just using the pool as an object factory), the correct fix is to call
{code:java}
ensureIdle(1, false); {code}
after the call to destroy in returnObject (like it does for validation 
failures).  That will be a no-op if create returns null.


was (Author: psteitz):
I am not sure this issue is really valid, but assuming there is a real use case 
to have maxIdle set to 0, the committed fix is not correct.  create() can 
return null and that will result in a null object added to the idle queue.  If 
I am missing something and it really does make sense to have minidle 0 (so you 
are basically just using the pool as an object factory), the correct fix is to 
call
{code:java}
ensureIdle(1, false); {code}
after the call to destroy in returnObject (like it does for validation 
failures).  That will be a no-op if create returns null.

> deadlock if borrowObject gets called to fast and maxIdle is 0
> -------------------------------------------------------------
>
>                 Key: POOL-356
>                 URL: https://issues.apache.org/jira/browse/POOL-356
>             Project: Commons Pool
>          Issue Type: Bug
>    Affects Versions: 2.6.0
>            Reporter: Mark Struberg
>            Assignee: Mark Struberg
>            Priority: Major
>             Fix For: 2.6.1
>
>
> I figured this while creating a unit test for OpenJPA. But also did see this 
> in real production with commons-dbcp2. See DBCP-513 for more info.
> See this comment for a precise explanation what happens 
> https://issues.apache.org/jira/browse/DBCP-513?focusedCommentId=16660545&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-16660545
> The problem is basically that the logic to immediately destroy a pool object 
> does not notify the DeLinkedQueue:
> {code}
>         if (isClosed() || maxIdleSave > -1 && maxIdleSave <= 
> idleObjects.size()) {
>             try {
>                 destroy(p);
> {code}
> But the borrowObject code is locking on that condition...
> {code}
>                     if (borrowMaxWaitMillis < 0) {
>                         p = idleObjects.takeFirst();
>                     } 
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to