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

Patrick Barry commented on POOL-404:
------------------------------------

[~psteitz] My intention is to only have 1 pool for lettuce connections to redis 
servers. However, I did find it strange in my testing that the thread name was 
incrementing the pool # as well as thread #.   However, in using jconsole, I 
confirmed I only ever see 1 pool in the mbeans, as well as the constructor of 
GenericObjectPool is only ever called once.  So I cannot explain why I have so 
many items in the taskMap.  In my test, I create the pool and then I call 
pool.borrowObject() using multiple threads.  

https://github.com/lettuce-io/lettuce-core/blob/main/src/main/java/io/lettuce/core/support/ConnectionPoolSupport.java

 

09:46:10.892 [pool-1-thread-1] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:10.892 [pool-1-thread-15] INFO  c.g.i.c.c.r.ManualSingleConnectionTest 
09:46:10.893 [pool-1-thread-16] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:10.893 [pool-1-thread-6] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:10.893 [pool-1-thread-22] INFO  c.g.i.c.c.r.ManualSingleConnectionTest -
09:46:10.893 [pool-1-thread-17] INFO  c.g.i.c.c.r.ManualSingleConnectionTest 
09:46:10.893 [pool-1-thread-7] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:10.893 [pool-1-thread-2] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 

25 commands took 1814ms. 0 succeeded. 0 failed
09:46:11.440 [pool-2-thread-2] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-1] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-4] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-5] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-3] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-6] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-7] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 
09:46:11.441 [pool-2-thread-8] INFO  c.g.i.c.c.r.ManualSingleConnectionTest - 

In the lettuce library, we create a new GenericObjectPool using this code: 
(io.lettuce.core.support.ConnectionPoolSupport)

ConnectionPoolSupport.createGenericObjectPool(redisClient::connect, 
objPoolConfig);

which creates a pool using this code:

 
{code:java}
GenericObjectPool<T> pool = new GenericObjectPool<T>(new 
ConnectionPoolSupport.RedisPooledObjectFactory(connectionSupplier), config) {
public T borrowObject() throws Exception {
return wrapConnections ? 
(StatefulConnection)ConnectionWrapping.wrapConnection(super.borrowObject(), 
(Origin)poolRef.get()) : (StatefulConnection)super.borrowObject();
}

public void returnObject(T obj) {
if (wrapConnections && obj instanceof HasTargetConnection) {
super.returnObject(((HasTargetConnection)obj).getTargetConnection());
} else {
super.returnObject(obj);
}
}
};
poolRef.set(new ConnectionPoolSupport.ObjectPoolWrapper(pool));
return pool{code}
 

> 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