diff --git a/adapter/micro/server_test.go b/adapter/micro/server_test.go index 41ae8883a..cb3074eec 100644 --- a/adapter/micro/server_test.go +++ b/adapter/micro/server_test.go @@ -58,7 +58,7 @@ func TestServerLimiter(t *testing.T) { _, err = flow.LoadRules([]*flow.Rule{ { Resource: req.Method(), - Threshold: 1, + Threshold: 0, TokenCalculateStrategy: flow.Direct, ControlBehavior: flow.Reject, }, diff --git a/core/flow/rule_manager.go b/core/flow/rule_manager.go index e90d2c51f..7a9c31d76 100644 --- a/core/flow/rule_manager.go +++ b/core/flow/rule_manager.go @@ -2,6 +2,7 @@ package flow import ( "fmt" + "reflect" "sync" "github.com/alibaba/sentinel-golang/core/base" @@ -28,6 +29,7 @@ var ( tcGenFuncMap = make(map[trafficControllerGenKey]TrafficControllerGenFunc) tcMap = make(TrafficControllerMap) tcMux = new(sync.RWMutex) + currentRules = make([]*Rule, 0) ) func init() { @@ -157,12 +159,16 @@ func onRuleUpdate(rules []*Rule) (err error) { m[res] = buildRulesOfRes(res, rulesOfRes) } tcMap = m + currentRules = rules return nil } // LoadRules loads the given flow rules to the rule manager, while all previous rules will be replaced. func LoadRules(rules []*Rule) (bool, error) { // TODO: rethink the design + if isEqual := reflect.DeepEqual(currentRules, rules); isEqual { + return false, nil + } err := onRuleUpdate(rules) return true, err } diff --git a/core/flow/rule_manager_test.go b/core/flow/rule_manager_test.go index 1910bda0f..08796be8f 100644 --- a/core/flow/rule_manager_test.go +++ b/core/flow/rule_manager_test.go @@ -373,3 +373,27 @@ func Test_buildRulesOfRes(t *testing.T) { assert.True(t, tcs[3].boundStat == stat4) }) } + +func TestLoadRules(t *testing.T) { + t.Run("loadSameRules", func(t *testing.T) { + _, err := LoadRules([]*Rule{ + { + Resource: "some-test", + Threshold: 10, + TokenCalculateStrategy: Direct, + ControlBehavior: Reject, + }, + }) + assert.Nil(t, err) + ok, err := LoadRules([]*Rule{ + { + Resource: "some-test", + Threshold: 10, + TokenCalculateStrategy: Direct, + ControlBehavior: Reject, + }, + }) + assert.Nil(t, err) + assert.False(t, ok) + }) +}