Author: markt Date: Sat Jun 13 17:42:28 2009 New Revision: 784441 URL: http://svn.apache.org/viewvc?rev=784441&view=rev Log: Fix POOL-144 and related issues for GOP and GKOP.
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 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=784441&r1=784440&r2=784441&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 Sat Jun 13 17:42:28 2009 @@ -1106,12 +1106,21 @@ case WHEN_EXHAUSTED_GROW: // allow new object to be created synchronized (this) { - _allocationQueue.remove(latch); - latch.getPool().incrementInternalProcessingCount(); + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() == null) { + _allocationQueue.remove(latch); + latch.getPool().incrementInternalProcessingCount(); + } } break; case WHEN_EXHAUSTED_FAIL: synchronized (this) { + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() != null) { + break; + } _allocationQueue.remove(latch); } throw new NoSuchElementException("Pool exhausted"); @@ -1136,6 +1145,15 @@ throw e; } if (maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) { + synchronized (this) { + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() == null) { + _allocationQueue.remove(latch); + } else { + break; + } + } throw new NoSuchElementException("Timeout waiting for idle object"); } else { continue; // keep looping 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=784441&r1=784440&r2=784441&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 Sat Jun 13 17:42:28 2009 @@ -1074,12 +1074,21 @@ case WHEN_EXHAUSTED_GROW: // allow new object to be created synchronized (this) { - _allocationQueue.remove(latch); - _numInternalProcessing++; + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() == null) { + _allocationQueue.remove(latch); + _numInternalProcessing++; + } } break; case WHEN_EXHAUSTED_FAIL: synchronized (this) { + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() != null) { + break; + } _allocationQueue.remove(latch); } throw new NoSuchElementException("Pool exhausted"); @@ -1104,6 +1113,16 @@ throw e; } if(maxWait > 0 && ((System.currentTimeMillis() - starttime) >= maxWait)) { + synchronized(this) { + // Make sure allocate hasn't already assigned an object + // in a different thread + if (latch.getPair() == null) { + // Remove latch from the allocation queue + _allocationQueue.remove(latch); + } else { + break; + } + } throw new NoSuchElementException("Timeout waiting for idle object"); } else { continue; // keep looping