Data race in `lib/mutex.go`
Creating multiple *sql.DB
instances in parallel triggers a bug in lib/mutex.go
:
-
https://gitlab.com/cznic/sqlite/-/blob/master/lib/mutex.go#L107 modifes
a
under the lock; - https://gitlab.com/cznic/sqlite/-/blob/master/lib/mutex.go#L96 reads it without any lock.
Full reproducer: https://gitlab.com/AlekSi/modernc-sqlite-bugs/-/blob/main/mutex_race_test.go
My output of `go test -race`
==================
WARNING: DATA RACE
Write at 0x0001035de5c8 by goroutine 687:
modernc.org/sqlite/lib.(*mutexPool).alloc()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/mutex.go:107 +0x170
modernc.org/sqlite/lib.mutexAlloc()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/mutex.go:291 +0xa0
modernc.org/sqlite/lib.Xsqlite3MutexAlloc()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:11013 +0x484
modernc.org/sqlite/lib.openDatabase()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:120948 +0x438
modernc.org/sqlite/lib.Xsqlite3_open_v2()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:121165 +0x10c
modernc.org/sqlite.(*conn).openV2()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:1281 +0xe4
modernc.org/sqlite.newConn()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:775 +0x1dc
modernc.org/sqlite.(*Driver).Open()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:1495 +0x38
database/sql.dsnConnector.Connect()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:758 +0x5c
database/sql.(*dsnConnector).Connect()
<autogenerated>:1 +0x20
database/sql.(*DB).conn()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:1387 +0x760
database/sql.(*DB).PingContext.func1()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:850 +0x5c
database/sql.(*DB).retry()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:1538 +0x4c
database/sql.(*DB).PingContext()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:849 +0x7c
database/sql.(*DB).Ping()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:867 +0xf4
gitlab.com/AlekSi/modernc-sqlite-bugs.openDB()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:25 +0xf8
gitlab.com/AlekSi/modernc-sqlite-bugs.TestMutexRace.func1()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:44 +0x90
Previous read at 0x0001035de5c8 by goroutine 900:
modernc.org/sqlite/lib.mutexFromPtr()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/mutex.go:96 +0x38
modernc.org/sqlite/lib.mutexEnter()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/mutex.go:343 +0x80
modernc.org/sqlite/lib.Xsqlite3_mutex_enter()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:11027 +0x5b4
modernc.org/sqlite/lib.openDatabase()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:120965 +0x520
modernc.org/sqlite/lib.Xsqlite3_open_v2()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/lib/sqlite_darwin_arm64.go:121165 +0x10c
modernc.org/sqlite.(*conn).openV2()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:1281 +0xe4
modernc.org/sqlite.newConn()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:775 +0x1dc
modernc.org/sqlite.(*Driver).Open()
/aaa/GOPATH/pkg/mod/modernc.org/sqlite@v1.22.1/sqlite.go:1495 +0x38
database/sql.dsnConnector.Connect()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:758 +0x5c
database/sql.(*dsnConnector).Connect()
<autogenerated>:1 +0x20
database/sql.(*DB).conn()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:1387 +0x760
database/sql.(*DB).PingContext.func1()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:850 +0x5c
database/sql.(*DB).retry()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:1538 +0x4c
database/sql.(*DB).PingContext()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:849 +0x7c
database/sql.(*DB).Ping()
/bbb/go/1.20.4/libexec/src/database/sql/sql.go:867 +0xf4
gitlab.com/AlekSi/modernc-sqlite-bugs.openDB()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:25 +0xf8
gitlab.com/AlekSi/modernc-sqlite-bugs.TestMutexRace.func1()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:44 +0x90
Goroutine 687 (running) created at:
gitlab.com/AlekSi/modernc-sqlite-bugs.TestMutexRace()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:38 +0x84
testing.tRunner()
/bbb/go/1.20.4/libexec/src/testing/testing.go:1576 +0x188
testing.(*T).Run.func1()
/bbb/go/1.20.4/libexec/src/testing/testing.go:1629 +0x40
Goroutine 900 (running) created at:
gitlab.com/AlekSi/modernc-sqlite-bugs.TestMutexRace()
/ccc/modernc-sqlite-bugs/mutex_race_test.go:38 +0x84
testing.tRunner()
/bbb/go/1.20.4/libexec/src/testing/testing.go:1576 +0x188
testing.(*T).Run.func1()
/bbb/go/1.20.4/libexec/src/testing/testing.go:1629 +0x40
==================
Downgrading to v1.20.0 (released before c0ed3129) resolves the issue.
Edited by Alexey Palazhchenko