From cc66b245d0c143ee1026b3b68f58e1937c17e56f Mon Sep 17 00:00:00 2001 From: Ta-Ching Chen Date: Sun, 18 Jun 2017 04:10:54 +0800 Subject: [PATCH] Fix http response body not closed correctly, return immediately on error (#210) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix controller timer handler not return when error occurred * Fix controller not close http response correctly This PR aims to fix controller not close response correctly. Also, I’ve check all over the project there is no more resource leak issues exist after this patch. * Fix controller not return immediately when error occurred * Sort import --- cache/cache.go | 4 ++-- cache/cache_test.go | 8 +++++--- controller/client/client.go | 5 +++++ controller/environmentApi.go | 3 ++- controller/functionApi.go | 2 ++ controller/httpTriggerApi.go | 2 ++ controller/timeTriggerApi.go | 2 ++ controller/watchApi.go | 1 + fission/environment.go | 2 +- kubewatcher/kubewatcher.go | 2 +- poolmgr/client/client.go | 8 ++++---- poolmgr/functionServiceCache_test.go | 2 +- 12 files changed, 28 insertions(+), 13 deletions(-) diff --git a/cache/cache.go b/cache/cache.go index fc4d6622d..14ac138cb 100644 --- a/cache/cache.go +++ b/cache/cache.go @@ -17,10 +17,10 @@ limitations under the License. package cache import ( - "time" - "errors" "fmt" + "time" + "github.com/fission/fission" ) diff --git a/cache/cache_test.go b/cache/cache_test.go index 12942a1a2..83528b643 100644 --- a/cache/cache_test.go +++ b/cache/cache_test.go @@ -16,9 +16,11 @@ limitations under the License. package cache -import "testing" -import "log" -import "time" +import ( + "log" + "testing" + "time" +) func checkErr(err error) { if err != nil { diff --git a/controller/client/client.go b/controller/client/client.go index ba880f158..3fa15a3d7 100644 --- a/controller/client/client.go +++ b/controller/client/client.go @@ -213,6 +213,7 @@ func (c *Client) FunctionList() ([]fission.Function, error) { if err != nil { return nil, err } + defer resp.Body.Close() body, err := c.handleResponse(resp) if err != nil { @@ -320,6 +321,7 @@ func (c *Client) HTTPTriggerList() ([]fission.HTTPTrigger, error) { if err != nil { return nil, err } + defer resp.Body.Close() body, err := c.handleResponse(resp) if err != nil { @@ -427,6 +429,7 @@ func (c *Client) EnvironmentList() ([]fission.Environment, error) { if err != nil { return nil, err } + defer resp.Body.Close() body, err := c.handleResponse(resp) if err != nil { @@ -514,6 +517,7 @@ func (c *Client) WatchList() ([]fission.Watch, error) { if err != nil { return nil, err } + defer resp.Body.Close() body, err := c.handleResponse(resp) if err != nil { @@ -621,6 +625,7 @@ func (c *Client) TimeTriggerList() ([]fission.TimeTrigger, error) { if err != nil { return nil, err } + defer resp.Body.Close() body, err := c.handleResponse(resp) if err != nil { diff --git a/controller/environmentApi.go b/controller/environmentApi.go index 942c5eab7..0aa413ca5 100644 --- a/controller/environmentApi.go +++ b/controller/environmentApi.go @@ -47,8 +47,8 @@ func (api *API) EnvironmentApiCreate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } - defer r.Body.Close() var env fission.Environment err = json.Unmarshal(body, &env) @@ -104,6 +104,7 @@ func (api *API) EnvironmentApiUpdate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var env fission.Environment diff --git a/controller/functionApi.go b/controller/functionApi.go index 8a9fd4ed0..6187e4ca7 100644 --- a/controller/functionApi.go +++ b/controller/functionApi.go @@ -50,6 +50,7 @@ func (api *API) FunctionApiCreate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var f fission.Function @@ -118,6 +119,7 @@ func (api *API) FunctionApiUpdate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var f fission.Function diff --git a/controller/httpTriggerApi.go b/controller/httpTriggerApi.go index 87843a42b..c98e5c032 100644 --- a/controller/httpTriggerApi.go +++ b/controller/httpTriggerApi.go @@ -47,6 +47,7 @@ func (api *API) HTTPTriggerApiCreate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var t fission.HTTPTrigger @@ -116,6 +117,7 @@ func (api *API) HTTPTriggerApiUpdate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var t fission.HTTPTrigger diff --git a/controller/timeTriggerApi.go b/controller/timeTriggerApi.go index 17dbf1bdc..d7a28db76 100644 --- a/controller/timeTriggerApi.go +++ b/controller/timeTriggerApi.go @@ -48,6 +48,7 @@ func (api *API) TimeTriggerApiCreate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var t fission.TimeTrigger @@ -124,6 +125,7 @@ func (api *API) TimeTriggerApiUpdate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var t fission.TimeTrigger diff --git a/controller/watchApi.go b/controller/watchApi.go index ebb8aa62a..18b158263 100644 --- a/controller/watchApi.go +++ b/controller/watchApi.go @@ -47,6 +47,7 @@ func (api *API) WatchApiCreate(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { api.respondWithError(w, err) + return } var watch fission.Watch diff --git a/fission/environment.go b/fission/environment.go index 8e8673cf6..bf6e91813 100644 --- a/fission/environment.go +++ b/fission/environment.go @@ -18,12 +18,12 @@ package main import ( "fmt" + "os" "text/tabwriter" "github.com/urfave/cli" "github.com/fission/fission" - "os" ) func envCreate(c *cli.Context) error { diff --git a/kubewatcher/kubewatcher.go b/kubewatcher/kubewatcher.go index 97e39c148..7974b81d5 100644 --- a/kubewatcher/kubewatcher.go +++ b/kubewatcher/kubewatcher.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "log" + "reflect" "strings" "sync/atomic" "time" @@ -36,7 +37,6 @@ import ( "github.com/fission/fission" "github.com/fission/fission/publisher" - "reflect" ) type requestType int diff --git a/poolmgr/client/client.go b/poolmgr/client/client.go index d187fa170..36afee2cd 100644 --- a/poolmgr/client/client.go +++ b/poolmgr/client/client.go @@ -17,14 +17,14 @@ limitations under the License. package client import ( - "net/http" - "strings" - "bytes" "encoding/json" - "github.com/fission/fission" "io/ioutil" + "net/http" "net/url" + "strings" + + "github.com/fission/fission" ) type Client struct { diff --git a/poolmgr/functionServiceCache_test.go b/poolmgr/functionServiceCache_test.go index 1c71cd753..d33e1b9c2 100644 --- a/poolmgr/functionServiceCache_test.go +++ b/poolmgr/functionServiceCache_test.go @@ -3,9 +3,9 @@ package poolmgr import ( "log" "testing" + "time" "github.com/fission/fission" - "time" ) func TestFunctionServiceCache(t *testing.T) {