[
https://issues.apache.org/jira/browse/POOL-404?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Patrick Barry updated POOL-404:
-------------------------------
Description:
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); ->
was:
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 many reported
in the past, but it still not shutting down. 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 thought 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); ->
> 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)