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