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 2017/08/21 21:59:31 UTC

[2/2] httpcomponents-core git commit: Configurable connection pool concurrency policy

Configurable connection pool concurrency policy


Project: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/repo
Commit: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/commit/bf041e34
Tree: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/tree/bf041e34
Diff: http://git-wip-us.apache.org/repos/asf/httpcomponents-core/diff/bf041e34

Branch: refs/heads/master
Commit: bf041e34261bba0691965b64be4375eb0d14ab20
Parents: 2a38fb4
Author: Oleg Kalnichevski <ol...@apache.org>
Authored: Mon Aug 21 21:32:27 2017 +0200
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Mon Aug 21 21:32:27 2017 +0200

----------------------------------------------------------------------
 .../nio/bootstrap/H2RequesterBootstrap.java     | 39 +++++++++++---
 .../impl/bootstrap/AsyncRequesterBootstrap.java | 39 +++++++++++---
 .../http/impl/bootstrap/HttpAsyncRequester.java | 54 +++++++++++++++++++-
 .../http/impl/bootstrap/HttpRequester.java      | 54 +++++++++++++++++++-
 .../http/impl/bootstrap/RequesterBootstrap.java | 36 ++++++++++---
 .../org/apache/hc/core5/pool/LaxConnPool.java   |  6 +--
 .../hc/core5/pool/PoolConcurrencyPolicy.java    | 46 +++++++++++++++++
 .../apache/hc/core5/pool/TestLaxConnPool.java   | 33 +++++-------
 8 files changed, 264 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
----------------------------------------------------------------------
diff --git a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
index 1ef866e..2238f1f 100644
--- a/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
+++ b/httpcore5-h2/src/main/java/org/apache/hc/core5/http2/impl/nio/bootstrap/H2RequesterBootstrap.java
@@ -29,6 +29,7 @@ package org.apache.hc.core5.http2.impl.nio.bootstrap;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.hc.core5.annotation.Experimental;
 import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.function.Supplier;
 import org.apache.hc.core5.http.HttpHost;
@@ -51,6 +52,9 @@ import org.apache.hc.core5.http2.impl.nio.Http2StreamListener;
 import org.apache.hc.core5.http2.nio.support.DefaultAsyncPushConsumerFactory;
 import org.apache.hc.core5.http2.ssl.H2ClientTlsStrategy;
 import org.apache.hc.core5.pool.ConnPoolListener;
+import org.apache.hc.core5.pool.LaxConnPool;
+import org.apache.hc.core5.pool.ManagedConnPool;
+import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
 import org.apache.hc.core5.pool.PoolReusePolicy;
 import org.apache.hc.core5.pool.StrictConnPool;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
@@ -77,6 +81,7 @@ public class H2RequesterBootstrap {
     private int maxTotal;
     private TimeValue timeToLive;
     private PoolReusePolicy poolReusePolicy;
+    private PoolConcurrencyPolicy poolConcurrencyPolicy;
     private TlsStrategy tlsStrategy;
     private Decorator<IOSession> ioSessionDecorator;
     private IOSessionListener sessionListener;
@@ -164,6 +169,15 @@ public class H2RequesterBootstrap {
     }
 
     /**
+     * Assigns {@link PoolConcurrencyPolicy} instance.
+     */
+    @Experimental
+    public final H2RequesterBootstrap setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
+        this.poolConcurrencyPolicy = poolConcurrencyPolicy;
+        return this;
+    }
+
+    /**
      * Assigns {@link TlsStrategy} instance.
      */
     public final H2RequesterBootstrap setTlsStrategy(final TlsStrategy tlsStrategy) {
@@ -250,12 +264,25 @@ public class H2RequesterBootstrap {
     }
 
     public Http2AsyncRequester create() {
-        final StrictConnPool<HttpHost, IOSession> connPool = new StrictConnPool<>(
-                defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
-                maxTotal > 0 ? maxTotal : 50,
-                timeToLive,
-                poolReusePolicy,
-                connPoolListener);
+        final ManagedConnPool<HttpHost, IOSession> connPool;
+        switch (poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
+            case LAX:
+                connPool = new LaxConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+            case STRICT:
+            default:
+                connPool = new StrictConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        maxTotal > 0 ? maxTotal : 50,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+        }
         final RequestHandlerRegistry<Supplier<AsyncPushConsumer>> registry = new RequestHandlerRegistry<>(uriPatternType);
         for (final HandlerEntry<Supplier<AsyncPushConsumer>> entry: pushConsumerList) {
             registry.register(entry.hostname, entry.uriPattern, entry.handler);

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
index 54d5994..ca77d02 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/AsyncRequesterBootstrap.java
@@ -26,6 +26,7 @@
  */
 package org.apache.hc.core5.http.impl.bootstrap;
 
+import org.apache.hc.core5.annotation.Experimental;
 import org.apache.hc.core5.function.Decorator;
 import org.apache.hc.core5.http.ConnectionReuseStrategy;
 import org.apache.hc.core5.http.HttpHost;
@@ -39,6 +40,9 @@ import org.apache.hc.core5.http.nio.ssl.BasicClientTlsStrategy;
 import org.apache.hc.core5.http.nio.ssl.TlsStrategy;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.pool.ConnPoolListener;
+import org.apache.hc.core5.pool.LaxConnPool;
+import org.apache.hc.core5.pool.ManagedConnPool;
+import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
 import org.apache.hc.core5.pool.PoolReusePolicy;
 import org.apache.hc.core5.pool.StrictConnPool;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
@@ -61,6 +65,7 @@ public class AsyncRequesterBootstrap {
     private int maxTotal;
     private Timeout timeToLive;
     private PoolReusePolicy poolReusePolicy;
+    private PoolConcurrencyPolicy poolConcurrencyPolicy;
     private TlsStrategy tlsStrategy;
     private Decorator<IOSession> ioSessionDecorator;
     private IOSessionListener sessionListener;
@@ -138,6 +143,15 @@ public class AsyncRequesterBootstrap {
     }
 
     /**
+     * Assigns {@link PoolConcurrencyPolicy} instance.
+     */
+    @Experimental
+    public final AsyncRequesterBootstrap setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
+        this.poolConcurrencyPolicy = poolConcurrencyPolicy;
+        return this;
+    }
+
+    /**
      * Assigns {@link TlsStrategy} instance.
      */
     public final AsyncRequesterBootstrap setTlsStrategy(final TlsStrategy tlsStrategy) {
@@ -178,12 +192,25 @@ public class AsyncRequesterBootstrap {
     }
 
     public HttpAsyncRequester create() {
-        final StrictConnPool<HttpHost, IOSession> connPool = new StrictConnPool<>(
-                defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
-                maxTotal > 0 ? maxTotal : 50,
-                timeToLive,
-                poolReusePolicy,
-                connPoolListener);
+        final ManagedConnPool<HttpHost, IOSession> connPool;
+        switch (poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
+            case LAX:
+                connPool = new LaxConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+            case STRICT:
+            default:
+                connPool = new StrictConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        maxTotal > 0 ? maxTotal : 50,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+        }
         final ClientHttp1StreamDuplexerFactory streamDuplexerFactory = new ClientHttp1StreamDuplexerFactory(
                 httpProcessor != null ? httpProcessor : HttpProcessors.client(),
                 h1Config != null ? h1Config : H1Config.DEFAULT,

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
index 764ee45..8c37d31 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpAsyncRequester.java
@@ -61,8 +61,10 @@ import org.apache.hc.core5.http.protocol.HttpContext;
 import org.apache.hc.core5.http.protocol.HttpCoreContext;
 import org.apache.hc.core5.io.ShutdownType;
 import org.apache.hc.core5.net.URIAuthority;
+import org.apache.hc.core5.pool.ConnPoolControl;
 import org.apache.hc.core5.pool.ManagedConnPool;
 import org.apache.hc.core5.pool.PoolEntry;
+import org.apache.hc.core5.pool.PoolStats;
 import org.apache.hc.core5.reactor.IOEventHandlerFactory;
 import org.apache.hc.core5.reactor.IOReactorConfig;
 import org.apache.hc.core5.reactor.IOSession;
@@ -74,7 +76,7 @@ import org.apache.hc.core5.util.TimeValue;
 /**
  * @since 5.0
  */
-public class HttpAsyncRequester extends AsyncRequester {
+public class HttpAsyncRequester extends AsyncRequester implements ConnPoolControl<HttpHost> {
 
     private final ManagedConnPool<HttpHost, IOSession> connPool;
     private final TlsStrategy tlsStrategy;
@@ -98,6 +100,56 @@ public class HttpAsyncRequester extends AsyncRequester {
         this.tlsStrategy = tlsStrategy;
     }
 
+    @Override
+    public PoolStats getTotalStats() {
+        return connPool.getTotalStats();
+    }
+
+    @Override
+    public PoolStats getStats(final HttpHost route) {
+        return connPool.getStats(route);
+    }
+
+    @Override
+    public void setMaxTotal(final int max) {
+        connPool.setMaxTotal(max);
+    }
+
+    @Override
+    public int getMaxTotal() {
+        return connPool.getMaxTotal();
+    }
+
+    @Override
+    public void setDefaultMaxPerRoute(final int max) {
+        connPool.setDefaultMaxPerRoute(max);
+    }
+
+    @Override
+    public int getDefaultMaxPerRoute() {
+        return connPool.getDefaultMaxPerRoute();
+    }
+
+    @Override
+    public void setMaxPerRoute(final HttpHost route, final int max) {
+        connPool.setMaxPerRoute(route, max);
+    }
+
+    @Override
+    public int getMaxPerRoute(final HttpHost route) {
+        return connPool.getMaxPerRoute(route);
+    }
+
+    @Override
+    public void closeIdle(final TimeValue idleTime) {
+        connPool.closeIdle(idleTime);
+    }
+
+    @Override
+    public void closeExpired() {
+        connPool.closeExpired();
+    }
+
     public Future<AsyncClientEndpoint> connect(
             final HttpHost host,
             final TimeValue timeout,

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
index 32ba00d..0b8c3ce 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/HttpRequester.java
@@ -68,13 +68,15 @@ import org.apache.hc.core5.net.URIAuthority;
 import org.apache.hc.core5.pool.ConnPoolControl;
 import org.apache.hc.core5.pool.ManagedConnPool;
 import org.apache.hc.core5.pool.PoolEntry;
+import org.apache.hc.core5.pool.PoolStats;
 import org.apache.hc.core5.util.Args;
+import org.apache.hc.core5.util.TimeValue;
 import org.apache.hc.core5.util.Timeout;
 
 /**
  * @since 5.0
  */
-public class HttpRequester implements GracefullyCloseable {
+public class HttpRequester implements ConnPoolControl<HttpHost>, GracefullyCloseable {
 
     private final HttpRequestExecutor requestExecutor;
     private final HttpProcessor httpProcessor;
@@ -99,6 +101,56 @@ public class HttpRequester implements GracefullyCloseable {
         this.sslSocketFactory = sslSocketFactory != null ? sslSocketFactory : (SSLSocketFactory) SSLSocketFactory.getDefault();
     }
 
+    @Override
+    public PoolStats getTotalStats() {
+        return connPool.getTotalStats();
+    }
+
+    @Override
+    public PoolStats getStats(final HttpHost route) {
+        return connPool.getStats(route);
+    }
+
+    @Override
+    public void setMaxTotal(final int max) {
+        connPool.setMaxTotal(max);
+    }
+
+    @Override
+    public int getMaxTotal() {
+        return connPool.getMaxTotal();
+    }
+
+    @Override
+    public void setDefaultMaxPerRoute(final int max) {
+        connPool.setDefaultMaxPerRoute(max);
+    }
+
+    @Override
+    public int getDefaultMaxPerRoute() {
+        return connPool.getDefaultMaxPerRoute();
+    }
+
+    @Override
+    public void setMaxPerRoute(final HttpHost route, final int max) {
+        connPool.setMaxPerRoute(route, max);
+    }
+
+    @Override
+    public int getMaxPerRoute(final HttpHost route) {
+        return connPool.getMaxPerRoute(route);
+    }
+
+    @Override
+    public void closeIdle(final TimeValue idleTime) {
+        connPool.closeIdle(idleTime);
+    }
+
+    @Override
+    public void closeExpired() {
+        connPool.closeExpired();
+    }
+
     public ClassicHttpResponse execute(
             final HttpClientConnection connection,
             final ClassicHttpRequest request,

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
index e7609ca..7a5cebd 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/http/impl/bootstrap/RequesterBootstrap.java
@@ -28,6 +28,7 @@ package org.apache.hc.core5.http.impl.bootstrap;
 
 import javax.net.ssl.SSLSocketFactory;
 
+import org.apache.hc.core5.annotation.Experimental;
 import org.apache.hc.core5.http.ConnectionReuseStrategy;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.config.CharCodingConfig;
@@ -42,6 +43,9 @@ import org.apache.hc.core5.http.io.HttpClientConnection;
 import org.apache.hc.core5.http.io.HttpConnectionFactory;
 import org.apache.hc.core5.http.protocol.HttpProcessor;
 import org.apache.hc.core5.pool.ConnPoolListener;
+import org.apache.hc.core5.pool.LaxConnPool;
+import org.apache.hc.core5.pool.ManagedConnPool;
+import org.apache.hc.core5.pool.PoolConcurrencyPolicy;
 import org.apache.hc.core5.pool.PoolReusePolicy;
 import org.apache.hc.core5.pool.StrictConnPool;
 import org.apache.hc.core5.util.Timeout;
@@ -60,6 +64,7 @@ public class RequesterBootstrap {
     private int maxTotal;
     private Timeout timeToLive;
     private PoolReusePolicy poolReusePolicy;
+    private PoolConcurrencyPolicy poolConcurrencyPolicy;
     private Http1StreamListener streamListener;
     private ConnPoolListener<HttpHost> connPoolListener;
 
@@ -124,6 +129,12 @@ public class RequesterBootstrap {
         return this;
     }
 
+    @Experimental
+    public final RequesterBootstrap setPoolConcurrencyPolicy(final PoolConcurrencyPolicy poolConcurrencyPolicy) {
+        this.poolConcurrencyPolicy = poolConcurrencyPolicy;
+        return this;
+    }
+
     public final RequesterBootstrap setStreamListener(final Http1StreamListener streamListener) {
         this.streamListener = streamListener;
         return this;
@@ -139,12 +150,25 @@ public class RequesterBootstrap {
                 HttpRequestExecutor.DEFAULT_WAIT_FOR_CONTINUE,
                 connReuseStrategy != null ? connReuseStrategy : DefaultConnectionReuseStrategy.INSTANCE,
                 streamListener);
-        final StrictConnPool<HttpHost, HttpClientConnection> connPool = new StrictConnPool<>(
-                defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
-                maxTotal > 0 ? maxTotal : 50,
-                timeToLive,
-                poolReusePolicy,
-                connPoolListener);
+        final ManagedConnPool<HttpHost, HttpClientConnection> connPool;
+        switch (poolConcurrencyPolicy != null ? poolConcurrencyPolicy : PoolConcurrencyPolicy.STRICT) {
+            case LAX:
+                connPool = new LaxConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+            case STRICT:
+            default:
+                connPool = new StrictConnPool<>(
+                        defaultMaxPerRoute > 0 ? defaultMaxPerRoute : 20,
+                        maxTotal > 0 ? maxTotal : 50,
+                        timeToLive,
+                        poolReusePolicy,
+                        connPoolListener);
+                break;
+        }
         return new HttpRequester(
                 requestExecutor,
                 httpProcessor != null ? httpProcessor : HttpProcessors.client(),

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
index 8d197ff..06e2b9f 100644
--- a/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
+++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/LaxConnPool.java
@@ -77,13 +77,11 @@ public class LaxConnPool<T, C extends GracefullyCloseable> implements ManagedCon
      */
     public LaxConnPool(
             final int defaultMaxPerRoute,
-            final int maxTotal,
             final TimeValue timeToLive,
             final PoolReusePolicy policy,
             final ConnPoolListener<T> connPoolListener) {
         super();
         Args.positive(defaultMaxPerRoute, "Max per route value");
-        Args.positive(maxTotal, "Max total value");
         this.timeToLive = TimeValue.defaultsToNegativeOneMillisecond(timeToLive);
         this.connPoolListener = connPoolListener;
         this.policy = policy != null ? policy : PoolReusePolicy.LIFO;
@@ -92,8 +90,8 @@ public class LaxConnPool<T, C extends GracefullyCloseable> implements ManagedCon
         this.defaultMaxPerRoute = defaultMaxPerRoute;
     }
 
-    public LaxConnPool(final int defaultMaxPerRoute, final int maxTotal) {
-        this(defaultMaxPerRoute, maxTotal, TimeValue.NEG_ONE_MILLISECONDS, PoolReusePolicy.LIFO, null);
+    public LaxConnPool(final int defaultMaxPerRoute) {
+        this(defaultMaxPerRoute, TimeValue.NEG_ONE_MILLISECONDS, PoolReusePolicy.LIFO, null);
     }
 
     public boolean isShutdown() {

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/main/java/org/apache/hc/core5/pool/PoolConcurrencyPolicy.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/main/java/org/apache/hc/core5/pool/PoolConcurrencyPolicy.java b/httpcore5/src/main/java/org/apache/hc/core5/pool/PoolConcurrencyPolicy.java
new file mode 100644
index 0000000..01216fd
--- /dev/null
+++ b/httpcore5/src/main/java/org/apache/hc/core5/pool/PoolConcurrencyPolicy.java
@@ -0,0 +1,46 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.hc.core5.pool;
+
+/**
+ * Enumeration of pool concurrency policies
+ *
+ * @since 5.0
+ */
+public enum PoolConcurrencyPolicy {
+
+    /**
+     * Higher concurrency but with lax connection max limit guarantees.
+     */
+    LAX,
+
+    /**
+     * Strict connection max limit guarantees.
+     */
+    STRICT
+
+}

http://git-wip-us.apache.org/repos/asf/httpcomponents-core/blob/bf041e34/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
----------------------------------------------------------------------
diff --git a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
index 5cfc6ea..01207b3 100644
--- a/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
+++ b/httpcore5/src/test/java/org/apache/hc/core5/pool/TestLaxConnPool.java
@@ -42,7 +42,7 @@ public class TestLaxConnPool {
 
     @Test
     public void testEmptyPool() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 10);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         final PoolStats totals = pool.getTotalStats();
         Assert.assertEquals(0, totals.getAvailable());
         Assert.assertEquals(0, totals.getLeased());
@@ -60,12 +60,7 @@ public class TestLaxConnPool {
     @Test
     public void testInvalidConstruction() throws Exception {
         try {
-            new LaxConnPool<String, HttpConnection>(-1, 1);
-            Assert.fail("IllegalArgumentException should have been thrown");
-        } catch (final IllegalArgumentException expected) {
-        }
-        try {
-            new LaxConnPool<String, HttpConnection>(1, -1);
+            new LaxConnPool<String, HttpConnection>(-1);
             Assert.fail("IllegalArgumentException should have been thrown");
         } catch (final IllegalArgumentException expected) {
         }
@@ -77,7 +72,7 @@ public class TestLaxConnPool {
         final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
         final HttpConnection conn3 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 10);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
         final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null);
         final Future<PoolEntry<String, HttpConnection>> future3 = pool.lease("otherhost", null);
@@ -107,7 +102,7 @@ public class TestLaxConnPool {
 
     @Test
     public void testLeaseIllegal() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 10);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         try {
             pool.lease(null, null, Timeout.ZERO_MILLISECONDS, null);
             Assert.fail("IllegalArgumentException should have been thrown");
@@ -122,7 +117,7 @@ public class TestLaxConnPool {
 
     @Test(expected = IllegalStateException.class)
     public void testReleaseUnknownEntry() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         pool.release(new PoolEntry<String, HttpConnection>("somehost"), true);
     }
 
@@ -132,7 +127,7 @@ public class TestLaxConnPool {
         final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
         final HttpConnection conn3 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 10);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         pool.setMaxPerRoute("somehost", 2);
         pool.setMaxPerRoute("otherhost", 1);
 
@@ -209,7 +204,7 @@ public class TestLaxConnPool {
     public void testCreateNewIfExpired() throws Exception {
         final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
 
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
 
@@ -243,7 +238,7 @@ public class TestLaxConnPool {
         final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
         final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
 
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
         final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null);
@@ -285,7 +280,7 @@ public class TestLaxConnPool {
         final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
         final HttpConnection conn2 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
 
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null);
         final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null);
@@ -339,7 +334,7 @@ public class TestLaxConnPool {
     public void testLeaseRequestTimeout() throws Exception {
         final HttpConnection conn1 = Mockito.mock(HttpConnection.class);
 
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(1, 1);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(1);
 
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null, Timeout.ofMillis(0), null);
         final Future<PoolEntry<String, HttpConnection>> future2 = pool.lease("somehost", null, Timeout.ofMillis(0), null);
@@ -362,7 +357,7 @@ public class TestLaxConnPool {
 
     @Test
     public void testLeaseRequestCanceled() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(1, 1);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(1);
 
         final Future<PoolEntry<String, HttpConnection>> future1 = pool.lease("somehost", null, Timeout.ofMillis(0), null);
 
@@ -383,13 +378,13 @@ public class TestLaxConnPool {
 
     @Test(expected=IllegalArgumentException.class)
     public void testGetStatsInvalid() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         pool.getStats(null);
     }
 
     @Test
     public void testSetMaxInvalid() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         try {
             pool.setMaxPerRoute(null, 1);
             Assert.fail("IllegalArgumentException should have been thrown");
@@ -409,7 +404,7 @@ public class TestLaxConnPool {
 
     @Test
     public void testShutdown() throws Exception {
-        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2, 2);
+        final LaxConnPool<String, HttpConnection> pool = new LaxConnPool<>(2);
         pool.shutdown(ShutdownType.GRACEFUL);
         try {
             pool.lease("somehost", null);