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