You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2011/08/11 09:46:35 UTC

svn commit: r1156522 - in /httpcomponents/httpclient/branches/conn-mgmt-redesign: httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/ httpclient/src/main/java/org/apache/http/impl/client/ httpclient/src/main/java/org/apache/http/impl/c...

Author: olegk
Date: Thu Aug 11 07:46:35 2011
New Revision: 1156522

URL: http://svn.apache.org/viewvc?rev=1156522&view=rev
Log:
Improved #detach method implementation

Modified:
    httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java
    httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java
    httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java
    httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/ManagedClientConnectionImpl.java
    httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/PoolingClientConnectionManager.java

Modified: httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java?rev=1156522&r1=1156521&r2=1156522&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java (original)
+++ httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/Benchmark.java Thu Aug 11 07:46:35 2011
@@ -48,7 +48,7 @@ public class Benchmark {
 
    public static void main(String[] args) throws Exception {
 
-       String ns = System.getProperty("hc.benchmark.n-requests", "200000");
+       String ns = System.getProperty("hc.benchmark.n-requests", "400000");
        String nc = System.getProperty("hc.benchmark.concurrent", "20");
        String cls = System.getProperty("hc.benchmark.content-len", "2048");
 
@@ -76,12 +76,12 @@ public class Benchmark {
        int port = connector.getLocalPort();
 
        TestHttpAgent[] agents = new TestHttpAgent[] {
-               new TestHttpClient3(),
-               new TestHttpJRE(),
-               new TestHttpCore(),
+//               new TestHttpClient3(),
+//               new TestHttpJRE(),
+//               new TestHttpCore(),
                new TestHttpClient4(),
-               new TestJettyHttpClient(),
-               new TestNingHttpClient()
+//               new TestJettyHttpClient(),
+//               new TestNingHttpClient()
        };
 
        byte[] content = new byte[contentLen];
@@ -99,7 +99,7 @@ public class Benchmark {
                try {
                    agent.init();
                    // Warm up
-                   agent.get(warmup, 5, 500);
+                   agent.get(warmup, 500, 2);
                    // Sleep a little
                    Thread.sleep(5000);
                    System.out.println("=================================");

Modified: httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java?rev=1156522&r1=1156521&r2=1156522&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java (original)
+++ httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient-benchmark/src/main/java/org/apache/http/client/benchmark/TestHttpClient4.java Thu Aug 11 07:46:35 2011
@@ -43,6 +43,7 @@ import org.apache.http.conn.ssl.SSLSocke
 import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.impl.client.DefaultHttpClient;
 import org.apache.http.impl.conn.PoolingClientConnectionManager;
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
 import org.apache.http.params.HttpConnectionParams;
 import org.apache.http.params.HttpParams;
 import org.apache.http.params.HttpProtocolParams;

Modified: httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java?rev=1156522&r1=1156521&r2=1156522&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java (original)
+++ httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/client/AbstractHttpClient.java Thu Aug 11 07:46:35 2011
@@ -254,11 +254,11 @@ public abstract class AbstractHttpClient
     /** The connection backoff strategy. */
     @GuardedBy("this")
     private ConnectionBackoffStrategy connectionBackoffStrategy;
-    
+
     /** The backoff manager. */
     @GuardedBy("this")
     private BackoffManager backoffManager;
-    
+
     /**
      * Creates a new HTTP client.
      *
@@ -373,17 +373,6 @@ public abstract class AbstractHttpClient
         return registry;
     }
 
-    protected BackoffManager createBackoffManager() {
-        return new BackoffManager() {
-            public void backOff(HttpRoute ignored) { }
-            public void probe(HttpRoute ignored) { }
-        };
-    }
-    
-    protected ConnectionBackoffStrategy createConnectionBackoffStrategy() {
-        return new NullBackoffStrategy();
-    }
-
     protected HttpRequestExecutor createRequestExecutor() {
         return new HttpRequestExecutor();
     }
@@ -481,19 +470,16 @@ public abstract class AbstractHttpClient
             supportedAuthSchemes = createAuthSchemeRegistry();
         }
         return supportedAuthSchemes;
-    } 
-    
+    }
+
     public synchronized void setAuthSchemes(final AuthSchemeRegistry authSchemeRegistry) {
         supportedAuthSchemes = authSchemeRegistry;
     }
 
     public synchronized final ConnectionBackoffStrategy getConnectionBackoffStrategy() {
-        if (connectionBackoffStrategy == null) {
-            connectionBackoffStrategy = createConnectionBackoffStrategy();
-        }
         return connectionBackoffStrategy;
     }
-    
+
     public synchronized void setConnectionBackoffStrategy(final ConnectionBackoffStrategy strategy) {
         connectionBackoffStrategy = strategy;
     }
@@ -506,16 +492,13 @@ public abstract class AbstractHttpClient
     }
 
     public synchronized final BackoffManager getBackoffManager() {
-        if (backoffManager == null) {
-            backoffManager = createBackoffManager();
-        }
         return backoffManager;
     }
-    
+
     public synchronized void setBackoffManager(final BackoffManager manager) {
         backoffManager = manager;
     }
-    
+
     public synchronized void setCookieSpecs(final CookieSpecRegistry cookieSpecRegistry) {
         supportedCookieSpecs = cookieSpecRegistry;
     }
@@ -827,6 +810,9 @@ public abstract class AbstractHttpClient
 
         HttpContext execContext = null;
         RequestDirector director = null;
+        ConnectionBackoffStrategy connectionBackoffStrategy = null;
+        BackoffManager backoffManager = null;
+        HttpRoutePlanner httpRoutePlanner = null;
 
         // Initialize the request execution context making copies of
         // all shared objects that are potentially threading unsafe.
@@ -852,36 +838,44 @@ public abstract class AbstractHttpClient
                     getProxyAuthenticationHandler(),
                     getUserTokenHandler(),
                     determineParams(request));
+
+            connectionBackoffStrategy = getConnectionBackoffStrategy();
+            backoffManager = getBackoffManager();
+            httpRoutePlanner = getRoutePlanner();
         }
 
         try {
-            HttpHost targetForRoute = (target != null) ? target
-                    : (HttpHost) determineParams(request).getParameter(
-                            ClientPNames.DEFAULT_HOST);
-            HttpRoute route = getRoutePlanner().determineRoute(targetForRoute, request, execContext);
-            
-            HttpResponse out; 
-            try {
-                out = director.execute(target, request, execContext);
-            } catch (RuntimeException re) {
-                if (getConnectionBackoffStrategy().shouldBackoff(re)) {
-                    getBackoffManager().backOff(route);
+            if (connectionBackoffStrategy != null &&  backoffManager != null) {
+                HttpHost targetForRoute = (target != null) ? target
+                        : (HttpHost) determineParams(request).getParameter(
+                                ClientPNames.DEFAULT_HOST);
+                HttpRoute route = httpRoutePlanner.determineRoute(targetForRoute, request, execContext);
+
+                HttpResponse out;
+                try {
+                    out = director.execute(target, request, execContext);
+                } catch (RuntimeException re) {
+                    if (connectionBackoffStrategy.shouldBackoff(re)) {
+                        backoffManager.backOff(route);
+                    }
+                    throw re;
+                } catch (Exception e) {
+                    if (connectionBackoffStrategy.shouldBackoff(e)) {
+                        backoffManager.backOff(route);
+                    }
+                    if (e instanceof HttpException) throw (HttpException)e;
+                    if (e instanceof IOException) throw (IOException)e;
+                    throw new UndeclaredThrowableException(e);
                 }
-                throw re;
-            } catch (Exception e) {
-                if (getConnectionBackoffStrategy().shouldBackoff(e)) {
-                    getBackoffManager().backOff(route);
+                if (getConnectionBackoffStrategy().shouldBackoff(out)) {
+                    backoffManager.backOff(route);
+                } else {
+                    backoffManager.probe(route);
                 }
-                if (e instanceof HttpException) throw (HttpException)e;
-                if (e instanceof IOException) throw (IOException)e;
-                throw new RuntimeException("unexpected exception", e);
-            }
-            if (getConnectionBackoffStrategy().shouldBackoff(out)) {
-                getBackoffManager().backOff(route);
+                return out;
             } else {
-                getBackoffManager().probe(route);
+                return director.execute(target, request, execContext);
             }
-            return out;
         } catch(HttpException httpException) {
             throw new ClientProtocolException(httpException);
         }
@@ -915,7 +909,7 @@ public abstract class AbstractHttpClient
                 stateHandler,
                 params);
     }
-    
+
     /**
      * @since 4.1
      */

Modified: httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/ManagedClientConnectionImpl.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/ManagedClientConnectionImpl.java?rev=1156522&r1=1156521&r2=1156522&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/ManagedClientConnectionImpl.java (original)
+++ httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/ManagedClientConnectionImpl.java Thu Aug 11 07:46:35 2011
@@ -85,12 +85,10 @@ class ManagedClientConnectionImpl implem
         return this.poolEntry;
     }
 
-    void detach() {
+    HttpPoolEntry detach() {
+        HttpPoolEntry local = this.poolEntry;
         this.poolEntry = null;
-    }
-
-    boolean isDetached() {
-        return this.poolEntry == null;
+        return local;
     }
 
     public ClientConnectionManager getManager() {
@@ -113,6 +111,14 @@ class ManagedClientConnectionImpl implem
         return local.getConnection();
     }
 
+    private HttpPoolEntry ensurePoolEntry() {
+        HttpPoolEntry local = this.poolEntry;
+        if (local == null) {
+            throw new ConnectionShutdownException();
+        }
+        return local;
+    }
+
     public void close() throws IOException {
         OperatedClientConnection conn = getConnection();
         if (conn != null) {
@@ -254,11 +260,8 @@ class ManagedClientConnectionImpl implem
     }
 
     public HttpRoute getRoute() {
-        HttpPoolEntry local = this.poolEntry;
-        if (local == null) {
-            throw new ConnectionShutdownException();
-        }
-        return poolEntry.getEffectiveRoute();
+        HttpPoolEntry local = ensurePoolEntry();
+        return local.getEffectiveRoute();
     }
 
     public void open(
@@ -403,11 +406,13 @@ class ManagedClientConnectionImpl implem
     }
 
     public Object getState() {
-        return this.poolEntry.getState();
+        HttpPoolEntry local = ensurePoolEntry();
+        return local.getState();
     }
 
     public void setState(final Object state) {
-        this.poolEntry.setState(state);
+        HttpPoolEntry local = ensurePoolEntry();
+        local.setState(state);
     }
 
     public void markReusable() {

Modified: httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/PoolingClientConnectionManager.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/PoolingClientConnectionManager.java?rev=1156522&r1=1156521&r2=1156522&view=diff
==============================================================================
--- httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/PoolingClientConnectionManager.java (original)
+++ httpcomponents/httpclient/branches/conn-mgmt-redesign/httpclient/src/main/java/org/apache/http/impl/conn/PoolingClientConnectionManager.java Thu Aug 11 07:46:35 2011
@@ -229,7 +229,7 @@ public class PoolingClientConnectionMana
         }
 
         synchronized (managedConn) {
-            HttpPoolEntry entry = managedConn.getPoolEntry();
+            HttpPoolEntry entry = managedConn.detach();
             if (entry == null) {
                 return;
             }
@@ -255,7 +255,6 @@ public class PoolingClientConnectionMana
                 }
             } finally {
                 this.pool.release(entry, managedConn.isMarkedReusable());
-                managedConn.detach();
             }
             if (this.log.isDebugEnabled()) {
                 this.log.debug("Connection released: " + format(entry) + formatStats(entry.getRoute()));