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 <details><summary>My output of `go test -race`</summary> ``` ================== 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 ================== ``` </details> Downgrading to v1.20.0 (released before c0ed31298694244ee94b48147544addfc1bda3b8) resolves the issue.
issue