You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ps...@apache.org on 2014/05/19 03:15:23 UTC

svn commit: r1595711 - in /commons/proper/pool/trunk/src: changes/ main/java/org/apache/commons/pool2/impl/ test/java/org/apache/commons/pool2/impl/

Author: psteitz
Date: Mon May 19 01:15:23 2014
New Revision: 1595711

URL: http://svn.apache.org/r1595711
Log:
Made wait time stats accurate when pool is configured to block indefinitely. JIRA: POOL-259.

Modified:
    commons/proper/pool/trunk/src/changes/changes.xml
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
    commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
    commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
    commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java

Modified: commons/proper/pool/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/changes/changes.xml?rev=1595711&r1=1595710&r2=1595711&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/changes/changes.xml (original)
+++ commons/proper/pool/trunk/src/changes/changes.xml Mon May 19 01:15:23 2014
@@ -49,6 +49,11 @@ The <action> type attribute can be add,u
       Improve performance of statistics collection for pools that extend
       BaseGenericObjectPool.
     </action>
+    <action dev="psteitz" type="fix" issue="POOL-259">
+      Made client wait time statistics accurate when pools are configured to
+      block indefinitely.  Also modified computation to include latency clients
+      experience due to waiting on factory methods.
+    </action>
   </release>
   <release version="2.2" date="2014-02-24" description=
 "This is a maintenance release that adds a new testOnCreate configuration option

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java?rev=1595711&r1=1595710&r2=1595711&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericKeyedObjectPool.java Mon May 19 01:15:23 2014
@@ -343,7 +343,7 @@ public class GenericKeyedObjectPool<K,T>
         boolean blockWhenExhausted = getBlockWhenExhausted();
 
         boolean create;
-        long waitTime = 0;
+        long waitTime = System.currentTimeMillis();
         ObjectDeque<T> objectDeque = register(key);
 
         try {
@@ -359,10 +359,8 @@ public class GenericKeyedObjectPool<K,T>
                         if (borrowMaxWaitMillis < 0) {
                             p = objectDeque.getIdleObjects().takeFirst();
                         } else {
-                            waitTime = System.currentTimeMillis();
                             p = objectDeque.getIdleObjects().pollFirst(
                                     borrowMaxWaitMillis, TimeUnit.MILLISECONDS);
-                            waitTime = System.currentTimeMillis() - waitTime;
                         }
                     }
                     if (p == null) {
@@ -434,7 +432,7 @@ public class GenericKeyedObjectPool<K,T>
             deregister(key);
         }
 
-        updateStatsBorrow(p, waitTime);
+        updateStatsBorrow(p, System.currentTimeMillis() - waitTime);
 
         return p.getObject();
     }

Modified: commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java?rev=1595711&r1=1595710&r2=1595711&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/main/java/org/apache/commons/pool2/impl/GenericObjectPool.java Mon May 19 01:15:23 2014
@@ -423,7 +423,7 @@ public class GenericObjectPool<T> extend
         boolean blockWhenExhausted = getBlockWhenExhausted();
 
         boolean create;
-        long waitTime = 0;
+        long waitTime = System.currentTimeMillis();
 
         while (p == null) {
             create = false;
@@ -437,10 +437,8 @@ public class GenericObjectPool<T> extend
                     if (borrowMaxWaitMillis < 0) {
                         p = idleObjects.takeFirst();
                     } else {
-                        waitTime = System.currentTimeMillis();
                         p = idleObjects.pollFirst(borrowMaxWaitMillis,
                                 TimeUnit.MILLISECONDS);
-                        waitTime = System.currentTimeMillis() - waitTime;
                     }
                 }
                 if (p == null) {
@@ -509,7 +507,7 @@ public class GenericObjectPool<T> extend
             }
         }
 
-        updateStatsBorrow(p, waitTime);
+        updateStatsBorrow(p, System.currentTimeMillis() - waitTime);
 
         return p.getObject();
     }

Modified: commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java?rev=1595711&r1=1595710&r2=1595711&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java (original)
+++ commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericKeyedObjectPool.java Mon May 19 01:15:23 2014
@@ -1484,6 +1484,26 @@ public class TestGenericKeyedObjectPool 
         }
         Assert.assertEquals(nIterations, pool.getDestroyedCount());
     }
+    
+    // POOL-259
+    @Test
+    public void testClientWaitStats() throws Exception {
+        SimpleFactory<String> factory = new SimpleFactory<String>();
+        // Give makeObject a little latency
+        factory.setMakeLatency(100);
+        final GenericKeyedObjectPool<String, String> pool = new GenericKeyedObjectPool<String, String>(
+                factory, new GenericKeyedObjectPoolConfig());
+        String s = pool.borrowObject("one");
+        // First borrow waits on create, so wait time should be at least 100 ms
+        Assert.assertTrue(pool.getMaxBorrowWaitTimeMillis() >= 100);
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() >= 100);
+        pool.returnObject("one", s);
+        pool.borrowObject("one");
+        // Second borrow does not have to wait on create, average should be about 50
+        Assert.assertTrue(pool.getMaxBorrowWaitTimeMillis() >= 100);
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() < 60);  
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() > 40);  
+    }
 
     /**
      * Attempts to invalidate an object, swallowing IllegalStateException.
@@ -1663,6 +1683,7 @@ public class TestGenericKeyedObjectPool 
             if (exceptionOnCreate) {
                 throw new Exception();
             }
+            doWait(makeLatency);
             String out = null;
             synchronized(this) {
                 activeCount++;
@@ -1713,6 +1734,9 @@ public class TestGenericKeyedObjectPool 
         public void setDestroyLatency(long destroyLatency) {
             this.destroyLatency = destroyLatency;
         }
+        public void setMakeLatency(long makeLatency) {
+            this.makeLatency = makeLatency;
+        }
         public void setValidationEnabled(boolean b) {
             enableValidation = b;
         }
@@ -1745,6 +1769,7 @@ public class TestGenericKeyedObjectPool 
         boolean oddValid = true;
         boolean enableValidation = false;
         long destroyLatency = 0;
+        long makeLatency = 0;
         volatile int maxTotalPerKey = Integer.MAX_VALUE;
         boolean exceptionOnPassivate = false;
         boolean exceptionOnActivate = false;

Modified: commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java
URL: http://svn.apache.org/viewvc/commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java?rev=1595711&r1=1595710&r2=1595711&view=diff
==============================================================================
--- commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java (original)
+++ commons/proper/pool/trunk/src/test/java/org/apache/commons/pool2/impl/TestGenericObjectPool.java Mon May 19 01:15:23 2014
@@ -2274,6 +2274,26 @@ public class TestGenericObjectPool exten
         Assert.assertEquals(0, pool.getNumActive());
         Assert.assertEquals(1, pool.getNumIdle());
     }
+    
+    // POOL-259
+    @Test
+    public void testClientWaitStats() throws Exception {
+        SimpleFactory factory = new SimpleFactory();
+        // Give makeObject a little latency
+        factory.setMakeLatency(100);
+        final GenericObjectPool<String> pool = new GenericObjectPool<String>(
+                factory, new GenericObjectPoolConfig());
+        String s = pool.borrowObject();
+        // First borrow waits on create, so wait time should be at least 100 ms
+        Assert.assertTrue(pool.getMaxBorrowWaitTimeMillis() >= 100);
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() >= 100);
+        pool.returnObject(s);
+        pool.borrowObject();
+        // Second borrow does not have to wait on create, average should be about 50
+        Assert.assertTrue(pool.getMaxBorrowWaitTimeMillis() >= 100);
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() < 60);  
+        Assert.assertTrue(pool.getMeanBorrowWaitTimeMillis() > 40);  
+    }
 
     private static final class DummyFactory
             extends BasePooledObjectFactory<Object> {