This is an automated email from the ASF dual-hosted git repository.

ocket8888 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git


The following commit(s) were added to refs/heads/master by this push:
     new 38c909644a Traffic Stats: reuse http influx client (#7022)
38c909644a is described below

commit 38c909644af9379394514fa26fb2ea7e1ef99346
Author: Rawlin Peters <[email protected]>
AuthorDate: Mon Aug 15 10:55:34 2022 -0600

    Traffic Stats: reuse http influx client (#7022)
    
    Instead of creating a new http influx client with each request, reuse
    the existing client. This should prevent connection leaks when an old
    client is discarded for a new one but connections are still active on
    the old one (and therefore not closed by the `Close` function).
---
 CHANGELOG.md                   |  3 +++
 traffic_stats/traffic_stats.go | 20 +++++++++++++-------
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 546390a323..24a3bfe533 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,9 @@ The format is based on [Keep a 
Changelog](http://keepachangelog.com/en/1.0.0/).
 ### Added
 - [#6033](https://github.com/apache/trafficcontrol/issues/6033) Added ability 
to assign multiple server capabilities to a server.
 
+### Fixed
+- Traffic Stats: Reuse InfluxDB client handle to prevent potential connection 
leaks
+
 ### Changed
 - Traffic Portal now obscures sensitive text in Delivery Service "Raw Remap" 
fields, private SSL keys, "Header Rewrite" rules, and ILO interface passwords 
by default.
 
diff --git a/traffic_stats/traffic_stats.go b/traffic_stats/traffic_stats.go
index e7562309a3..f6bd3fc2d3 100644
--- a/traffic_stats/traffic_stats.go
+++ b/traffic_stats/traffic_stats.go
@@ -1041,6 +1041,18 @@ func influxConnect(config StartupConfig) (influx.Client, 
error) {
                host := hosts[n]
                hosts = append(hosts[:n], hosts[n+1:]...)
                parsedURL, _ := url.Parse(host.URL)
+               if host.InfluxClient != nil && parsedURL.Scheme == "http" {
+                       // NOTE: closing an http client just closes idle 
connections -- the client can still make new requests
+                       if err := host.InfluxClient.Close(); err != nil {
+                               errorf("closing http influx client: %s", err)
+                       }
+                       _, _, err := host.InfluxClient.Ping(10)
+                       if err != nil {
+                               warnf("pinging InfluxDB: %v", err)
+                               continue
+                       }
+                       return host.InfluxClient, nil
+               }
                if parsedURL.Scheme == "udp" {
                        conf := influx.UDPConfig{
                                Addr: parsedURL.Host,
@@ -1063,12 +1075,6 @@ func influxConnect(config StartupConfig) (influx.Client, 
error) {
                        errorf("An error occurred creating InfluxDB HTTP 
client: %v", err)
                        continue
                }
-               //Close old connections explicitly
-               if host.InfluxClient != nil {
-                       if err := host.InfluxClient.Close(); err != nil {
-                               errorf("closing influx client: %s", err)
-                       }
-               }
                host.InfluxClient = con
                _, _, err = con.Ping(10)
                if err != nil {
@@ -1077,7 +1083,7 @@ func influxConnect(config StartupConfig) (influx.Client, 
error) {
                }
                return con, nil
        }
-       err := errors.New("Could not connect to any of the InfluxDb servers 
defined in the influxUrls config.")
+       err := errors.New("could not connect to any of the InfluxDb servers 
defined in the influxUrls config")
        return nil, err
 }
 

Reply via email to