commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Phil Steitz (JIRA)" <j...@apache.org>
Subject [jira] Commented: (POOL-149) A serious concurrent bug can cause resource leak when Pool exhausted and borrowed objects are invalid
Date Tue, 01 Sep 2009 19:24:32 GMT

    [ 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.


Mime
View raw message