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);