mrsinham / mysqlrace

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Datarace on MySQL golang driver (github.com/go-sql-driver/mysql)

  • Use the ./launch_mysql.sh to start an instance of mysql
  • Use the ./launch_withrace.sh to see the datarace (not reproducable everytime, please insist)

Early analysis

The connection to MySQL use a buffer that is not protected against dataraces. When the context sends a Close() order via the context cancelling and if the buffer is still providing data to the rows.Scan() method, they read/write on the same []byte at the same time, triggering

Exemple :

▶ ./launch_withrace.sh
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
==================
WARNING: DATA RACE
Write at 0x00c42010e740 by goroutine 71:
  internal/race.WriteRange()
      /home/julien/programmation/gobin/go/src/internal/race/race.go:49 +0x42
  syscall.Read()
      /home/julien/programmation/gobin/go/src/syscall/syscall_unix.go:165 +0x9a
  net.(*netFD).Read()
      /home/julien/programmation/gobin/go/src/net/fd_unix.go:246 +0x185
  net.(*conn).Read()
      /home/julien/programmation/gobin/go/src/net/net.go:181 +0x96
  net.(*TCPConn).Read()
      <autogenerated>:72 +0x72
  github.com/go-sql-driver/mysql.(*buffer).fill()
      /home/julien/programmation/go/src/github.com/go-sql-driver/mysql/buffer.go:68 +0x19a
  github.com/go-sql-driver/mysql.(*buffer).readNext()
      /home/julien/programmation/go/src/github.com/go-sql-driver/mysql/buffer.go:97 +0x1dd
  github.com/go-sql-driver/mysql.(*mysqlConn).readPacket()
      /home/julien/programmation/go/src/github.com/go-sql-driver/mysql/packets.go:67 +0x1ff
  github.com/go-sql-driver/mysql.(*mysqlConn).readUntilEOF()
      /home/julien/programmation/go/src/github.com/go-sql-driver/mysql/packets.go:800 +0x50
  github.com/go-sql-driver/mysql.(*mysqlRows).Close()
      /home/julien/programmation/go/src/github.com/go-sql-driver/mysql/rows.go:119 +0x1a0
  github.com/go-sql-driver/mysql.(*textRows).Close()
      <autogenerated>:8 +0x50
  database/sql.(*Rows).close()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:2434 +0x162
  database/sql.(*Rows).awaitDone()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:2122 +0x9b

Previous read at 0x00c42010e747 by goroutine 18:
  runtime.slicebytetostring()
      /home/julien/programmation/gobin/go/src/runtime/string.go:72 +0x0
  database/sql.convertAssign()
      /home/julien/programmation/gobin/go/src/database/sql/convert.go:149 +0x2294
  database/sql.(*Rows).Scan()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:2401 +0x281
  main.main.func2()
      /home/julien/programmation/go/src/github.com/mrsinham/mysqlrace/test.go:45 +0x28f

Goroutine 71 (running) created at:
  database/sql.(*Rows).initContextClose()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:2116 +0xc9
  database/sql.(*DB).queryConn()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:1278 +0xa4a
  database/sql.(*DB).query()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:1250 +0x187
  database/sql.(*DB).QueryContext()
      /home/julien/programmation/gobin/go/src/database/sql/sql.go:1227 +0xc8
  main.main.func2()
      /home/julien/programmation/go/src/github.com/mrsinham/mysqlrace/test.go:35 +0xc7

Goroutine 18 (running) created at:
  main.main()
      /home/julien/programmation/go/src/github.com/mrsinham/mysqlrace/test.go:55 +0x1c3
==================
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 sql: Rows are closed
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 sql: Rows are closed
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
2018/01/03 14:22:41 context canceled
Found 1 data race(s)

About


Languages

Language:Go 81.0%Language:Shell 19.0%