diff --git a/core/hotspot/rule_manager.go b/core/hotspot/rule_manager.go index b8f10b78a..6961a331f 100644 --- a/core/hotspot/rule_manager.go +++ b/core/hotspot/rule_manager.go @@ -76,7 +76,7 @@ func LoadRules(rules []*Rule) (bool, error) { isEqual := reflect.DeepEqual(currentRules, rules) tcMux.RUnlock() if isEqual { - logging.Info("[HotSpot] Load rules repetition, does not load") + logging.Info("[HotSpot] Load rules is the same with current rules, so ignore load operation.") return false, nil } diff --git a/core/isolation/rule_manager.go b/core/isolation/rule_manager.go index 61c4a99f1..e7dd8fe5d 100644 --- a/core/isolation/rule_manager.go +++ b/core/isolation/rule_manager.go @@ -1,6 +1,7 @@ package isolation import ( + "reflect" "sync" "github.com/alibaba/sentinel-golang/core/misc" @@ -10,15 +11,27 @@ import ( ) var ( - ruleMap = make(map[string][]*Rule) - rwMux = &sync.RWMutex{} + ruleMap = make(map[string][]*Rule) + rwMux = &sync.RWMutex{} + currentRules = make([]*Rule, 0) ) // LoadRules loads the given isolation rules to the rule manager, while all previous rules will be replaced. -func LoadRules(rules []*Rule) (updated bool, err error) { - updated = true - err = nil +// the first returned value indicates whether do real load operation, if the rules is the same with previous rules, return false +func LoadRules(rules []*Rule) (bool, error) { + rwMux.RLock() + isEqual := reflect.DeepEqual(currentRules, rules) + rwMux.RUnlock() + if isEqual { + logging.Info("[Isolation] Load rules is the same with current rules, so ignore load operation.") + return false, nil + } + + err := onRuleUpdate(rules) + return true, err +} +func onRuleUpdate(rules []*Rule) (err error) { m := make(map[string][]*Rule, len(rules)) for _, r := range rules { if e := IsValid(r); e != nil { @@ -47,6 +60,7 @@ func LoadRules(rules []*Rule) (updated bool, err error) { } } ruleMap = m + currentRules = rules return } diff --git a/core/isolation/rule_manager_test.go b/core/isolation/rule_manager_test.go index 473bb128e..495302413 100644 --- a/core/isolation/rule_manager_test.go +++ b/core/isolation/rule_manager_test.go @@ -36,4 +36,24 @@ func TestLoadRules(t *testing.T) { err = ClearRules() assert.True(t, err == nil) }) + + t.Run("loadSameRules", func(t *testing.T) { + _, err := LoadRules([]*Rule{ + { + Resource: "abc1", + MetricType: Concurrency, + Threshold: 100, + }, + }) + assert.Nil(t, err) + ok, err := LoadRules([]*Rule{ + { + Resource: "abc1", + MetricType: Concurrency, + Threshold: 100, + }, + }) + assert.Nil(t, err) + assert.False(t, ok) + }) }