- 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)
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)