Fix proxy selector memory leak

This commit is contained in:
Asim Aslam 2020-08-05 17:38:41 +01:00
parent 38ec233350
commit 03d47afe47
2 changed files with 12 additions and 7 deletions

View File

@ -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

View File

@ -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()
}
}