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

ASF GitHub Bot commented on POOL-337:
-------------------------------------

Github user cdeneux commented on the issue:

    https://github.com/apache/commons-pool/pull/4
  
    Hi @garydgregory,
    
    To be able to release our product [Petals ESB](http://petals.ow2.org/), we 
wish embed this fix. We can use the official released artefact, or our own 
forked artefact.
    To choose between both ways, can you tell me when you plan to merge this PR 
and when you release ? Have you everything you needed to do it ?
    
    Regards,
    Christophe


> EvictionTimer does not remove cancelled tasks from the executor, leading to 
> an IllegalStateException when the evictor attempts to evict
> ---------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: POOL-337
>                 URL: https://issues.apache.org/jira/browse/POOL-337
>             Project: Commons Pool
>          Issue Type: Bug
>    Affects Versions: 2.5.0
>            Reporter: Reinald Verheij
>            Priority: Major
>         Attachments: EvictionTimer.java, 
> EvictionTimer.java.original-from-2.5.0.java
>
>
> EvictionTimer does not remove cancelled tasks from the executor, leading to 
> an IllegalStateException when the evictor attempts to evict.
>  
> EvictionTimer::schedule() adds eviction tasks to the executor, but the cancel 
> does not remove it. This is asymmetric and leads to the following exception:
> {noformat}
> java.lang.IllegalStateException: Pool not open
>       at 
> org.apache.commons.pool2.impl.BaseGenericObjectPool.assertOpen(BaseGenericObjectPool.java:713)
>       at 
> org.apache.commons.pool2.impl.GenericObjectPool.evict(GenericObjectPool.java:721)
>       at 
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:1077)
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
>       at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>       at java.lang.Thread.run(Thread.java:748){noformat}
> I think the cancel would need to remember the future which returned from 
> {{executor::scheduleWithFixedDelay()}} in {{schedule()}} and then do 
> something like this (see  [^EvictionTimer.java] compared to original  
> [^EvictionTimer.java.original-from-2.5.0.java] )
> {code:java}
> if (futures.containsKey(task)) {
>     futures.remove(task).cancel(false);
>     executor.purge();
> }{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to