Skip to content

Commit d606558

Browse files
author
Mikhail Podtserkovskiy
committed
fixes
- gometalinter warnings: part 1 - memory leaks in selenium and wda clients
1 parent 41c02ee commit d606558

File tree

25 files changed

+250
-289
lines changed

25 files changed

+250
-289
lines changed

handlers/apiProxy.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ import (
88
"github.com/qa-dev/jsonwire-grid/pool"
99
)
1010

11-
type ApiProxy struct {
11+
type APIProxy struct {
1212
Pool *pool.Pool
1313
}
1414

15-
func (h *ApiProxy) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
15+
func (h *APIProxy) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
1616
rw.Header().Add("Content-type", "application/json")
1717

1818
id := r.URL.Query().Get("id")
19-
nodeUrl, err := url.Parse(id) //todo: обработка ошибок
19+
nodeURL, err := url.Parse(id) //todo: обработка ошибок
2020

2121
if err != nil {
2222
errorMessage := "Error get 'id' from url: " + r.URL.String()
@@ -25,17 +25,17 @@ func (h *ApiProxy) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
2525
return
2626
}
2727

28-
node, err := h.Pool.GetNodeByAddress(nodeUrl.Host)
28+
_, err = h.Pool.GetNodeByAddress(nodeURL.Host)
2929

3030
//todo: хардкод для ткста, сделать нормальный респонз обжекты
31-
if node == nil || err != nil {
32-
errorMessage := "api/proxy: Can't get node"
33-
if err != nil {
34-
errorMessage = err.Error()
35-
log.Warning(errorMessage)
36-
}
37-
rw.Write([]byte(`{"msg": "Cannot find proxy with ID =` + id + ` in the registry: ` + errorMessage + `", "success": false}`))
31+
if err != nil {
32+
errorMessage := "api/proxy: Can't get node, " + err.Error()
33+
log.Warning(errorMessage)
34+
_, err = rw.Write([]byte(`{"msg": "Cannot find proxy with ID =` + id + ` in the registry: ` + errorMessage + `", "success": false}`))
3835
} else {
39-
rw.Write([]byte(`{"id": "", "request": {}, "msg": "proxy found !", "success": true}`))
36+
_, err = rw.Write([]byte(`{"id": "", "request": {}, "msg": "proxy found !", "success": true}`))
37+
}
38+
if err != nil {
39+
log.Errorf("api/proxy: write response, %v", err)
4040
}
4141
}

handlers/createSession.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@ func (h *CreateSession) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
3535
}
3636
err = r.Body.Close()
3737
if err != nil {
38-
log.Error(err.Error())
39-
http.Error(rw, err.Error(), http.StatusInternalServerError)
40-
return
38+
log.Errorf("create/session: close request body, %v", err)
4139
}
4240
rc := ioutil.NopCloser(bytes.NewReader(body))
4341
r.Body = rc
@@ -63,7 +61,10 @@ func (h *CreateSession) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
6361
return
6462
}
6563
rw.WriteHeader(tw.StatusCode)
66-
rw.Write(tw.Output)
64+
_, err = rw.Write(tw.Output)
65+
if err != nil {
66+
log.Errorf("create/session: write response, %v", err)
67+
}
6768
}
6869

6970
func (h *CreateSession) tryCreateSession(r *http.Request, capabilities *capabilities.Capabilities) (*proxy.ResponseWriter, error) {

handlers/registerNode.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ func (h *RegisterNode) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
2424
http.Error(rw, errorMessage, http.StatusInternalServerError)
2525
return
2626
}
27-
r.Body.Close()
27+
err = r.Body.Close()
28+
if err != nil {
29+
log.Errorf("register/node: close request body, %v", err)
30+
}
2831
var register jsonwire.Register
2932
err = json.Unmarshal(body, &register)
3033
if err != nil {
@@ -59,5 +62,8 @@ func (h *RegisterNode) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
5962
}
6063

6164
rw.WriteHeader(http.StatusOK)
62-
rw.Write([]byte("ok"))
65+
_, err = rw.Write([]byte("ok"))
66+
if err != nil {
67+
log.Errorf("register/node: write response, %v", err)
68+
}
6369
}

handlers/useSession.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,17 @@ type UseSession struct {
1616

1717
func (h *UseSession) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
1818
re := regexp.MustCompile(".*/session/([^/]+)(?:/([^/]+))?")
19-
parsedUrl := re.FindStringSubmatch(r.URL.Path)
20-
if len(parsedUrl) != 3 {
19+
parsedURL := re.FindStringSubmatch(r.URL.Path)
20+
if len(parsedURL) != 3 {
2121
errorMessage := "url [" + r.URL.Path + "] parsing error"
2222
log.Infof(errorMessage)
2323
http.Error(rw, errorMessage, http.StatusBadRequest)
2424
return
2525
}
26-
sessionId := re.FindStringSubmatch(r.URL.Path)[1]
27-
targetNode, err := h.Pool.GetNodeBySessionId(sessionId)
28-
if targetNode == nil || err != nil {
29-
errorMessage := ""
30-
if err != nil {
31-
errorMessage = err.Error()
32-
}
33-
// посылаем сообщение о том что сессия не найдена
34-
errorMessage = "session " + sessionId + " not found in node pool: " + errorMessage
26+
sessionID := re.FindStringSubmatch(r.URL.Path)[1]
27+
targetNode, err := h.Pool.GetNodeBySessionID(sessionID)
28+
if err != nil {
29+
errorMessage := "session " + sessionID + " not found in node pool: " + err.Error()
3530
log.Infof(errorMessage)
3631
http.Error(rw, errorMessage, http.StatusNotFound)
3732
return
@@ -44,7 +39,7 @@ func (h *UseSession) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
4439
proxy.ServeHTTP(rw, r)
4540

4641
//// todo: заговнокодим пока не появилось понимание как лучше сделать ибо сраный rest
47-
if parsedUrl[2] == "" && r.Method == http.MethodDelete {
42+
if parsedURL[2] == "" && r.Method == http.MethodDelete {
4843
err := h.Pool.CleanUpNode(targetNode)
4944
if err != nil {
5045
log.Error("Clanup node status error: " + err.Error())

jsonwire/interfaces.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ type ClientFactoryInterface interface {
77
type ClientInterface interface {
88
Status() (*Message, error)
99
Sessions() (*Sessions, error)
10-
CloseSession(sessionId string) (*Message, error)
10+
CloseSession(sessionID string) (*Message, error)
1111
Address() string
1212
}
1313

jsonwire/jsonwire.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,22 @@ import (
55
)
66

77
type Message struct {
8-
SessionId string `json:"sessionId"`
8+
SessionID string `json:"sessionId"`
99
Status int `json:"status"`
1010
Value interface{} `json:"value"`
1111
}
1212

1313
type NewSession struct {
1414
Message
1515
Value struct {
16-
SessionId string `json:"sessionId"`
16+
SessionID string `json:"sessionId"`
1717
} `json:"value"`
1818
}
1919

2020
type Sessions struct {
2121
Message
2222
Value []struct {
23-
Id string `json:"id"`
23+
ID string `json:"id"`
2424
Capabilities json.RawMessage `json:"capabilities"`
2525
} `json:"value"`
2626
}
@@ -44,12 +44,12 @@ type Configuration struct {
4444
HubHost string
4545
RegisterCycle int
4646
HubPort int
47-
Url string
47+
URL string
4848
Register bool
4949
CapabilitiesList []Capabilities `json:"capabilities"` // selenium 2
5050
}
5151

52-
type ApiProxy struct {
52+
type APIProxy struct {
5353
ID string `json:"id"`
5454
Request interface{} `json:"request"` //todo: пока не ясно зачем он нужен
5555
Msg string `json:"msg"`

jsonwire/mocks.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ func (c *ClientMock) Sessions() (*Sessions, error) {
2727
return args.Get(0).(*Sessions), args.Error(1)
2828
}
2929

30-
func (c *ClientMock) CloseSession(sessionId string) (*Message, error) {
31-
args := c.Called(sessionId)
30+
func (c *ClientMock) CloseSession(sessionID string) (*Message, error) {
31+
args := c.Called(sessionID)
3232
return args.Get(0).(*Message), args.Error(1)
3333
}
3434

jsonwire/node.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package jsonwire
22

33
import (
4-
"errors"
54
"fmt"
65
)
76

@@ -16,27 +15,23 @@ func NewNode(abstractClient ClientInterface) *Node {
1615
func (n *Node) RemoveAllSessions() (int, error) {
1716
message, err := n.client.Sessions()
1817
if err != nil {
19-
err = errors.New(fmt.Sprintf("Can't get sessions, %s", err.Error()))
20-
return 0, err
18+
return 0, fmt.Errorf("Can't get sessions, %s", err.Error())
2119
}
2220
if message.Status != 0 {
23-
err = errors.New(fmt.Sprintf("client.Sessions: Not succcess response status node, %s", n.client.Address()))
24-
return 0, err
21+
return 0, fmt.Errorf("client.Sessions: Not succcess response status node, %s", n.client.Address())
2522
}
2623
// hasn't sessions
2724
countSessions := len(message.Value)
2825
if countSessions == 0 {
2926
return 0, nil
3027
}
3128
for _, session := range message.Value {
32-
message, err := n.client.CloseSession(session.Id)
29+
message, err := n.client.CloseSession(session.ID)
3330
if err != nil {
34-
err = errors.New(fmt.Sprintf("Can't close session[%s], %s", session.Id, err.Error()))
35-
return 0, err
31+
return 0, fmt.Errorf("Can't close session[%s], %s", session.ID, err.Error())
3632
}
3733
if message.Status != 0 {
38-
err = errors.New(fmt.Sprintf("client.CloseSession[%s]: Not succcess response node, %s", session.Id, n.client.Address()))
39-
return 0, err
34+
return 0, fmt.Errorf("client.CloseSession[%s]: Not succcess response node, %s", session.ID, n.client.Address())
4035
}
4136
}
4237
return countSessions, nil

jsonwire/response.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@ import (
88
type ResponseStatus int
99

1010
const (
11-
RESPONSE_STATUS_SUCCESS ResponseStatus = 0
12-
RESPONSE_STATUS_UNKNOWN_ERR ResponseStatus = 13
11+
ResponseStatusSuccess ResponseStatus = 0
12+
ResponseStatusUnknownErr ResponseStatus = 13
1313
)
1414

1515
type Response struct {
16-
SessionId *string `json:"sessionId"`
16+
SessionID *string `json:"sessionId"`
1717
Status ResponseStatus `json:"status"`
1818
Value json.RawMessage `json:"value"`
1919
}
2020

21-
func NewResponse(sessionId *string, status ResponseStatus, value json.RawMessage) *Response {
22-
return &Response{sessionId, status, value}
21+
func NewResponse(sessionID *string, status ResponseStatus, value json.RawMessage) *Response {
22+
return &Response{sessionID, status, value}
2323
}
2424

25-
func JsonResponse(w http.ResponseWriter, data Response, code int) (int, error) {
25+
func JSONResponse(w http.ResponseWriter, data Response, code int) (int, error) {
2626
w.Header().Set("Content-Type", "application/json; charset=utf-8")
2727
w.WriteHeader(code)
2828

main.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,22 +81,21 @@ func main() {
8181
poolInstance.SetBusyNodeDuration(busyNodeDuration)
8282
poolInstance.SetReservedNodeDuration(reservedNodeDuration)
8383

84-
//todo: сделать конфиг для пула, вынести duration туда
85-
poolMetricsSender := poolMetrics.NewSender(statsdClient, poolInstance, time.Second*1) //todo: вынести в конфиг
84+
poolMetricsSender := poolMetrics.NewSender(statsdClient, poolInstance, time.Second*1) // todo: move to config
8685
go poolMetricsSender.SendAll()
8786

8887
go func() {
8988
for {
9089
poolInstance.FixNodeStatuses()
91-
time.Sleep(time.Minute * 5) // todo: вынести в конфиг
90+
time.Sleep(time.Minute * 5) // todo: move to config
9291
}
9392
}()
9493

9594
m := middleware.NewLogMiddleware(statsdClient)
9695
http.Handle("/wd/hub/session", m.Log(&handlers.CreateSession{Pool: poolInstance, ClientFactory: clientFactory})) //selenium
9796
http.Handle("/session", m.Log(&handlers.CreateSession{Pool: poolInstance, ClientFactory: clientFactory})) //wda
9897
http.Handle("/grid/register", m.Log(&handlers.RegisterNode{Pool: poolInstance}))
99-
http.Handle("/grid/api/proxy", &handlers.ApiProxy{Pool: poolInstance})
98+
http.Handle("/grid/api/proxy", &handlers.APIProxy{Pool: poolInstance})
10099
http.HandleFunc("/_info", heartbeat)
101100
http.Handle("/", m.Log(&handlers.UseSession{Pool: poolInstance}))
102101

@@ -118,15 +117,21 @@ func main() {
118117

119118
log.Info("Shutting down the server...")
120119

121-
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) // todo: вынести в конфиг
120+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) // todo: move to config
122121
defer cancel()
123-
server.Shutdown(ctx)
122+
err = server.Shutdown(ctx)
123+
if err != nil {
124+
log.Fatalf("graceful shutdown, %v", err)
125+
}
124126

125127
log.Info("Server gracefully stopped")
126128
}
127129

128130
func heartbeat(w http.ResponseWriter, r *http.Request) {
129131
w.Header().Set("Content-Type", "application/json; charset=utf-8")
130132
w.WriteHeader(http.StatusOK)
131-
w.Write([]byte(`{"result": {"ok": true}}`))
133+
_, err := w.Write([]byte(`{"result": {"ok": true}}`))
134+
if err != nil {
135+
log.Errorf("write response, %v", err)
136+
}
132137
}

pool/mocks.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ func (s *StorageMock) ReserveAvailable(nodeList []Node) (Node, error) {
1919
return args.Get(0).(Node), args.Error(1)
2020
}
2121

22-
func (s *StorageMock) SetBusy(node Node, sessionId string) error {
23-
args := s.Called(node, sessionId)
22+
func (s *StorageMock) SetBusy(node Node, sessionID string) error {
23+
args := s.Called(node, sessionID)
2424
return args.Error(0)
2525
}
2626

@@ -34,8 +34,8 @@ func (s *StorageMock) GetCountWithStatus(nodeStatus *NodeStatus) (int, error) {
3434
return args.Int(0), args.Error(1)
3535
}
3636

37-
func (s *StorageMock) GetBySession(sessionId string) (Node, error) {
38-
args := s.Called(sessionId)
37+
func (s *StorageMock) GetBySession(sessionID string) (Node, error) {
38+
args := s.Called(sessionID)
3939
return args.Get(0).(Node), args.Error(1)
4040
}
4141

pool/pool.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ func (p *Pool) GetAll() ([]Node, error) {
8383
return p.storage.GetAll()
8484
}
8585

86-
func (p *Pool) GetNodeBySessionId(sessionId string) (*Node, error) {
87-
node, err := p.storage.GetBySession(sessionId)
86+
func (p *Pool) GetNodeBySessionID(sessionID string) (*Node, error) {
87+
node, err := p.storage.GetBySession(sessionID)
8888
if err != nil {
89-
err = errors.New(fmt.Sprintf("Can't find node by session[%s], %s", sessionId, err.Error()))
89+
err = fmt.Errorf("Can't find node by session[%s], %s", sessionID, err.Error())
9090
log.Error(err)
9191
return nil, err
9292
}
@@ -96,7 +96,7 @@ func (p *Pool) GetNodeBySessionId(sessionId string) (*Node, error) {
9696
func (p *Pool) GetNodeByAddress(address string) (*Node, error) {
9797
node, err := p.storage.GetByAddress(address)
9898
if err != nil {
99-
err = errors.New(fmt.Sprintf("Can't find node by address[%s], %s", address, err.Error()))
99+
err = fmt.Errorf("Can't find node by address[%s], %s", address, err.Error())
100100
log.Error(err)
101101
return nil, err
102102
}
@@ -153,7 +153,7 @@ func (p *Pool) FixNodeStatuses() {
153153
}
154154

155155
func (p *Pool) fixNodeStatus(node *Node) (bool, error) {
156-
nodeStatusDuration := time.Since(time.Unix(int64(node.Updated), 0))
156+
nodeStatusDuration := time.Since(time.Unix(node.Updated, 0))
157157
switch node.Status {
158158
case NodeStatusReserved:
159159
if nodeStatusDuration < p.reservedNodeDuration {
@@ -168,7 +168,7 @@ func (p *Pool) fixNodeStatus(node *Node) (bool, error) {
168168
}
169169
err := p.strategyList.FixNodeStatus(*node)
170170
if err != nil {
171-
return false, errors.New(fmt.Sprintf("Can't fix node [%s] status, %s", node.Address, err.Error()))
171+
return false, fmt.Errorf("Can't fix node [%s] status, %s", node.Address, err.Error())
172172
}
173173
return true, nil
174174
}

pool/pool_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func TestPool_GetNodeBySessionId_Positive(t *testing.T) {
116116
s := new(StorageMock)
117117
s.On("GetBySession", mock.AnythingOfType("string")).Return(Node{}, nil)
118118
p := NewPool(s, new(StrategyListMock))
119-
node, err := p.GetNodeBySessionId("testSessId")
119+
node, err := p.GetNodeBySessionID("testSessId")
120120
a.NotNil(node)
121121
a.Nil(err)
122122
}
@@ -127,7 +127,7 @@ func TestPool_GetNodeBySessionId_Negative(t *testing.T) {
127127
eError := errors.New("Error")
128128
s.On("GetBySession", mock.AnythingOfType("string")).Return(Node{}, eError)
129129
p := NewPool(s, new(StrategyListMock))
130-
node, err := p.GetNodeBySessionId("testSessId")
130+
node, err := p.GetNodeBySessionID("testSessId")
131131
a.Nil(node)
132132
a.Error(err)
133133
}

pool/strategy/kubernetes/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type nodeParams struct {
2525
Port string `json:"port"`
2626
}
2727

28-
func NewConfig(cfg config.Strategy) (*strategyConfig, error) {
28+
func newConfig(cfg config.Strategy) (*strategyConfig, error) {
2929
kubConfig := new(strategyConfig)
3030
kubConfig.Type = cfg.Type
3131
kubConfig.Limit = cfg.Limit

0 commit comments

Comments
 (0)