You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2021/08/13 16:02:09 UTC

[commons-pool] branch master updated: Reimplement DefaultPooledObject.getIdleDuration() using Duration computation.

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 53c72e9  Reimplement DefaultPooledObject.getIdleDuration() using Duration computation.
53c72e9 is described below

commit 53c72e917c0ddc060745ba4edf1b4fff056c1bda
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Aug 13 12:02:07 2021 -0400

    Reimplement DefaultPooledObject.getIdleDuration() using Duration
    computation.
    
    The default implementation of TrackedUse.getLastUsedInstant() uses
    seconds instead of milliseconds. This interface is not implemented
    within Commons Pool.
    
    Local build ok, still looking at weird GH build failures.
---
 src/changes/changes.xml                                    |  3 +++
 src/main/java/org/apache/commons/pool2/TrackedUse.java     |  2 +-
 .../org/apache/commons/pool2/impl/DefaultPooledObject.java | 14 ++++++++++----
 .../apache/commons/pool2/impl/TestGenericObjectPool.java   |  3 +++
 4 files changed, 17 insertions(+), 5 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a08bce1..46f57c2 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -52,6 +52,9 @@ The <action> type attribute can be add,update,fix,remove.
       - PooledObject.getActiveTimeMillis()
     </action>
     <action dev="ggregory" type="fix" due-to="Gary Gregory">
+      The default implementation of TrackedUse.getLastUsedInstant() uses seconds instead of milliseconds. This interface is not implemented within Commons Pool.
+    </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/TrackedUse.java b/src/main/java/org/apache/commons/pool2/TrackedUse.java
index d25241e..0e7806a 100644
--- a/src/main/java/org/apache/commons/pool2/TrackedUse.java
+++ b/src/main/java/org/apache/commons/pool2/TrackedUse.java
@@ -47,6 +47,6 @@ public interface TrackedUse {
      * @since 2.11.0
      */
     default Instant getLastUsedInstant() {
-        return Instant.ofEpochSecond(getLastUsed());
+        return Instant.ofEpochMilli(getLastUsed());
     }
 }
diff --git a/src/main/java/org/apache/commons/pool2/impl/DefaultPooledObject.java b/src/main/java/org/apache/commons/pool2/impl/DefaultPooledObject.java
index 5736066..21e5307 100644
--- a/src/main/java/org/apache/commons/pool2/impl/DefaultPooledObject.java
+++ b/src/main/java/org/apache/commons/pool2/impl/DefaultPooledObject.java
@@ -18,6 +18,7 @@ package org.apache.commons.pool2.impl;
 
 import java.io.PrintWriter;
 import java.time.Clock;
+import java.time.Duration;
 import java.time.Instant;
 import java.util.Deque;
 
@@ -163,12 +164,17 @@ public class DefaultPooledObject<T> implements PooledObject<T> {
     }
 
     @Override
-    public long getIdleTimeMillis() {
-        final long elapsedMillis = System.currentTimeMillis() - lastReturnInstant.toEpochMilli();
+    public Duration getIdleDuration() {
         // elapsed may be negative if:
-        // - another thread updates lastReturnTime during the calculation window
+        // - another thread updates lastReturnInstant during the calculation window
         // - System.currentTimeMillis() is not monotonic (e.g. system time is set back)
-        return elapsedMillis >= 0 ? elapsedMillis : 0;
+        final Duration elapsed = Duration.between(lastReturnInstant, now());
+        return elapsed.isNegative() ? Duration.ZERO : elapsed;
+    }
+
+    @Override
+    public long getIdleTimeMillis() {
+        return getIdleDuration().toMillis();
     }
 
     @Override
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 34bc7f0..b89a805 100644
--- a/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
+++ b/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
@@ -1037,6 +1037,9 @@ public class TestGenericObjectPool extends TestBaseObjectPool {
         assertThat(dpo.getCreateInstant(), lessThanOrEqualTo(lastBorrowInstant1));
         assertThat(dpo.getCreateInstant(), lessThanOrEqualTo(lastReturnInstant1));
         assertThat(dpo.getCreateInstant(), lessThanOrEqualTo(lastUsedInstant1));
+        assertThat(dpo.getCreateTime(), lessThanOrEqualTo(lastBorrowInstant1.toEpochMilli()));
+        assertThat(dpo.getCreateTime(), lessThanOrEqualTo(lastReturnInstant1.toEpochMilli()));
+        assertThat(dpo.getCreateTime(), lessThanOrEqualTo(lastUsedInstant1.toEpochMilli()));
 
         // Sleep MUST be "long enough" to detect that more than 0 milliseconds have elapsed.
         // Need an API in Java 8 to get the clock granularity.