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

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

Thanks, Shuyang!

The test case demonstrates the problem nicely.  A simple fix for the specific 
case identified here is to recheck latch.mayCreate() inside the synch(latch) 
block, i.e. change GenericObjectPool line 1101 revision 792217 to 

if (latch.getPair() == null && !latch.mayCreate())

That "fix" does not fully address the problem though, as it deals only with the 
control path called out in the bug report.  We should look at all other latch 
state tests and scope of synchronization on latches.

> 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