You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by du...@apache.org on 2018/07/02 14:31:42 UTC
[incubator-openwhisk] branch master updated: Make HttpUtils
actually use only one connection and harden connection release. (#3818)
This is an automated email from the ASF dual-hosted git repository.
dubeejw pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-openwhisk.git
The following commit(s) were added to refs/heads/master by this push:
new cd91b4f Make HttpUtils actually use only one connection and harden connection release. (#3818)
cd91b4f is described below
commit cd91b4fc024b16b9cc89b1aef77deb494da939e2
Author: Markus Thömmes <ma...@me.com>
AuthorDate: Mon Jul 2 16:31:38 2018 +0200
Make HttpUtils actually use only one connection and harden connection release. (#3818)
When not specifying any ConnectionManager for the HttpClient used by HttpUtils, it defaults to an arbitrary PoolingManager with 5 connections. This can hide subtle bugs in connection management, since we expect it to only have one connection to the specific container, we'll default to the BasicConnectionManager.
Furthermore, there are subtle issues when an entity returned by a HttpRequest is not consumed fully (which could happen if it gets truncated or content-length is not returned correctly). That can cause the ConnectionPool (which shouldn't be there in the first place) to go stale.
We also never closed the entity's stream.
---
.../src/main/scala/whisk/core/containerpool/HttpUtils.scala | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/common/scala/src/main/scala/whisk/core/containerpool/HttpUtils.scala b/common/scala/src/main/scala/whisk/core/containerpool/HttpUtils.scala
index d9bdbdc..4ff205d 100644
--- a/common/scala/src/main/scala/whisk/core/containerpool/HttpUtils.scala
+++ b/common/scala/src/main/scala/whisk/core/containerpool/HttpUtils.scala
@@ -29,17 +29,16 @@ import scala.util.control.NoStackTrace
import scala.util.Failure
import scala.util.Success
import scala.util.Try
-
import org.apache.commons.io.IOUtils
import org.apache.http.HttpHeaders
import org.apache.http.client.config.RequestConfig
import org.apache.http.client.methods.HttpPost
import org.apache.http.client.methods.HttpRequestBase
-import org.apache.http.client.utils.URIBuilder
+import org.apache.http.client.utils.{HttpClientUtils, URIBuilder}
import org.apache.http.conn.HttpHostConnectException
import org.apache.http.entity.StringEntity
import org.apache.http.impl.client.HttpClientBuilder
-import org.apache.http.impl.conn.PoolingHttpClientConnectionManager
+import org.apache.http.impl.conn.{BasicHttpClientConnectionManager, PoolingHttpClientConnectionManager}
import spray.json._
import whisk.common.Logging
import whisk.common.TransactionId
@@ -116,7 +115,8 @@ protected class HttpUtils(hostname: String, timeout: FiniteDuration, maxResponse
Left(NoResponseReceived())
}
- response.close()
+ // Fully consumes the entity and closes the response
+ HttpClientUtils.closeQuietly(response)
containerResponse
} recoverWith {
// The route to target socket as well as the target socket itself may need some time to be available -
@@ -167,7 +167,7 @@ protected class HttpUtils(hostname: String, timeout: FiniteDuration, maxResponse
// Increase max total connections (default is 20)
cm.setMaxTotal(maxConcurrent)
cm
- } else null) //set the Pooling connection manager IFF maxConcurrent > 1
+ } else new BasicHttpClientConnectionManager()) // set the Pooling connection manager IFF maxConcurrent > 1
.useSystemProperties()
.disableAutomaticRetries()
.build