From 0c7f2bb2d358f68e4385ffbc1ead0a7c4d70f5dd Mon Sep 17 00:00:00 2001 From: Chunzhu Li Date: Thu, 14 May 2020 11:18:09 +0800 Subject: [PATCH 1/2] fix black white filter bug --- pkg/filter/filter.go | 28 +++++++++++++++++++--------- pkg/filter/filter_test.go | 13 +++++++++++++ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/pkg/filter/filter.go b/pkg/filter/filter.go index 590dccaa5..c1e60e0e3 100644 --- a/pkg/filter/filter.go +++ b/pkg/filter/filter.go @@ -46,6 +46,14 @@ func (t *Table) String() string { return fmt.Sprintf("`%s`", t.Schema) } +// Clone clones a new filter.Table +func (t *Table) Clone() *Table { + return &Table{ + Schema: t.Schema, + Name: t.Name, + } +} + type cache struct { sync.RWMutex items map[string]ActionType // `schema`.`table` => do/ignore @@ -277,13 +285,14 @@ func (f *Filter) ApplyOn(stbs []*Table) []*Table { var tbs []*Table for _, tb := range stbs { + newTb := tb.Clone() if !f.caseSensitive { - tb.Schema = strings.ToLower(tb.Schema) - tb.Name = strings.ToLower(tb.Name) + newTb.Schema = strings.ToLower(newTb.Schema) + newTb.Name = strings.ToLower(newTb.Name) } - if f.Match(tb) { - tbs = append(tbs, tb) + if f.Match(newTb) { + tbs = append(tbs, newTb) } } @@ -295,16 +304,17 @@ func (f *Filter) Match(tb *Table) bool { if f == nil || f.rules == nil { return true } + newTb := tb.Clone() if !f.caseSensitive { - tb.Schema = strings.ToLower(tb.Schema) - tb.Name = strings.ToLower(tb.Name) + newTb.Schema = strings.ToLower(newTb.Schema) + newTb.Name = strings.ToLower(newTb.Name) } - name := tb.String() + name := newTb.String() do, exist := f.c.query(name) if !exist { - do = ActionType(f.filterOnSchemas(tb) && f.filterOnTables(tb)) - f.c.set(tb.String(), do) + do = ActionType(f.filterOnSchemas(newTb) && f.filterOnTables(newTb)) + f.c.set(newTb.String(), do) } return do == Do } diff --git a/pkg/filter/filter_test.go b/pkg/filter/filter_test.go index 9e31d20a9..881cee9a2 100644 --- a/pkg/filter/filter_test.go +++ b/pkg/filter/filter_test.go @@ -17,6 +17,14 @@ import ( . "github.com/pingcap/check" ) +func cloneTables(tbs []*Table) []*Table { + newTbs := make([]*Table, 0, len(tbs)) + for _, tb := range tbs { + newTbs = append(newTbs, tb.Clone()) + } + return newTbs +} + func (s *testFilterSuite) TestFilterOnSchema(c *C) { cases := []struct { rules *Rules @@ -148,8 +156,10 @@ func (s *testFilterSuite) TestFilterOnSchema(c *C) { for _, t := range cases { ft, err := New(t.caseSensitive, t.rules) c.Assert(err, IsNil) + originInput := cloneTables(t.Input) got := ft.ApplyOn(t.Input) c.Logf("got %+v, expected %+v", got, t.Output) + c.Assert(originInput, DeepEquals, t.Input) c.Assert(got, DeepEquals, t.Output) } } @@ -196,13 +206,16 @@ func (s *testFilterSuite) TestCaseSensitive(c *C) { } r, err = New(false, rules) + c.Assert(err, IsNil) inputTable = &Table{"bar", "a"} c.Assert(r.Match(inputTable), IsTrue) c.Assert(err, IsNil) + originInputTable := inputTable.Clone() inputTable = &Table{"BAR", "a"} c.Assert(r.Match(inputTable), IsTrue) + c.Assert(originInputTable, DeepEquals, inputTable) } func (s *testFilterSuite) TestInvalidRegex(c *C) { From 60b71fea723bdeb7d40af1ce18f66482aadbc8c3 Mon Sep 17 00:00:00 2001 From: Chunzhu Li Date: Thu, 14 May 2020 11:34:23 +0800 Subject: [PATCH 2/2] fix test --- pkg/filter/filter_test.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/filter/filter_test.go b/pkg/filter/filter_test.go index 881cee9a2..e6590ac41 100644 --- a/pkg/filter/filter_test.go +++ b/pkg/filter/filter_test.go @@ -18,6 +18,9 @@ import ( ) func cloneTables(tbs []*Table) []*Table { + if tbs == nil { + return nil + } newTbs := make([]*Table, 0, len(tbs)) for _, tb := range tbs { newTbs = append(newTbs, tb.Clone()) @@ -212,8 +215,8 @@ func (s *testFilterSuite) TestCaseSensitive(c *C) { c.Assert(err, IsNil) - originInputTable := inputTable.Clone() inputTable = &Table{"BAR", "a"} + originInputTable := inputTable.Clone() c.Assert(r.Match(inputTable), IsTrue) c.Assert(originInputTable, DeepEquals, inputTable) }