From 03d47afe47c1f8a74109e17c96cba3eaac7138d3 Mon Sep 17 00:00:00 2001 From: Asim Aslam Date: Wed, 5 Aug 2020 17:38:41 +0100 Subject: [PATCH] Fix proxy selector memory leak --- proxy/mucp/mucp.go | 11 ++++++++++- selector/roundrobin/roundrobin.go | 8 ++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/proxy/mucp/mucp.go b/proxy/mucp/mucp.go index 2cdfddc3..dcdaa646 100644 --- a/proxy/mucp/mucp.go +++ b/proxy/mucp/mucp.go @@ -20,6 +20,7 @@ import ( "github.com/micro/go-micro/v3/proxy" "github.com/micro/go-micro/v3/router" "github.com/micro/go-micro/v3/router/registry" + "github.com/micro/go-micro/v3/selector" "github.com/micro/go-micro/v3/selector/roundrobin" "github.com/micro/go-micro/v3/server" ) @@ -45,6 +46,9 @@ type Proxy struct { // A fib of routes service:address sync.RWMutex Routes map[string]map[uint64]router.Route + + // selector used for load balancing + Selector selector.Selector } // read client request and write to server @@ -402,7 +406,7 @@ func (p *Proxy) ServeRequest(ctx context.Context, req server.Request, rsp server //nolint:prealloc opts := []client.CallOption{ // set strategy to round robin - client.WithSelector(roundrobin.NewSelector()), + client.WithSelector(p.Selector), } // if the address is already set just serve it @@ -608,6 +612,11 @@ func NewProxy(opts ...proxy.Option) proxy.Proxy { if p.Router == nil { p.Router = registry.NewRouter() } + + if p.Selector == nil { + p.Selector = roundrobin.NewSelector() + } + // set the links if options.Links != nil { // get client diff --git a/selector/roundrobin/roundrobin.go b/selector/roundrobin/roundrobin.go index c77004c5..b7573e15 100644 --- a/selector/roundrobin/roundrobin.go +++ b/selector/roundrobin/roundrobin.go @@ -93,12 +93,7 @@ func (r *roundrobin) String() string { } func (r *roundrobin) cleanRoutes() { - for { - // watch for ticks until the ticker is closed - if _, ok := <-r.ticker.C; !ok { - return - } - + for _ = range r.ticker.C { r.Lock() // copy the slice to prevent concurrent map iteration and map write @@ -109,6 +104,7 @@ func (r *roundrobin) cleanRoutes() { delete(r.routes, hash) } } + r.Unlock() } }