Skip to content
This repository was archived by the owner on Jan 18, 2021. It is now read-only.

Commit 6f289cc

Browse files
Sweettamalsaha
authored andcommitted
Solve connection leak. (#131)
Do not forget to close connection after you used it. ref: #68
1 parent 3d563d5 commit 6f289cc

File tree

5 files changed

+38
-33
lines changed

5 files changed

+38
-33
lines changed

pkg/extpoints/interfaces.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package extpoints
22

33
import (
44
"golang.org/x/net/context"
5+
"google.golang.org/grpc"
56
rls "k8s.io/helm/pkg/proto/hapi/services"
67
)
78

89
type Connector interface {
910
UID() string
10-
Connect(context.Context) (rls.ReleaseServiceClient, error)
11+
Connect(context.Context) (*grpc.ClientConn, rls.ReleaseServiceClient, error)
1112
}

pkg/factory/direct_connector.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package factory
33
import (
44
"github.com/appscode/swift/pkg/extpoints"
55
"golang.org/x/net/context"
6+
"google.golang.org/grpc"
67
rls "k8s.io/helm/pkg/proto/hapi/services"
78
)
89

@@ -20,10 +21,10 @@ func (c *DirectConnector) UID() string {
2021
return UIDDirectConnector
2122
}
2223

23-
func (c *DirectConnector) Connect(ctx context.Context) (rls.ReleaseServiceClient, error) {
24+
func (c *DirectConnector) Connect(ctx context.Context) (*grpc.ClientConn, rls.ReleaseServiceClient, error) {
2425
conn, err := Connect(c.TillerEndpoint)
2526
if err != nil {
26-
return nil, err
27+
return nil, nil, err
2728
}
28-
return rls.NewReleaseServiceClient(conn), nil
29+
return conn, rls.NewReleaseServiceClient(conn), nil
2930
}

pkg/factory/incluster_connector.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/appscode/swift/pkg/extpoints"
99
"golang.org/x/net/context"
10+
"google.golang.org/grpc"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1112
clientset "k8s.io/client-go/kubernetes"
1213
apiv1 "k8s.io/client-go/pkg/api/v1"
@@ -27,24 +28,24 @@ func (c *InClusterConnector) UID() string {
2728
return UIDInClusterConnector
2829
}
2930

30-
func (c *InClusterConnector) Connect(ctx context.Context) (rls.ReleaseServiceClient, error) {
31+
func (c *InClusterConnector) Connect(ctx context.Context) (*grpc.ClientConn, rls.ReleaseServiceClient, error) {
3132
config, err := restclient.InClusterConfig()
3233
if err != nil {
33-
return nil, err
34+
return nil, nil, err
3435
}
3536
client, err := clientset.NewForConfig(config)
3637
if err != nil {
37-
return nil, err
38+
return nil, nil, err
3839
}
3940
addr, err := c.getTillerAddr(client)
4041
if err != nil {
41-
return nil, err
42+
return nil, nil, err
4243
}
4344
conn, err := Connect(addr)
4445
if err != nil {
45-
return nil, err
46+
return nil, nil, err
4647
}
47-
return rls.NewReleaseServiceClient(conn), nil
48+
return conn, rls.NewReleaseServiceClient(conn), nil
4849
}
4950

5051
func (c *InClusterConnector) getTillerAddr(client clientset.Interface) (string, error) {

pkg/factory/kubeconfig_connector.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package factory
33
import (
44
"github.com/appscode/swift/pkg/extpoints"
55
"golang.org/x/net/context"
6+
"google.golang.org/grpc"
67
clientset "k8s.io/client-go/kubernetes"
78
"k8s.io/client-go/rest"
89
"k8s.io/client-go/tools/clientcmd"
@@ -25,24 +26,24 @@ func (c *KubeconfigConnector) UID() string {
2526
return UIDKubeconfigConnector
2627
}
2728

28-
func (c *KubeconfigConnector) Connect(ctx context.Context) (rls.ReleaseServiceClient, error) {
29+
func (c *KubeconfigConnector) Connect(ctx context.Context) (*grpc.ClientConn, rls.ReleaseServiceClient, error) {
2930
config, err := c.getConfig()
3031
if err != nil {
31-
return nil, err
32+
return nil, nil, err
3233
}
3334
client, err := clientset.NewForConfig(config)
3435
if err != nil {
35-
return nil, err
36+
return nil, nil, err
3637
}
3738
addr, err := c.GetTillerAddr(client, config)
3839
if err != nil {
39-
return nil, err
40+
return nil, nil, err
4041
}
4142
conn, err := Connect(addr)
4243
if err != nil {
43-
return nil, err
44+
return nil, nil, err
4445
}
45-
return rls.NewReleaseServiceClient(conn), nil
46+
return conn, rls.NewReleaseServiceClient(conn), nil
4647
}
4748

4849
func (c *KubeconfigConnector) getConfig() (*rest.Config, error) {

pkg/release/server.go

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ func newContext() context.Context {
2727
}
2828

2929
func (s *Server) SummarizeReleases(ctx context.Context, req *proto.SummarizeReleasesRequest) (*proto.SummarizeReleasesResponse, error) {
30-
rlc, err := s.ClientFactory.Connect(ctx)
30+
conn, rlc, err := s.ClientFactory.Connect(ctx)
3131
if err != nil {
3232
return nil, err
3333
}
34+
defer conn.Close()
3435
listReq := rls.ListReleasesRequest{
3536
Filter: req.Filter,
3637
Limit: req.Limit,
@@ -89,11 +90,11 @@ func (s *Server) SummarizeReleases(ctx context.Context, req *proto.SummarizeRele
8990

9091
// GetReleasesStatus retrieves status information for the specified release.
9192
func (s *Server) GetReleaseStatus(ctx context.Context, req *proto.GetReleaseStatusRequest) (*proto.GetReleaseStatusResponse, error) {
92-
rlc, err := s.ClientFactory.Connect(ctx)
93+
conn, rlc, err := s.ClientFactory.Connect(ctx)
9394
if err != nil {
9495
return nil, err
9596
}
96-
97+
defer conn.Close()
9798
statusReq := rls.GetReleaseStatusRequest{
9899
Name: req.Name,
99100
Version: req.Version,
@@ -113,11 +114,11 @@ func (s *Server) GetReleaseStatus(ctx context.Context, req *proto.GetReleaseStat
113114

114115
// GetReleaseContent retrieves the release content (chart + value) for the specified release.
115116
func (s *Server) GetReleaseContent(ctx context.Context, req *proto.GetReleaseContentRequest) (*proto.GetReleaseContentResponse, error) {
116-
rlc, err := s.ClientFactory.Connect(ctx)
117+
conn, rlc, err := s.ClientFactory.Connect(ctx)
117118
if err != nil {
118119
return nil, err
119120
}
120-
121+
defer conn.Close()
121122
contentReq := rls.GetReleaseContentRequest{
122123
Name: req.Name,
123124
Version: req.Version,
@@ -146,11 +147,11 @@ func (s *Server) GetReleaseContent(ctx context.Context, req *proto.GetReleaseCon
146147

147148
// UpdateRelease updates release content.
148149
func (s *Server) UpdateRelease(ctx context.Context, req *proto.UpdateReleaseRequest) (*proto.UpdateReleaseResponse, error) {
149-
rlc, err := s.ClientFactory.Connect(ctx)
150+
conn, rlc, err := s.ClientFactory.Connect(ctx)
150151
if err != nil {
151152
return nil, err
152153
}
153-
154+
defer conn.Close()
154155
if req.Values == nil { // (req.Values == nil) causes render error
155156
req.Values = &chart.Config{}
156157
}
@@ -188,11 +189,11 @@ func (s *Server) UpdateRelease(ctx context.Context, req *proto.UpdateReleaseRequ
188189

189190
// InstallRelease requests installation of a chart as a new release.
190191
func (s *Server) InstallRelease(ctx context.Context, req *proto.InstallReleaseRequest) (*proto.InstallReleaseResponse, error) {
191-
rlc, err := s.ClientFactory.Connect(ctx)
192+
conn, rlc, err := s.ClientFactory.Connect(ctx)
192193
if err != nil {
193194
return nil, err
194195
}
195-
196+
defer conn.Close()
196197
if req.Values == nil { // (req.Values == nil) causes render error
197198
req.Values = &chart.Config{}
198199
}
@@ -228,11 +229,11 @@ func (s *Server) InstallRelease(ctx context.Context, req *proto.InstallReleaseRe
228229

229230
// UninstallRelease requests deletion of a named release.
230231
func (s *Server) UninstallRelease(ctx context.Context, req *proto.UninstallReleaseRequest) (*proto.UninstallReleaseResponse, error) {
231-
rlc, err := s.ClientFactory.Connect(ctx)
232+
conn, rlc, err := s.ClientFactory.Connect(ctx)
232233
if err != nil {
233234
return nil, err
234235
}
235-
236+
defer conn.Close()
236237
uninstallReq := rls.UninstallReleaseRequest{
237238
Name: req.Name,
238239
Timeout: req.Timeout,
@@ -253,11 +254,11 @@ func (s *Server) UninstallRelease(ctx context.Context, req *proto.UninstallRelea
253254

254255
// GetVersion returns the current version of the server.
255256
func (s *Server) GetVersion(ctx context.Context, req *proto.GetVersionRequest) (*proto.GetVersionResponse, error) {
256-
rlc, err := s.ClientFactory.Connect(ctx)
257+
conn, rlc, err := s.ClientFactory.Connect(ctx)
257258
if err != nil {
258259
return nil, err
259260
}
260-
261+
defer conn.Close()
261262
versionReq := rls.GetVersionRequest{}
262263

263264
versionRes, err := rlc.GetVersion(newContext(), &versionReq)
@@ -272,11 +273,11 @@ func (s *Server) GetVersion(ctx context.Context, req *proto.GetVersionRequest) (
272273

273274
// RollbackRelease rolls back a release to a previous version.
274275
func (s *Server) RollbackRelease(ctx context.Context, req *proto.RollbackReleaseRequest) (*proto.RollbackReleaseResponse, error) {
275-
rlc, err := s.ClientFactory.Connect(ctx)
276+
conn, rlc, err := s.ClientFactory.Connect(ctx)
276277
if err != nil {
277278
return nil, err
278279
}
279-
280+
defer conn.Close()
280281
rollbackReq := rls.RollbackReleaseRequest{
281282
Name: req.Name,
282283
Timeout: req.Timeout,
@@ -300,11 +301,11 @@ func (s *Server) RollbackRelease(ctx context.Context, req *proto.RollbackRelease
300301

301302
// ReleaseHistory retrieves a release's history.
302303
func (s *Server) GetHistory(ctx context.Context, req *proto.GetHistoryRequest) (*proto.GetHistoryResponse, error) {
303-
rlc, err := s.ClientFactory.Connect(ctx)
304+
conn, rlc, err := s.ClientFactory.Connect(ctx)
304305
if err != nil {
305306
return nil, err
306307
}
307-
308+
defer conn.Close()
308309
historyReq := rls.GetHistoryRequest{
309310
Name: req.Name,
310311
Max: req.Max,

0 commit comments

Comments
 (0)