You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Gary D. Gregory (Jira)" <ji...@apache.org> on 2022/01/21 15:36:00 UTC

[jira] [Comment Edited] (POOL-404) No way to close evictor thread

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

Gary D. Gregory edited comment on POOL-404 at 1/21/22, 3:35 PM:
----------------------------------------------------------------

[~psteitz] 

Regardless of whether this is an issue in client code or Apache Commons Pool, should we consider providing an escape hatch as a new close API with a close mode option? An enum {{{}CloseMode {{}}}{{{}GRACEFUL, {}}}{{{}IMMEDIATE{}}}}, somewhat similar to the recently introduced {{DestroyMode}} for pooled objects? FWIW, just as a side note, we introduced exactly that enum over in Apache  HttpComponents HttpCore 5.


was (Author: garydgregory):
[~psteitz] 

Regardless of whether this is an issue in client code or Apache Commons Pool, should we consider providing an escape hatch as a new close API with a close mode option? An enum {{{}CloseMode {{}}}{{{}GRACEFUL, {}}}{{{}IMMEDIATE{}}}}, somewhat similar to the recently introduced {{DestroyMode}} for pooled objects? FWIW, just as a side note, we introduced exactly that enum over in Apache  HttpComponents HttpCore 5.

> No way to close evictor thread
> ------------------------------
>
>                 Key: POOL-404
>                 URL: https://issues.apache.org/jira/browse/POOL-404
>             Project: Commons Pool
>          Issue Type: Bug
>    Affects Versions: 2.11.1
>            Reporter: Patrick Barry
>            Priority: Major
>
> Using GenericObjectPool<StatefulRedisConnection<String, String>> to help with lettuce client/redis connection management.   I have everything shutting down cleanly except the commons-pool-evictor.  I see this problem has been reported many times in the past, but all the changes are still not allowing this thread to shut down cleanly on close.  I am using version 2.11.1.  I have tried to code around this issue, but because EvictionTimer.java is so locked down, there is very little that can done to change the behavior of how this class interacts with GenericObjectPool.
> For this thread to shutdown, the taskMap has to be empty, which it never is in my case. So even though we call close() on the pool, this class fails to shutdown the embedded executor because it thinks it has more tasks.
> Looking at this code, it did remove 1 entry from taskMap, but we had many more in that map. Is there a way to clear this map, so it will allow this thread/executor to shutdown? 
> {code:java}
> static synchronized void cancel(final BaseGenericObjectPool<?>.Evictor evictor, final Duration timeout,
>         final boolean restarting) {
>     if (evictor != null) {
>         evictor.cancel();   //why does this not interrupt!?
>         remove(evictor);    
>     }
>     if (!restarting && executor != null && taskMap.isEmpty()) {  //<-- How do you force taskMap to be empty!?
>         executor.shutdown();
>         try {
>             executor.awaitTermination(timeout.toMillis(), TimeUnit.MILLISECONDS);
>         } catch (final InterruptedException e) {
>             // Swallow
>             // Significant API changes would be required to propagate this
>         }
>         executor.setCorePoolSize(0);
>         executor = null;
>     }
> }{code}
> }
> I had all these entries in the taskMap when trying to shut down:
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@73d4066e
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@3c69362a
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@2412a42b
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@45404d5
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@29138d3a
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@5cbe2654
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@6dbcf214
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@496a31da
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@7c251f90
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@51841ac6
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@5ba26eb0
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@435e60ff
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@17d32e9b
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@66f0548d
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@2e6f610d
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@1e86a5a7
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@10afe71a
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@741f8dbe
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@212dfd39
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@a2ddf26
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@49ede9c7
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@65d57e4e
> org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor@6daf7d37
> *Method calls:*
> pool.close() ->
> stopEvictor();  -> 
> startEvictor(Duration.ofMillis(-1L)); -> 
> EvictionTimer.cancel(evictor, evictorShutdownTimeoutDuration, false); ->
>  



--
This message was sent by Atlassian Jira
(v8.20.1#820001)