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

Phil Steitz edited comment on POOL-404 at 1/22/22, 5:26 PM:
------------------------------------------------------------

That would have to be a *global* JVM-level close that would not be advisable 
[~ggregory] .  [~patrickjamesbarry] , those references are to evictors for 
pools that appear to be open.  Are you sure that your code is calling close on 
each pool that it creates?  

The EvictionTimer manages pool-specific evictor tasks at the JVM level.  The 
task map that it maintains holds references to evictors associated with open 
pools.  The cancel method removes the evictor that it is passed.  If the map is 
not empty, that means that there are other pools open with evictors running.   
If all pools are closed, all evictors will be cancelled and the deamon thread 
will terminate.  For this to work, all pools have to get closed.  There are two 
things we could do here to make it easier for clients:  0) enable the 
EvictionTimer to hold references to the pools and expose an iterator over all 
open pools so client shutdown code could get a list of them and cleanly shut 
them down 1) expose a closeAllPools method that closes all open pools.  Or 1) 
could just kill running evictors, leaving the pools open but no longer 
consistent with their configs.   This is a little smelly as what both really 
amount to is using EvictionTimer to allow clients to manage pools globally.  It 
might be better to introduce a separate class for that or to just recommend 
that when people want to manage a collection of pools, use 
GenericKeyedObjectPool instead.


was (Author: psteitz):
That would have to be a *global* JVM-level close that would not be advisable 
[~ggregory] .  [~patrickjamesbarry] , those references are to evictors for 
pools that appear to be open.  Are you sure that your code is calling close on 
each pool that it creates?  

> 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)

Reply via email to