Index: src/java/org/apache/commons/pool/impl/GenericObjectPool.java =================================================================== --- src/java/org/apache/commons/pool/impl/GenericObjectPool.java (revision 617809) +++ src/java/org/apache/commons/pool/impl/GenericObjectPool.java Sat Feb 02 19:38:55 CET 2008 @@ -1339,12 +1339,12 @@ public void run() { try { evict(); - } catch(Exception e) { + } catch(Throwable e) { // ignored } try { ensureMinIdle(); - } catch(Exception e) { + } catch(Throwable e) { // ignored } } Index: src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java =================================================================== --- src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java (revision 617809) +++ src/java/org/apache/commons/pool/impl/GenericKeyedObjectPool.java Sat Feb 02 19:36:39 CET 2008 @@ -1748,13 +1748,13 @@ //Evict from the pool try { evict(); - } catch(Exception e) { + } catch(Throwable e) { // ignored } //Re-create the connections. try { ensureMinIdle(); - } catch (Exception e) { + } catch (Throwable e) { // ignored } } Index: src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java =================================================================== --- src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java (revision 617809) +++ src/test/org/apache/commons/pool/impl/TestGenericObjectPool.java Sat Feb 02 19:21:21 CET 2008 @@ -177,7 +177,35 @@ pool.evict(); assertEquals(2, pool.getNumIdle()); } - + + public void testErrorWhenEvicting() throws Exception { + final SimpleFactory factory = new SimpleFactory(); + final GenericObjectPool pool = new GenericObjectPool(factory); + factory.setThrowErrorOnDestroy(true); + + //setup eviction + pool.setMinEvictableIdleTimeMillis(100); + pool.setTimeBetweenEvictionRunsMillis(100); + pool.setMinIdle(1); + + Object o1 = pool.borrowObject(), o2 = pool.borrowObject(); + assertEquals(2,pool.getNumActive()); + pool.returnObject(o1); pool.returnObject(o2); + assertEquals(2, pool.getNumIdle()); + Thread.sleep(300); // wait for eviction run + assertEquals(1, pool.getNumIdle()); //eviction ran, destroy threw (1) + + factory.setThrowErrorOnDestroy(false); + + o1 = pool.borrowObject(); o2 = pool.borrowObject(); + assertEquals(2,pool.getNumActive()); + pool.returnObject(o1); pool.returnObject(o2); + assertEquals(2, pool.getNumIdle()); + Thread.sleep(300); // wait for another eviction run + assertEquals(1, pool.getNumIdle()); //eviction ran again despite of the Error thrown at (1) + + } + /** * Test to make sure evictor visits least recently used objects first, * regardless of FIFO/LIFO @@ -1169,6 +1197,9 @@ if (destroyLatency > 0) { doWait(destroyLatency); } + if ( errorOnDestroy ) { + throw new Error(); + } synchronized(this) { activeCount--; } @@ -1199,6 +1230,7 @@ boolean evenValid = true; boolean oddValid = true; boolean exceptionOnPassivate = false; + boolean errorOnDestroy = false; boolean exceptionOnActivate = false; boolean enableValidation = true; long destroyLatency = 0; @@ -1220,7 +1252,11 @@ public void setValidationEnabled(boolean b) { enableValidation = b; } - + + public void setThrowErrorOnDestroy(boolean b){ + errorOnDestroy = b; + } + private void doWait(long latency) { try { Thread.sleep(latency);