api: use `cleanhttp.DefaultPooledTransport` for default API client (#12492)

We expect every Nomad API client to use a single connection to any
given agent, so take advantage of keep-alive by switching the default
transport to `DefaultPooledClient`. Provide a facility to close idle
connections for testing purposes.

Restores the previously reverted #12409


Co-authored-by: Ben Buzbee <bbuzbee@cloudflare.com>
This commit is contained in:
Tim Gross 2022-04-06 16:14:53 -04:00 committed by GitHub
parent 0b13ea6920
commit 1724765096
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 1 deletions

3
.changelog/12492.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:improvement
api: default to using `DefaultPooledTransport` client to support keep-alive by default
```

View File

@ -264,7 +264,7 @@ func (t *TLSConfig) Copy() *TLSConfig {
}
func defaultHttpClient() *http.Client {
httpClient := cleanhttp.DefaultClient()
httpClient := cleanhttp.DefaultPooledClient()
transport := httpClient.Transport.(*http.Transport)
transport.TLSHandshakeTimeout = 10 * time.Second
transport.TLSClientConfig = &tls.Config{
@ -476,6 +476,18 @@ func NewClient(config *Config) (*Client, error) {
return client, nil
}
// Close closes the client's idle keep-alived connections. The default
// client configuration uses keep-alive to maintain connections and
// you should instantiate a single Client and reuse it for all
// requests from the same host. Connections will be closed
// automatically once the client is garbage collected. If you are
// creating multiple clients on the same host (for example, for
// testing), it may be useful to call Close() to avoid hitting
// connection limits.
func (c *Client) Close() {
c.httpClient.CloseIdleConnections()
}
// Address return the address of the Nomad agent
func (c *Client) Address() string {
return c.config.Address

View File

@ -1113,6 +1113,8 @@ func TestHTTPServer_Limits_OK(t *testing.T) {
conf.Address = a.HTTPAddr()
conf.TLSConfig.Insecure = true
client, err := api.NewClient(conf)
defer client.Close()
require.NoError(t, err)
// Assert a blocking query isn't timed out by the