UNLIST

Guido Schmutz
Technology Manager Integration,
Common and Open Source based Development
Partner / Principal Consultant
Application Development

Trivadis AG
Papiermühlestrasse 73
CH-3014  Bern

Phone +41-31-928 09 60
Fax +41-31-928 09 64
Mobile +41-79-412 05 39
guido.schm...@trivadis.com
www.trivadis.com

Blog: http://guidoschmutz.wordpress.com

-----Original Message-----
From: ma...@apache.org [mailto:ma...@apache.org] 
Sent: Mittwoch, 17. März 2010 21:41
To: comm...@commons.apache.org
Subject: svn commit: r924479 - in /commons/proper/pool/trunk/src: 
java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java 
java/org/apache/commons/pool/impl/GenericObjectPool.java 
test/org/apache/commons/pool/impl/TestGenericObjectPool.java

Author: markt
Date: Wed Mar 17 20:40:42 2010
New Revision: 924479

URL: http://svn.apache.org/viewvc?rev=924479&view=rev
Log:
Provide a test case and fix POOL-162 based on Phil's suggestion.

Modified:
    
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
    
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
    
commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java

Modified: 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
URL: 
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java?rev=924479&r1=924478&r2=924479&view=diff
==============================================================================
--- 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
 (original)
+++ 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java
 Wed Mar 17 20:40:42 2010
@@ -1149,9 +1149,18 @@ public class GenericKeyedObjectPool exte
                                     }
                                 }
                             } catch(InterruptedException e) {
+                                synchronized (this) {
+                                    // Make sure allocate hasn't already 
assigned an object
+                                    // in a different thread or permitted a 
new object to be created
+                                    if (latch.getPair() == null && 
!latch.mayCreate()) {
+                                        _allocationQueue.remove(latch);
+                                    } else {
+                                        break;
+                                    }
+                                }
                                 Thread.currentThread().interrupt();
                                 throw e;
-                                }
+                            }
                             if (maxWait > 0 && ((System.currentTimeMillis() - 
starttime) >= maxWait)) {
                                 synchronized (this) {
                                     // Make sure allocate hasn't already 
assigned an object

Modified: 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
URL: 
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java?rev=924479&r1=924478&r2=924479&view=diff
==============================================================================
--- 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
 (original)
+++ 
commons/proper/pool/trunk/src/java/org/apache/commons/pool/impl/GenericObjectPool.java
 Wed Mar 17 20:40:42 2010
@@ -1117,6 +1117,16 @@ public class GenericObjectPool extends B
                                     }
                                 }
                             } catch(InterruptedException e) {
+                                synchronized(this) {
+                                    // Make sure allocate hasn't already 
assigned an object
+                                    // in a different thread or permitted a 
new object to be created
+                                    if (latch.getPair() == null && 
!latch.mayCreate()) {
+                                        // Remove latch from the allocation 
queue
+                                        _allocationQueue.remove(latch);
+                                    } else {
+                                        break;
+                                    }
+                                }
                                 Thread.currentThread().interrupt();
                                 throw e;
                             }

Modified: 
commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
URL: 
http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java?rev=924479&r1=924478&r2=924479&view=diff
==============================================================================
--- 
commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
 (original)
+++ 
commons/proper/pool/trunk/src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java
 Wed Mar 17 20:40:42 2010
@@ -110,6 +110,46 @@ public class TestGenericObjectPool exten
         pool.close();
     }
 
+    public void testWhenExhaustedBlockInterupt() throws Exception {
+        pool.setMaxActive(1);
+        pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK);
+        pool.setMaxWait(0);
+        Object obj1 = pool.borrowObject();
+        
+        // Make sure on object was obtained
+        assertNotNull(obj1);
+        
+        // Create a separate thread to try and borrow another object
+        WaitingTestThread wtt = new WaitingTestThread(pool, 200);
+        wtt.start();
+        // Give wtt time to start
+        Thread.sleep(200);
+        wtt.interrupt();
+
+        // Give interupt time to take effect
+        Thread.sleep(200);
+        
+        // Check thread was interrupted
+        assertTrue(wtt._thrown instanceof InterruptedException);
+
+        // Return object to the pool
+        pool.returnObject(obj1);
+        
+        // Bug POOL-162 - check there is now an object in the pool
+        pool.setMaxWait(10L);
+        Object obj2 = null;
+        try {
+             obj2 = pool.borrowObject();
+            assertNotNull(obj2);
+        } catch(NoSuchElementException e) {
+            // Not expected
+            fail("NoSuchElementException not expected");
+        }
+        pool.returnObject(obj2);
+        pool.close();
+        
+    }
+
     public void testEvictWhileEmpty() throws Exception {
         pool.evict();
         pool.evict();


Reply via email to