From 59b22379a693d1fc15b4b77e58e47bac89e62660 Mon Sep 17 00:00:00 2001 From: radhika Date: Wed, 4 Nov 2015 11:34:35 -0500 Subject: [PATCH] 5538: close any idle connections before a POST or DELETE request. --- sdk/go/arvadosclient/arvadosclient.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/sdk/go/arvadosclient/arvadosclient.go b/sdk/go/arvadosclient/arvadosclient.go index 1cce0a7fc9..1bc6f80f2c 100644 --- a/sdk/go/arvadosclient/arvadosclient.go +++ b/sdk/go/arvadosclient/arvadosclient.go @@ -14,6 +14,7 @@ import ( "os" "regexp" "strings" + "time" ) type StringMatcher func(string) bool @@ -25,6 +26,9 @@ var MissingArvadosApiHost = errors.New("Missing required environment variable AR var MissingArvadosApiToken = errors.New("Missing required environment variable ARVADOS_API_TOKEN") var ErrInvalidArgument = errors.New("Invalid argument") +// Before a POST or DELERE request, close any connections that were idle for this long +var MaxIdleConnectionDuration = 30 * time.Second + // Indicates an error that was returned by the API server. type APIServerError struct { // Address of server returning error, of the form "host:port". @@ -76,6 +80,8 @@ type ArvadosClient struct { // Discovery document DiscoveryDoc Dict + + lastClosedIdlesAt time.Time } // Create a new ArvadosClient, initialized with standard Arvados environment @@ -101,6 +107,8 @@ func MakeArvadosClient() (ac ArvadosClient, err error) { return ac, MissingArvadosApiToken } + ac.lastClosedIdlesAt = time.Now() + return ac, err } @@ -158,6 +166,14 @@ func (c ArvadosClient) CallRaw(method string, resourceType string, uuid string, req.Header.Add("X-External-Client", "1") } + // Before a POST or DELETE, close any idle connections + if method == "POST" || method == "DELETE" { + if time.Since(c.lastClosedIdlesAt) > MaxIdleConnectionDuration { + c.lastClosedIdlesAt = time.Now() + c.Client.Transport.(*http.Transport).CloseIdleConnections() + } + } + // Make the request var resp *http.Response if resp, err = c.Client.Do(req); err != nil { -- 2.30.2