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