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

Phil Steitz commented on POOL-149:
----------------------------------

Fillippo:  From the line numbers in the stack trace above, it looks like a) the 
pool version is 1.4 and b) you have configured the pool to block indefinitely 
(maxWait < 0) when the pool is exhausted and c) the pool is exhausted.  The 
issue reported in this ticket applies only to pool 1.5+.

Assuming I have interpreted the line numbers in the trace right, most likely 
what is going on is your application is not closing connections and you are 
exhausting the pool.

> A serious concurrent bug can cause resource leak when Pool exhausted and 
> borrowed objects are invalid
> -----------------------------------------------------------------------------------------------------
>
>                 Key: POOL-149
>                 URL: https://issues.apache.org/jira/browse/POOL-149
>             Project: Commons Pool
>          Issue Type: Bug
>            Reporter: shuyang.zhou
>            Priority: Critical
>         Attachments: BugTest.java
>
>
> This bug will happen when the pool is in exhausted state and the borrowed 
> object are invalid.
> Let's go through a simple scenario:
> 1)A GenericObjectPool with _maxActive==1, 
> whenExhaustedAction==WHEN_EXHAUSTED_BLOCK
> 2)Two threads using that pool, called thread1 and thread2
> Here is error path:
> 1)thread1 calls pool.borrowObject() to get the object out of the pool
> //now the pool is exhausted
> 2)thread2 calls pool.borrowObject(), adds a new latch to the 
> _allocationQueue, but before it enters the synchronized block for 
> WHEN_EXHAUSTED_BLOCK(GenericObjectPool line 1099 revision 806215), 
> context-switch happens
> 3)thread1 checks the object from pool, and decides to invalidate it. So it 
> calls pool.invalidateObject(), which calls allocate(), then calls 
> latch.notify(), but currently no thread is waiting on this latch.(thread2 has 
> not enter the wait synchronized block yet).
> 4)Then thread2 will wait there for ever.(it just missed the notify)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to