From d9b98830cfa98f4b5c166d7d01567a6bdc34209e 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 fc4d6622..14ac138c 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 12942a1a..83528b64 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 ba880f15..3fa15a3d 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 942c5eab..0aa413ca 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 8a9fd4ed..6187e4ca 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 87843a42..c98e5c03 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 17dbf1bd..d7a28db7 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 ebb8aa62..18b15826 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 8e8673cf..bf6e9181 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 97e39c14..7974b81d 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 d187fa17..36afee2c 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 1c71cd75..d33e1b9c 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) {