From 4eca9cc825b91a97683fde62903392a3eb9594ef Mon Sep 17 00:00:00 2001 From: Ewan Chou Date: Thu, 7 Jul 2016 15:35:40 +0800 Subject: [PATCH] *: fix data races detected by go test -race (#1407) --- infoschema/infoschema.go | 1 - perfschema/init.go | 12 +++++------- server/server.go | 6 +++++- server/tidb_test.go | 3 +-- session_test.go | 2 -- store/tikv/coprocessor.go | 11 ++++++++--- tidb_test.go | 3 +-- 7 files changed, 20 insertions(+), 18 deletions(-) diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index c65b26e500e0b..b237f90e1128f 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -273,7 +273,6 @@ func newMemSchemaHandle() (*memSchemaHandle, error) { if err != nil { return nil, errors.Trace(err) } - initMemoryTables(h) h.perfHandle, err = perfschema.NewPerfHandle() if err != nil { return nil, errors.Trace(err) diff --git a/perfschema/init.go b/perfschema/init.go index 90bcda44f1bc4..b9c290bb2084b 100644 --- a/perfschema/init.go +++ b/perfschema/init.go @@ -328,7 +328,11 @@ func (ps *perfSchema) initRecords(tbName string, records [][]types.Datum) error return nil } -var setupTimersRecords [][]types.Datum +var setupTimersRecords = [][]types.Datum{ + types.MakeDatums("stage", mysql.Enum{Name: "NANOSECOND", Value: 1}), + types.MakeDatums("statement", mysql.Enum{Name: "NANOSECOND", Value: 1}), + types.MakeDatums("transaction", mysql.Enum{Name: "NANOSECOND", Value: 1}), +} func (ps *perfSchema) initialize() (err error) { ps.tables = make(map[string]*model.TableInfo) @@ -425,12 +429,6 @@ func (ps *perfSchema) initialize() (err error) { if err != nil { return errors.Trace(err) } - - setupTimersRecords = [][]types.Datum{ - types.MakeDatums("stage", mysql.Enum{Name: "NANOSECOND", Value: 1}), - types.MakeDatums("statement", mysql.Enum{Name: "NANOSECOND", Value: 1}), - types.MakeDatums("transaction", mysql.Enum{Name: "NANOSECOND", Value: 1}), - } err = ps.initRecords(TableSetupTimers, setupTimersRecords) if err != nil { return errors.Trace(err) diff --git a/server/server.go b/server/server.go index 04a9e81a65839..6543340aa6fd1 100644 --- a/server/server.go +++ b/server/server.go @@ -68,7 +68,11 @@ type Server struct { // ConnectionCount gets current connection count. func (s *Server) ConnectionCount() int { - return len(s.clients) + var cnt int + s.rwlock.RLock() + cnt = len(s.clients) + s.rwlock.RUnlock() + return cnt } func (s *Server) getToken() *Token { diff --git a/server/tidb_test.go b/server/tidb_test.go index f8da5a8138608..1edc1f4f79e68 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -29,6 +29,7 @@ type TidbTestSuite struct { var _ = Suite(new(TidbTestSuite)) func (ts *TidbTestSuite) SetUpSuite(c *C) { + log.SetLevelByString("error") store, err := tidb.NewStore("memory:///tmp/tidb") c.Assert(err, IsNil) ts.tidbdrv = NewTiDBDriver(store) @@ -42,8 +43,6 @@ func (ts *TidbTestSuite) SetUpSuite(c *C) { ts.server = server go ts.server.Run() time.Sleep(time.Millisecond * 100) - - log.SetLevelByString("error") } func (ts *TidbTestSuite) TearDownSuite(c *C) { diff --git a/session_test.go b/session_test.go index 3567e8ba2b9af..5688a58e4abdd 100644 --- a/session_test.go +++ b/session_test.go @@ -20,7 +20,6 @@ import ( "sync/atomic" "time" - "github.com/ngaut/log" . "github.com/pingcap/check" "github.com/pingcap/tidb/context" "github.com/pingcap/tidb/executor" @@ -58,7 +57,6 @@ func (s *testSessionSuite) SetUpSuite(c *C) { s.dropTableSQL = `Drop TABLE if exists t;` s.createTableSQL = `CREATE TABLE t(id TEXT);` s.selectSQL = `SELECT * from t;` - log.SetLevelByString("error") } func (s *testSessionSuite) TearDownSuite(c *C) { diff --git a/store/tikv/coprocessor.go b/store/tikv/coprocessor.go index de2d2904585a6..c1f2446775091 100644 --- a/store/tikv/coprocessor.go +++ b/store/tikv/coprocessor.go @@ -96,7 +96,9 @@ func (c *CopClient) Send(req *kv.Request) kv.Response { } it.errChan = make(chan error, 1) if len(it.tasks) == 0 { + it.mu.Lock() it.Close() + it.mu.Unlock() } it.run() return it @@ -269,9 +271,11 @@ func (it *copIterator) Next() (io.ReadCloser, error) { break } } - it.mu.Unlock() if task == nil { it.Close() + } + it.mu.Unlock() + if task == nil { return nil, nil } select { @@ -282,12 +286,13 @@ func (it *copIterator) Next() (io.ReadCloser, error) { task.status = taskDone it.mu.Unlock() } + + it.mu.Lock() + defer it.mu.Unlock() if err != nil { it.Close() return nil, err } - it.mu.Lock() - defer it.mu.Unlock() it.respGot++ if it.respGot == len(it.tasks) { it.Close() diff --git a/tidb_test.go b/tidb_test.go index 41eaa4963d273..0d9fd319657af 100644 --- a/tidb_test.go +++ b/tidb_test.go @@ -35,6 +35,7 @@ import ( var store = flag.String("store", "memory", "registered store name, [memory, goleveldb, boltdb]") func TestT(t *testing.T) { + log.SetLevelByString("error") TestingT(t) } @@ -67,8 +68,6 @@ func (s *testMainSuite) SetUpSuite(c *C) { CREATE TABLE tbl_test2(id INT NOT NULL DEFAULT 3, name varchar(255), PRIMARY KEY(id));` s.selectSQL = `SELECT * from tbl_test;` runtime.GOMAXPROCS(runtime.NumCPU()) - - log.SetLevelByString("error") } func (s *testMainSuite) TearDownSuite(c *C) {