[
https://issues.apache.org/jira/browse/POOL-413?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18047821#comment-18047821
]
Raju Gupta commented on POOL-413:
---------------------------------
Right now the deque is unbounded. We could pass *maxIdle* as the capacity
parameter but that raises another issue to take care of when *maxIdle* changes
as the deque will have to be recreated. This is not desirable from a
performance perspective.
What's the rule on *maxIdle* ? Should users be allowed to set *maxIdle* once it
has been set ?
In what cases, would a user want to set *maxIdle* multiple times after the pool
has been created ?
If we can reinforce the idea that *maxIdle* can be set only once, I think then
we can change the deque to be a bounded queue and thus this should solve the
problem.
> [GOP] Race condition while returning objects. maxIdle is ignored
> ----------------------------------------------------------------
>
> Key: POOL-413
> URL: https://issues.apache.org/jira/browse/POOL-413
> Project: Commons Pool
> Issue Type: Bug
> Reporter: Adrien Bernard
> Priority: Major
> Attachments:
> 0001-Add-test-to-reproduce-concurrency-issue-when-returni.patch
>
>
> In a GenericObjectPool it is possible to configure a maximum number of idle
> objects to be kept by the pool while they are not in use.
> In unfortunate circumstances, if several threads return an object to the pool
> at the same time, the check on the maximum number of idle objects may be
> dismissed. This results in pool keeping more idle objects than configured.
> I have build a unit test to reproduce the issue. I attach it as a patch made
> on top of release 2.12.0. On my machine it randomly fails with a 10% rate.
> Looking into the source code of the returnObject method of the GOP, it seems
> that there is no synchronisation between the moment the check is made for the
> maxIdle configuration and the moment the object is destroyed :
> {code:java}
> final int maxIdleSave = getMaxIdle();
> if (isClosed() || maxIdleSave > -1 && maxIdleSave <= idleObjects.size()) {
> try {
> destroy(p, DestroyMode.NORMAL);
> } catch (final Exception e) {
> swallowException(e);
> }
> try {
> ensureIdle(1, false);
> } catch (final Exception e) {
> swallowException(e);
> }
> } {code}
> Have you thoughts on this ?
--
This message was sent by Atlassian Jira
(v8.20.10#820010)