Index: src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java =================================================================== --- src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java (revision 781880) +++ src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java (working copy) @@ -506,6 +506,25 @@ // expected } } + + public void testTimeoutNoLeak() throws Exception { + pool.setMaxActive(2); + pool.setMaxWait(10); + pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK); + Object obj = pool.borrowObject(); + Object obj2 = pool.borrowObject(); + try { + pool.borrowObject(); + fail("Expecting NoSuchElementException"); + } catch (NoSuchElementException ex) { + //xpected + } + pool.returnObject(obj2); + pool.returnObject(obj); + + obj = pool.borrowObject(); + obj2 = pool.borrowObject(); + } public void testMaxActiveZero() throws Exception { pool.setMaxActive(0); Index: src/java/org/apache/commons/pool/impl/GenericObjectPool.java =================================================================== --- src/java/org/apache/commons/pool/impl/GenericObjectPool.java (revision 781880) +++ src/java/org/apache/commons/pool/impl/GenericObjectPool.java (working copy) @@ -1104,6 +1104,9 @@ throw e; } if(maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) { + synchronized (this) { + _allocationQueue.remove(latch); + } throw new NoSuchElementException("Timeout waiting for idle object"); } else { continue; // keep looping