From 242e954a322788d24b54e067253d0bba70e2bf34 Mon Sep 17 00:00:00 2001 From: Joe Zou <yixian.zou@gmail.com> Date: Tue, 28 Jan 2020 15:22:48 +0800 Subject: [PATCH] fix review problems --- cluster/directory/base_directory.go | 3 --- cluster/directory/static_directory.go | 4 +++- cluster/router/chain/chain.go | 13 ++++++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cluster/directory/base_directory.go b/cluster/directory/base_directory.go index 5ea985821..dc3902291 100644 --- a/cluster/directory/base_directory.go +++ b/cluster/directory/base_directory.go @@ -41,7 +41,6 @@ type BaseDirectory struct { url *common.URL destroyed *atomic.Bool mutex sync.Mutex - once sync.Once routerChain router.Chain } @@ -87,8 +86,6 @@ func (dir *BaseDirectory) SetRouters(routers []router.Router) { } } - dir.mutex.Lock() - defer dir.mutex.Unlock() dir.routerChain.AddRouters(routers) } diff --git a/cluster/directory/static_directory.go b/cluster/directory/static_directory.go index b7757ea91..abe03db90 100644 --- a/cluster/directory/static_directory.go +++ b/cluster/directory/static_directory.go @@ -54,7 +54,9 @@ func (dir *staticDirectory) IsAvailable() bool { } func (dir *staticDirectory) List(invocation protocol.Invocation) []protocol.Invoker { - invokers := dir.invokers + l := len(dir.invokers) + invokers := make([]protocol.Invoker, l, l) + copy(invokers, dir.invokers) routerChain := dir.RouterChain() if routerChain == nil { diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go index 4ca596886..d85fb3d0e 100644 --- a/cluster/router/chain/chain.go +++ b/cluster/router/chain/chain.go @@ -19,6 +19,7 @@ package chain import ( "sort" + "sync" ) import ( @@ -42,11 +43,19 @@ type RouterChain struct { // Fixed router instances: ConfigConditionRouter, TagRouter, e.g., the rule for each instance may change but the // instance will never delete or recreate. builtinRouters []router.Router + + mutex sync.RWMutex } func (c RouterChain) Route(invoker []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker { finalInvokers := invoker - for _, r := range c.routers { + l := len(c.routers) + rs := make([]router.Router, l, l) + c.mutex.RLock() + copy(rs, c.routers) + c.mutex.RUnlock() + + for _, r := range rs { finalInvokers = r.Route(invoker, url, invocation) } return finalInvokers @@ -56,6 +65,8 @@ func (c RouterChain) AddRouters(routers []router.Router) { newRouters = append(newRouters, c.builtinRouters...) newRouters = append(newRouters, routers...) sortRouter(newRouters) + c.mutex.Lock() + defer c.mutex.Unlock() c.routers = newRouters } -- GitLab