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