The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6750

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com>
From 634c1c96f6b80bffe6e9eed5617a143690fbca66 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanay...@canonical.com>
Date: Wed, 22 Jan 2020 10:07:39 +0000
Subject: [PATCH] Close http transports since they might keep connections
 around

Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com>
---
 lxd/cluster/gateway.go   |  9 +++++++--
 lxd/cluster/heartbeat.go |  4 +++-
 lxd/cluster/tls.go       | 12 ++++++++++++
 3 files changed, 22 insertions(+), 3 deletions(-)

diff --git a/lxd/cluster/gateway.go b/lxd/cluster/gateway.go
index 5641b632fa..646e8f017a 100644
--- a/lxd/cluster/gateway.go
+++ b/lxd/cluster/gateway.go
@@ -564,6 +564,9 @@ func (g *Gateway) LeaderAddress() (string, error) {
                return "", fmt.Errorf("No raft node known")
        }
 
+       transport, cleanup := tlsTransport(config)
+       defer cleanup()
+
        for _, address := range addresses {
                url := fmt.Sprintf("https://%s%s";, address, databaseEndpoint)
                request, err := http.NewRequest("GET", url, nil)
@@ -572,7 +575,7 @@ func (g *Gateway) LeaderAddress() (string, error) {
                }
                setDqliteVersionHeader(request)
                request = request.WithContext(ctx)
-               client := &http.Client{Transport: 
&http.Transport{TLSClientConfig: config}}
+               client := &http.Client{Transport: transport}
                response, err := client.Do(request)
                if err != nil {
                        logger.Debugf("Failed to fetch leader address from %s", 
address)
@@ -820,7 +823,9 @@ func dqliteNetworkDial(ctx context.Context, addr string, g 
*Gateway, checkLeader
                }
                setDqliteVersionHeader(request)
                request = request.WithContext(ctx)
-               client := &http.Client{Transport: 
&http.Transport{TLSClientConfig: config}}
+               transport, cleanup := tlsTransport(config)
+               defer cleanup()
+               client := &http.Client{Transport: transport}
                response, err := client.Do(request)
                if err != nil {
                        return nil, err
diff --git a/lxd/cluster/heartbeat.go b/lxd/cluster/heartbeat.go
index 27aeb80767..a93092d810 100644
--- a/lxd/cluster/heartbeat.go
+++ b/lxd/cluster/heartbeat.go
@@ -356,8 +356,10 @@ func HeartbeatNode(taskCtx context.Context, address 
string, cert *shared.CertInf
 
        timeout := 2 * time.Second
        url := fmt.Sprintf("https://%s%s";, address, databaseEndpoint)
+       transport, cleanup := tlsTransport(config)
+       defer cleanup()
        client := &http.Client{
-               Transport: &http.Transport{TLSClientConfig: config},
+               Transport: transport,
                Timeout:   timeout,
        }
 
diff --git a/lxd/cluster/tls.go b/lxd/cluster/tls.go
index 6d09ff60ea..04ea9fa4b4 100644
--- a/lxd/cluster/tls.go
+++ b/lxd/cluster/tls.go
@@ -52,3 +52,15 @@ func tlsCheckCert(r *http.Request, info *shared.CertInfo) 
bool {
 
        return r.TLS != nil && trusted
 }
+
+// Return an http.Transport configured using the given configuration and a
+// cleanup function to use to close all connections the transport has been
+// used.
+func tlsTransport(config *tls.Config) (*http.Transport, func()) {
+       transport := &http.Transport{
+               TLSClientConfig:   config,
+               DisableKeepAlives: true,
+               MaxIdleConns:      0,
+       }
+       return transport, transport.CloseIdleConnections
+}
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to