From b04224bbe03d4676122c0972be06c42d4eceb79e Mon Sep 17 00:00:00 2001
From: watermelo <80680489@qq.com>
Date: Tue, 18 Aug 2020 18:40:45 +0800
Subject: [PATCH] Fix: fix tag router rule copy

---
 cluster/router/tag/router_rule.go | 18 +++++++++---------
 cluster/router/tag/tag_router.go  | 11 ++++-------
 2 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/cluster/router/tag/router_rule.go b/cluster/router/tag/router_rule.go
index b35d455a6..c0a2d763a 100644
--- a/cluster/router/tag/router_rule.go
+++ b/cluster/router/tag/router_rule.go
@@ -41,8 +41,8 @@ import (
 type RouterRule struct {
 	router.BaseRouterRule `yaml:",inline"`
 	Tags                  []Tag
-	addressToTagNames     map[string][]string
-	tagNameToAddresses    map[string][]string
+	AddressToTagNames     map[string][]string
+	TagNameToAddresses    map[string][]string
 }
 
 func getRule(rawRule string) (*RouterRule, error) {
@@ -58,13 +58,13 @@ func getRule(rawRule string) (*RouterRule, error) {
 
 // parseTags use for flattening tags data to @addressToTagNames and @tagNameToAddresses
 func (t *RouterRule) parseTags() {
-	t.addressToTagNames = make(map[string][]string, 2*len(t.Tags))
-	t.tagNameToAddresses = make(map[string][]string, len(t.Tags))
+	t.AddressToTagNames = make(map[string][]string, 2*len(t.Tags))
+	t.TagNameToAddresses = make(map[string][]string, len(t.Tags))
 	for _, tag := range t.Tags {
 		for _, address := range tag.Addresses {
-			t.addressToTagNames[address] = append(t.addressToTagNames[address], tag.Name)
+			t.AddressToTagNames[address] = append(t.AddressToTagNames[address], tag.Name)
 		}
-		t.tagNameToAddresses[tag.Name] = tag.Addresses
+		t.TagNameToAddresses[tag.Name] = tag.Addresses
 	}
 }
 
@@ -85,15 +85,15 @@ func (t *RouterRule) getTagNames() []string {
 }
 
 func (t *RouterRule) hasTag(tag string) bool {
-	return len(t.tagNameToAddresses[tag]) > 0
+	return len(t.TagNameToAddresses[tag]) > 0
 }
 
 func (t *RouterRule) getAddressToTagNames() map[string][]string {
-	return t.addressToTagNames
+	return t.AddressToTagNames
 }
 
 func (t *RouterRule) getTagNameToAddresses() map[string][]string {
-	return t.tagNameToAddresses
+	return t.TagNameToAddresses
 }
 
 func (t *RouterRule) getTags() []Tag {
diff --git a/cluster/router/tag/tag_router.go b/cluster/router/tag/tag_router.go
index bd5c35952..a5f1dc13d 100644
--- a/cluster/router/tag/tag_router.go
+++ b/cluster/router/tag/tag_router.go
@@ -24,6 +24,7 @@ import (
 
 import (
 	gxnet "github.com/dubbogo/gost/net"
+	"github.com/jinzhu/copier"
 	perrors "github.com/pkg/errors"
 )
 
@@ -63,11 +64,6 @@ func (c *tagRouter) isEnabled() bool {
 	return c.enabled
 }
 
-func (c *tagRouter) tagRouterRuleCopy() RouterRule {
-	routerRule := *c.tagRouterRule
-	return routerRule
-}
-
 // Route gets a list of invoker
 func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker {
 	var (
@@ -85,7 +81,8 @@ func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocati
 	}
 
 	// since the rule can be changed by config center, we should copy one to use.
-	tagRouterRuleCopy := c.tagRouterRuleCopy()
+	tagRouterRuleCopy := new(RouterRule)
+	_ = copier.Copy(tagRouterRuleCopy, c.tagRouterRule)
 	tag, ok := invocation.Attachments()[constant.Tagkey]
 	if !ok {
 		tag = url.GetParam(constant.Tagkey, "")
@@ -93,7 +90,7 @@ func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocati
 
 	// if we are requesting for a Provider with a specific tag
 	if len(tag) > 0 {
-		return filterInvokersWithTag(invokers, url, invocation, tagRouterRuleCopy, tag)
+		return filterInvokersWithTag(invokers, url, invocation, *tagRouterRuleCopy, tag)
 	}
 
 	// return all addresses in dynamic tag group.
-- 
GitLab