Skip to content

race detected in modernc.org/sqlite/lib._sqlite3MutexInit()

I have a strange issue where the Go race detector detects data races on modernc.org/sqlite/lib._sqlite3MutexInit() during unit tests. The unit tests all use different databases on their own so this looks like a data race issue in the library itself. An open source repo where this happens is https://github.com/firefart/websitewatcher

Library Version: modernc.org/sqlite v1.37.0

Here is an example output from a run on github actions

task: [deps] go mod tidy -v
task: [sqlc] go tool sqlc generate
task: [templ] go tool templ generate
(✓) Complete [ updates=18 duration=6.063705ms ]
task: [templ] go tool templ fmt .
(✓) Format Complete [ count=1 errors=0 changed=0 duration=9.506794ms ]
task: [test] go test -race -cover ./...
	github.com/firefart/websitewatcher		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/config		coverage: 0.0% of statements
==================
WARNING: DATA RACE
Read at 0x00000151e410 by goroutine 11:
  modernc.org/sqlite/lib._sqlite3MutexInit()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:16636 +0x30
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:163731 +0x7d
  modernc.org/sqlite/lib._openDatabase()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166455 +0x268
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166674 +0x204
  modernc.org/sqlite.(*conn).openV2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1393 +0x1c9
  modernc.org/sqlite.newConn()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:845 +0x21d
  modernc.org/sqlite.(*Driver).Open()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1999 +0x53
  database/sql.dsnConnector.Connect()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:809 +0x61
  database/sql.(*dsnConnector).Connect()
      <autogenerated>:1 +0x1f
  database/sql.(*DB).conn()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1431 +0xed0
  database/sql.(*DB).exec()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1689 +0x93
  database/sql.(*DB).ExecContext.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1672 +0xd5
  database/sql.(*DB).retry()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1576 +0x4a
  database/sql.(*DB).ExecContext()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1671 +0x184
  github.com/firefart/websitewatcher/internal/database.newDatabase()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:116 +0xb0d
  github.com/firefart/websitewatcher/internal/database.New()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:53 +0x19d
  github.com/firefart/websitewatcher/internal/database_test.TestUpdateLastContent()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database_test.go:95 +0x3d0
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.(*T).Run.gowrap1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x44

Previous write at 0x00000151e410 by goroutine 9:
  modernc.org/sqlite/lib._sqlite3MutexInit()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:16652 +0x60a
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:163731 +0x7d
  modernc.org/sqlite/lib._openDatabase()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166455 +0x268
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166674 +0x204
  modernc.org/sqlite.(*conn).openV2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1393 +0x1c9
  modernc.org/sqlite.newConn()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:845 +0x21d
  modernc.org/sqlite.(*Driver).Open()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1999 +0x53
  database/sql.dsnConnector.Connect()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:809 +0x61
  database/sql.(*dsnConnector).Connect()
      <autogenerated>:1 +0x1f
  database/sql.(*DB).conn()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1431 +0xed0
  database/sql.(*DB).exec()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1689 +0x93
  database/sql.(*DB).ExecContext.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1672 +0xd5
  database/sql.(*DB).retry()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1576 +0x4a
  database/sql.(*DB).ExecContext()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1671 +0x184
  github.com/firefart/websitewatcher/internal/database.newDatabase()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:116 +0xb0d
  github.com/firefart/websitewatcher/internal/database.New()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:53 +0x19d
  github.com/firefart/websitewatcher/internal/database_test.TestNew()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database_test.go:31 +0x3cf
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.(*T).Run.gowrap1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x44

Goroutine 11 (running) created at:
  testing.(*T).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x8f2
  testing.runTests.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2279 +0x85
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.runTests()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2277 +0x96c
  testing.(*M).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2142 +0xeea
  main.main()
      _testmain.go:65 +0x164

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x8f2
  testing.runTests.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2279 +0x85
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.runTests()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2277 +0x96c
  testing.(*M).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2142 +0xeea
  main.main()
      _testmain.go:65 +0x164
==================
==================
WARNING: DATA RACE
Read at 0x00000151e400 by goroutine 11:
  modernc.org/sqlite/lib._sqlite3MutexInit()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:16654 +0x62d
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:163731 +0x7d
  modernc.org/sqlite/lib._openDatabase()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166455 +0x268
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166674 +0x204
  modernc.org/sqlite.(*conn).openV2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1393 +0x1c9
  modernc.org/sqlite.newConn()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:845 +0x21d
  modernc.org/sqlite.(*Driver).Open()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1999 +0x53
  database/sql.dsnConnector.Connect()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:809 +0x61
  database/sql.(*dsnConnector).Connect()
      <autogenerated>:1 +0x1f
  database/sql.(*DB).conn()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1431 +0xed0
  database/sql.(*DB).exec()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1689 +0x93
  database/sql.(*DB).ExecContext.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1672 +0xd5
  database/sql.(*DB).retry()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1576 +0x4a
  database/sql.(*DB).ExecContext()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1671 +0x184
  github.com/firefart/websitewatcher/internal/database.newDatabase()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:116 +0xb0d
  github.com/firefart/websitewatcher/internal/database.New()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:53 +0x19d
  github.com/firefart/websitewatcher/internal/database_test.TestUpdateLastContent()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database_test.go:95 +0x3d0
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.(*T).Run.gowrap1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x44

Previous write at 0x00000151e400 by goroutine 9:
  modernc.org/sqlite/lib._sqlite3MutexInit()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:16643 +0x109
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:163731 +0x7d
  modernc.org/sqlite/lib._openDatabase()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166455 +0x268
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/lib/sqlite_linux_amd64.go:166674 +0x204
  modernc.org/sqlite.(*conn).openV2()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1393 +0x1c9
  modernc.org/sqlite.newConn()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:845 +0x21d
  modernc.org/sqlite.(*Driver).Open()
      /home/runner/go/pkg/mod/modernc.org/sqlite@v1.37.0/sqlite.go:1999 +0x53
  database/sql.dsnConnector.Connect()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:809 +0x61
  database/sql.(*dsnConnector).Connect()
      <autogenerated>:1 +0x1f
  database/sql.(*DB).conn()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1431 +0xed0
  database/sql.(*DB).exec()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1689 +0x93
  database/sql.(*DB).ExecContext.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1672 +0xd5
  database/sql.(*DB).retry()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1576 +0x4a
  database/sql.(*DB).ExecContext()
      /opt/hostedtoolcache/go/1.24.3/x64/src/database/sql/sql.go:1671 +0x184
  github.com/firefart/websitewatcher/internal/database.newDatabase()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:116 +0xb0d
  github.com/firefart/websitewatcher/internal/database.New()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database.go:53 +0x19d
  github.com/firefart/websitewatcher/internal/database_test.TestNew()
      /home/runner/work/websitewatcher/websitewatcher/internal/database/database_test.go:31 +0x3cf
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.(*T).Run.gowrap1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x44

Goroutine 11 (running) created at:
  testing.(*T).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x8f2
  testing.runTests.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2279 +0x85
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.runTests()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2277 +0x96c
  testing.(*M).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2142 +0xeea
  main.main()
      _testmain.go:65 +0x164

Goroutine 9 (running) created at:
  testing.(*T).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1851 +0x8f2
  testing.runTests.func1()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2279 +0x85
  testing.tRunner()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:1792 +0x225
  testing.runTests()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2277 +0x96c
  testing.(*M).Run()
      /opt/hostedtoolcache/go/1.24.3/x64/src/testing/testing.go:2142 +0xeea
  main.main()
      _testmain.go:65 +0x164
==================
--- FAIL: TestNew (0.15s)
    testing.go:1490: race detected during execution of test
--- FAIL: TestPrepareDatabase (0.16s)
    testing.go:1490: race detected during execution of test
--- FAIL: TestUpdateLastContent (0.16s)
    testing.go:1490: race detected during execution of test
--- FAIL: TestInsertAndGetLastContent (0.16s)
    testing.go:1490: race detected during execution of test
FAIL
coverage: 73.8% of statements
FAIL	github.com/firefart/websitewatcher/internal/database	0.204s
	github.com/firefart/websitewatcher/internal/database/sqlc		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/diff		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/helper		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/http		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/mail		coverage: 0.0% of statements
	github.com/firefart/websitewatcher/internal/taskmanager		coverage: 0.0% of statements
ok  	github.com/firefart/websitewatcher/internal/watch	1.015s	coverage: 23.8% of statements
	github.com/firefart/websitewatcher/internal/webhook		coverage: 0.0% of statements
FAIL
task: Failed to run task "test": exit status 1
Edited by firefart