This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-pool.git
The following commit(s) were added to refs/heads/master by this push: new 3f8c121 Getting a PooledObject's active duration returns a negative duration when the object is borrowed but not returned. Affects: - PooledObject.getActiveDuration() - PooledObject.getActiveTime() - PooledObject.getActiveTimeMillis() 3f8c121 is described below commit 3f8c121f789db232a2bb8c67488f3c0251c20d9b Author: Gary Gregory <gardgreg...@gmail.com> AuthorDate: Thu Aug 12 17:03:36 2021 -0400 Getting a PooledObject's active duration returns a negative duration when the object is borrowed but not returned. Affects: - PooledObject.getActiveDuration() - PooledObject.getActiveTime() - PooledObject.getActiveTimeMillis() --- src/changes/changes.xml | 8 +++++++- .../org/apache/commons/pool2/PooledObject.java | 2 +- .../commons/pool2/impl/GenericObjectPool.java | 10 +++++++--- .../pool2/impl/TestDefaultPooledObject.java | 17 +++++++++++++++-- .../commons/pool2/impl/TestGenericObjectPool.java | 22 ++++++++++++++++++++++ 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 2cb5650..035fa7b 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -43,9 +43,15 @@ The <action> type attribute can be add,update,fix,remove. <title>Apache Commons Pool Release Notes</title> </properties> <body> - <release version="2.11.1" date="2021-08-08" description="This is a maintenance release (Java 8)."> + <release version="2.11.1" date="2021-08-DD" description="This is a maintenance release (Java 8)."> <!-- FIXES --> <action dev="ggregory" type="fix" due-to="Gary Gregory"> + Getting a PooledObject's active duration returns a negative duration when the object is borrowed but not returned. Affects: + - PooledObject.getActiveDuration() + - PooledObject.getActiveTime() + - PooledObject.getActiveTimeMillis() + </action> + <action dev="ggregory" type="fix" due-to="Gary Gregory"> Fix field label in BaseGenericObjectPool toString() builder: From timeBetweenEvictionRunsMillis to durationBetweenEvictionRuns. </action> <action dev="ggregory" type="fix" due-to="Gary Gregory"> diff --git a/src/main/java/org/apache/commons/pool2/PooledObject.java b/src/main/java/org/apache/commons/pool2/PooledObject.java index 608f990..83ac35c 100644 --- a/src/main/java/org/apache/commons/pool2/PooledObject.java +++ b/src/main/java/org/apache/commons/pool2/PooledObject.java @@ -89,7 +89,7 @@ public interface PooledObject<T> extends Comparable<PooledObject<T>> { // @formatter:off return lastReturnInstant.isAfter(lastBorrowInstant) ? Duration.between(lastBorrowInstant, lastReturnInstant) : - Duration.between(Instant.now(), lastBorrowInstant); + Duration.between(lastBorrowInstant, Instant.now()); // @formatter:on } diff --git a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java index e7bf0a2..d732fe1 100644 --- a/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java +++ b/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java @@ -369,6 +369,10 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> return p.getObject(); } + PooledObject<T> getPooledObject(final T obj) { + return allObjects.get(new IdentityWrapper<>(obj)); + } + @Override String getStatsString() { // Simply listed in AB order. @@ -924,7 +928,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> */ @Override public void invalidateObject(final T obj, final DestroyMode destroyMode) throws Exception { - final PooledObject<T> p = allObjects.get(new IdentityWrapper<>(obj)); + final PooledObject<T> p = getPooledObject(obj); if (p == null) { if (isAbandonedConfig()) { return; @@ -1012,7 +1016,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> */ @Override public void returnObject(final T obj) { - final PooledObject<T> p = allObjects.get(new IdentityWrapper<>(obj)); + final PooledObject<T> p = getPooledObject(obj); if (p == null) { if (!isAbandonedConfig()) { @@ -1173,7 +1177,7 @@ public class GenericObjectPool<T> extends BaseGenericObjectPool<T> public void use(final T pooledObject) { final AbandonedConfig abandonedCfg = this.abandonedConfig; if (abandonedCfg != null && abandonedCfg.getUseUsageTracking()) { - allObjects.get(new IdentityWrapper<>(pooledObject)).use(); + getPooledObject(pooledObject).use(); } } diff --git a/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObject.java b/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObject.java index bf0cf1d..9dd7c97 100644 --- a/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObject.java +++ b/src/test/java/org/apache/commons/pool2/impl/TestDefaultPooledObject.java @@ -17,6 +17,7 @@ package org.apache.commons.pool2.impl; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.ArrayList; import java.util.List; @@ -27,9 +28,22 @@ import java.util.concurrent.atomic.AtomicBoolean; import org.junit.jupiter.api.Test; - +/** + * Tests {@link DefaultPooledObject}. + */ public class TestDefaultPooledObject { + @Test + public void testGetActiveDuration() throws InterruptedException { + final DefaultPooledObject<Object> dpo = new DefaultPooledObject<>(new Object()); + // Sleep MUST be "long enough" to test that we are not returning a negative time. + Thread.sleep(200); + assertFalse(dpo.getActiveDuration().isNegative()); + assertFalse(dpo.getActiveDuration().isZero()); + assertEquals(dpo.getActiveDuration().toMillis(), dpo.getActiveTimeMillis()); + assertEquals(dpo.getActiveDuration(), dpo.getActiveTime()); + } + /** * JIRA: POOL-279 * @throws Exception May occur in some failure modes @@ -76,5 +90,4 @@ public class TestDefaultPooledObject { assertFalse(negativeIdleTimeReturned.get(), "DefaultPooledObject.getIdleTimeMillis() returned a negative value"); } - } \ No newline at end of file diff --git a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java index dcad0ac..96ff12f 100644 --- a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java +++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java @@ -1898,6 +1898,28 @@ public class TestGenericObjectPool extends TestBaseObjectPool { } @Test + public void testGetActiveDuration() throws Exception { + // Borrow + final String object = genericObjectPool.borrowObject(); + final PooledObject<String> dpo = genericObjectPool.getPooledObject(object); + + // Sleep MUST be "long enough" to detect that more than 0 milliseconds have elapsed. + Thread.sleep(200); + assertFalse(dpo.getActiveDuration().isNegative()); + assertFalse(dpo.getActiveDuration().isZero()); + assertEquals(dpo.getActiveDuration().toMillis(), dpo.getActiveTimeMillis()); + assertEquals(dpo.getActiveDuration(), dpo.getActiveTime()); + + // Return + genericObjectPool.returnObject(object); + + assertFalse(dpo.getActiveDuration().isNegative()); + assertFalse(dpo.getActiveDuration().isZero()); + assertEquals(dpo.getActiveDuration().toMillis(), dpo.getActiveTimeMillis()); + assertEquals(dpo.getActiveDuration(), dpo.getActiveTime()); + } + + @Test public void testGetFactoryType_DefaultPooledObjectFactory() { try (final GenericObjectPool<String> pool = new GenericObjectPool<>(createDefaultPooledObjectFactory())) { assertNotNull((pool.getFactoryType()));