You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ma...@apache.org on 2009/11/01 17:33:31 UTC
svn commit: r831698 - 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: Sun Nov 1 16:33:31 2009
New Revision: 831698
URL: http://svn.apache.org/viewvc?rev=831698&view=rev
Log:
Fix POOL-152. When borrowing an object if a new object is created but validate fails, the latch should not be returned to the queue as an exception will be thrown.
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=831698&r1=831697&r2=831698&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 Sun Nov 1 16:33:31 2009
@@ -1211,8 +1211,10 @@
}
synchronized (this) {
latch.getPool().decrementInternalProcessingCount();
- latch.reset();
- _allocationQueue.add(0, latch);
+ if (!newlyCreated) {
+ latch.reset();
+ _allocationQueue.add(0, latch);
+ }
allocate();
}
if (newlyCreated) {
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=831698&r1=831697&r2=831698&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 Sun Nov 1 16:33:31 2009
@@ -1181,8 +1181,10 @@
}
synchronized (this) {
_numInternalProcessing--;
- latch.reset();
- _allocationQueue.add(0, latch);
+ if (!newlyCreated) {
+ latch.reset();
+ _allocationQueue.add(0, latch);
+ }
allocate();
}
if(newlyCreated) {
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=831698&r1=831697&r2=831698&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 Sun Nov 1 16:33:31 2009
@@ -1458,4 +1458,51 @@
}
}
}
+
+ /**
+ * On first borrow, first object fails validation, second object is OK.
+ * Subsequent borrows are OK. This was POOL-152.
+ */
+ public void testBrokenFactoryShouldNotBlockPool() {
+ int maxActive = 1;
+
+ SimpleFactory factory = new SimpleFactory();
+ factory.setMaxActive(maxActive);
+ pool.setFactory(factory);
+ pool.setMaxActive(maxActive);
+ pool.setWhenExhaustedAction(GenericObjectPool.WHEN_EXHAUSTED_BLOCK);
+ pool.setTestOnBorrow(true);
+
+ // First borrow object will need to create a new object which will fail
+ // validation.
+ Object obj = null;
+ Exception ex = null;
+ factory.setValid(false);
+ try {
+ obj = pool.borrowObject();
+ } catch (Exception e) {
+ ex = e;
+ }
+ // Failure expected
+ assertNotNull(ex);
+ assertTrue(ex instanceof NoSuchElementException);
+ assertNull(obj);
+
+ // Configure factory to create valid objects so subsequent borrows work
+ factory.setValid(true);
+
+ // Subsequent borrows should be OK
+ try {
+ obj = pool.borrowObject();
+ } catch (Exception e1) {
+ fail();
+ }
+ assertNotNull(obj);
+ try {
+ pool.returnObject(obj);
+ } catch (Exception e) {
+ fail();
+ }
+
+ }
}