You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2019/10/07 17:20:57 UTC
[commons-pool] branch master updated: Add sync on PooledObject to
make sure POOL-326 race does not recur.
This is an automated email from the ASF dual-hosted git repository.
psteitz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-pool.git
The following commit(s) were added to refs/heads/master by this push:
new 6eb494c Add sync on PooledObject to make sure POOL-326 race does not recur.
6eb494c is described below
commit 6eb494c5f000138d37f2f1a0ab931327c14b83b6
Author: Phil Steitz <ph...@gmail.com>
AuthorDate: Mon Oct 7 10:20:30 2019 -0700
Add sync on PooledObject to make sure POOL-326 race does not recur.
---
.../apache/commons/pool2/impl/GenericKeyedObjectPool.java | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java b/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
index 4cc69ed..f78a695 100644
--- a/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
+++ b/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
@@ -1086,12 +1086,15 @@ public class GenericKeyedObjectPool<K, T> extends BaseGenericObjectPool<T>
final ObjectDeque<T> objectDeque = register(key);
try {
- // Check idle state directly
- boolean isIdle = toDestroy.getState().equals(PooledObjectState.IDLE);
- // If idle, not under eviction test, or always is true, remove instance,
- // updating isIdle if instance is found in idle objects
- if (isIdle || always) {
- isIdle = objectDeque.getIdleObjects().remove(toDestroy);
+ boolean isIdle;
+ synchronized(toDestroy) {
+ // Check idle state directly
+ isIdle = toDestroy.getState().equals(PooledObjectState.IDLE);
+ // If idle, not under eviction test, or always is true, remove instance,
+ // updating isIdle if instance is found in idle objects
+ if (isIdle || always) {
+ isIdle = objectDeque.getIdleObjects().remove(toDestroy);
+ }
}
if (isIdle || always) {
objectDeque.getAllObjects().remove(new IdentityWrapper<>(toDestroy.getObject()));