From 01028d0a091b6af704cb1dbc46732a5edeb6964e Mon Sep 17 00:00:00 2001 From: "Thibault \"bui\" Koechlin" Date: Fri, 30 Jul 2021 11:41:17 +0200 Subject: [PATCH] Goroutine leak hunt (#874) * close the writers of gin loggers + kill the tomb of httpServer * body close defer --- pkg/apiclient/client.go | 1 - pkg/apiclient/client_http.go | 4 +++- pkg/apiserver/apiserver.go | 18 +++++++++++++----- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/pkg/apiclient/client.go b/pkg/apiclient/client.go index f0bd5ba56..3a64bb46a 100644 --- a/pkg/apiclient/client.go +++ b/pkg/apiclient/client.go @@ -119,7 +119,6 @@ func (e *ErrorResponse) Error() string { func newResponse(r *http.Response) *Response { response := &Response{Response: r} - //response.populatePageValues() return response } diff --git a/pkg/apiclient/client_http.go b/pkg/apiclient/client_http.go index 2b9049d90..9ef3c5566 100644 --- a/pkg/apiclient/client_http.go +++ b/pkg/apiclient/client_http.go @@ -57,7 +57,9 @@ func (c *ApiClient) Do(ctx context.Context, req *http.Request, v interface{}) (* } resp, err := c.client.Do(req) - + if resp != nil && resp.Body != nil { + defer resp.Body.Close() + } if err != nil { // If we got an error, and the context has been canceled, // the context's error is probably more useful. diff --git a/pkg/apiserver/apiserver.go b/pkg/apiserver/apiserver.go index f386d1109..0cf553b8b 100644 --- a/pkg/apiserver/apiserver.go +++ b/pkg/apiserver/apiserver.go @@ -3,6 +3,7 @@ package apiserver import ( "context" "fmt" + "io" "net" "net/http" "os" @@ -252,11 +253,6 @@ func (s *APIServer) Run() error { } }() <-s.httpServerTomb.Dying() - log.Infof("run: shutting down api server") - if err := s.Shutdown(); err != nil { - log.Errorf("while shutting down API Server : %s", err) - return err - } return nil }) @@ -278,5 +274,17 @@ func (s *APIServer) Shutdown() error { if err := s.httpServer.Shutdown(context.TODO()); err != nil { return err } + + //close io.writer logger given to gin + if pipe, ok := gin.DefaultErrorWriter.(*io.PipeWriter); ok { + pipe.Close() + } + if pipe, ok := gin.DefaultWriter.(*io.PipeWriter); ok { + pipe.Close() + } + s.httpServerTomb.Kill(nil) + if err := s.httpServerTomb.Wait(); err != nil { + return errors.Wrap(err, "while waiting on httpServerTomb") + } return nil }