Skip to content

Data race in `lib/mutex.go`

Creating multiple *sql.DB instances in parallel triggers a bug in lib/mutex.go:

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