You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by jo...@apache.org on 2011/06/24 21:54:10 UTC

svn commit: r1139419 - in /httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src: main/java/org/apache/http/impl/client/ main/java/org/apache/http/impl/conn/tsccm/ test/java/org/apache/http/impl/client/

Author: jonm
Date: Fri Jun 24 19:54:09 2011
New Revision: 1139419

URL: http://svn.apache.org/viewvc?rev=1139419&view=rev
Log:
HTTPCLIENT-1101: A few changes resulting from using this in a proof-of-concept
with actual client and server applications. (1) support for separate cooldowns
for probes and backoffs, to allow for backing off immediately after a probe
that went too high; (2) ConnPoolByRoute should also close a connection if the
max pool size for the route has dropped below current usage, otherwise the
backoff doesn't work with persistent connections. This is basically working;
I'll have to write up some documentation for how to use it, then I'll merge it
down into the trunk.

Modified:
    httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/client/AIMDBackoffManager.java
    httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.java
    httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/test/java/org/apache/http/impl/client/TestAIMDBackoffManager.java

Modified: httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/client/AIMDBackoffManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/client/AIMDBackoffManager.java?rev=1139419&r1=1139418&r2=1139419&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/client/AIMDBackoffManager.java (original)
+++ httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/client/AIMDBackoffManager.java Fri Jun 24 19:54:09 2011
@@ -21,8 +21,11 @@ public class AIMDBackoffManager implemen
     private long coolDown = 5 * 1000L;
     private double backoffFactor = 0.5;
     private int cap = ConnPerRouteBean.DEFAULT_MAX_CONNECTIONS_PER_ROUTE;
-    private Map<HttpRoute,Long> lastRouteUpdates =
+    private Map<HttpRoute,Long> lastRouteProbes =
         new HashMap<HttpRoute,Long>();
+    private Map<HttpRoute,Long> lastRouteBackoffs =
+        new HashMap<HttpRoute,Long>();
+
     
     /**
      * Creates an <code>AIMDBackoffManager</code> to manage
@@ -43,7 +46,11 @@ public class AIMDBackoffManager implemen
     public void backOff(HttpRoute route) {
         synchronized(connPerRoute) {
             int curr = connPerRoute.getMaxForRoute(route);
-            setNewMaxIfCooledDown(route, getBackedOffPoolSize(curr));
+            Long lastUpdate = getLastUpdate(lastRouteBackoffs, route);
+            long now = clock.getCurrentTime();
+            if (now - lastUpdate < coolDown) return;
+            connPerRoute.setMaxForRoute(route, getBackedOffPoolSize(curr));
+            lastRouteBackoffs.put(route, now);
         }
     }
 
@@ -56,24 +63,22 @@ public class AIMDBackoffManager implemen
         synchronized(connPerRoute) {
             int curr = connPerRoute.getMaxForRoute(route);
             int max = (curr >= cap) ? cap : curr + 1; 
-            setNewMaxIfCooledDown(route, max);
+            Long lastProbe = getLastUpdate(lastRouteProbes, route);
+            Long lastBackoff = getLastUpdate(lastRouteBackoffs, route);
+            long now = clock.getCurrentTime();
+            if (now - lastProbe < coolDown || now - lastBackoff < coolDown)
+                return; 
+            connPerRoute.setMaxForRoute(route, max);
+            lastRouteProbes.put(route, now);
         }
     }
 
-    private Long getLastUpdate(HttpRoute route) {
-        Long lastUpdate = lastRouteUpdates.get(route);
+    private Long getLastUpdate(Map<HttpRoute,Long> updates, HttpRoute route) {
+        Long lastUpdate = updates.get(route);
         if (lastUpdate == null) lastUpdate = 0L;
         return lastUpdate;
     }
 
-    private void setNewMaxIfCooledDown(HttpRoute route, int max) {
-        Long lastUpdate = getLastUpdate(route);
-        long now = clock.getCurrentTime();
-        if (now - lastUpdate < coolDown) return;
-        connPerRoute.setMaxForRoute(route, max);
-        lastRouteUpdates.put(route, now);
-    }
-
     /**
      * Sets the factor to use when backing off; the new
      * per-host limit will be roughly, the current max times

Modified: httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.java?rev=1139419&r1=1139418&r2=1139419&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.java (original)
+++ httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/main/java/org/apache/http/impl/conn/tsccm/ConnPoolByRoute.java Fri Jun 24 19:54:09 2011
@@ -449,7 +449,7 @@ public class ConnPoolByRoute extends Abs
 
             RouteSpecificPool rospl = getRoutePool(route, true);
 
-            if (reusable) {
+            if (reusable && rospl.getCapacity() >= 0) {
                 if (log.isDebugEnabled()) {
                     String s;
                     if (validDuration > 0) {

Modified: httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/test/java/org/apache/http/impl/client/TestAIMDBackoffManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/test/java/org/apache/http/impl/client/TestAIMDBackoffManager.java?rev=1139419&r1=1139418&r2=1139419&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/test/java/org/apache/http/impl/client/TestAIMDBackoffManager.java (original)
+++ httpcomponents/httpclient/branches/trunk-adaptive-connpool/httpclient/src/test/java/org/apache/http/impl/client/TestAIMDBackoffManager.java Fri Jun 24 19:54:09 2011
@@ -112,6 +112,18 @@ public class TestAIMDBackoffManager {
     }
     
     @Test
+    public void willBackoffImmediatelyEvenAfterAProbe() {
+        connPerRoute.setMaxForRoute(route, 8);
+        long now = System.currentTimeMillis();
+        clock.setCurrentTime(now);
+        impl.probe(route);
+        long max = connPerRoute.getMaxForRoute(route);
+        clock.setCurrentTime(now + 1);
+        impl.backOff(route);
+        assertTrue(connPerRoute.getMaxForRoute(route) < max);
+    }
+    
+    @Test
     public void backOffFactorIsConfigurable() {
         connPerRoute.setMaxForRoute(route, 10);
         impl.setBackoffFactor(0.9);