Skip to content

Race in ./lib.unixTempFileDir

Running go test -race ./... on https://github.com/anacrolix/torrent/commit/3ab251fcf547c7682a76b511847525f3c84090aa. This seems to occur regardless of what version of modernc.org/sqlite I use. It looks like a race in the original C implementation?

==================
WARNING: DATA RACE
Read at 0x00000647ba48 by goroutine 351:
  modernc.org/sqlite/lib.unixTempFileDir()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:39978 +0x14e
  modernc.org/sqlite/lib.unixGetTempname()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:40020 +0x11d
  modernc.org/sqlite/lib.unixOpen()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:40328 +0x23a
  modernc.org/sqlite/lib.Xsqlite3OsOpen()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:19946 +0x1a2
  modernc.org/sqlite/lib.memjrnlCreateFile()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:93551 +0xd8
  modernc.org/sqlite/lib.memjrnlWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:93591 +0x13d
  modernc.org/sqlite/lib.Xsqlite3OsWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:19811 +0x4a2
  modernc.org/sqlite/lib.subjournalPage()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:50374 +0x2ed
  modernc.org/sqlite/lib.subjournalPageIfRequired()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:50388 +0x49
  modernc.org/sqlite/lib.Xsqlite3PagerWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:52090 +0x1ca
  modernc.org/sqlite/lib.Xsqlite3BtreeUpdateMeta()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:68628 +0x2dd
  modernc.org/sqlite/lib.Xsqlite3VdbeExec()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:85256 +0x1a644
  modernc.org/sqlite/lib.sqlite3Step()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:77016 +0x80b
  modernc.org/sqlite/lib.Xsqlite3_step()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:77094 +0x22d
  zombiezen.com/go/sqlite.(*Stmt).step()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlite.go:637 +0x145
  zombiezen.com/go/sqlite.(*Stmt).Step()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlite.go:623 +0x14e
  zombiezen.com/go/sqlite/sqlitex.ExecScript()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlitex/exec.go:302 +0x210
  github.com/anacrolix/squirrel.InitSchema()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/conn.go:128 +0xfd
  github.com/anacrolix/squirrel.initDatabase()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/conn.go:165 +0x64
  github.com/anacrolix/squirrel.NewCache()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/cache.go:33 +0xcc
  github.com/anacrolix/torrent/storage/sqlite.NewDirectStorage()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/storage/sqlite/direct.go:19 +0x57
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func1()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:333 +0xcc
  github.com/anacrolix/torrent/test.testClientTransfer()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:111 +0x5dd
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func2.1.1.2()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:362 +0x164
  testing.tRunner()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1259 +0x22f
  testing.(*T).Run·dwrap·21()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x47

Previous write at 0x00000647ba48 by goroutine 293:
  modernc.org/sqlite/lib.unixTempFileDir()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:39979 +0x195
  modernc.org/sqlite/lib.unixGetTempname()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:40020 +0x11d
  modernc.org/sqlite/lib.unixOpen()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:40328 +0x23a
  modernc.org/sqlite/lib.Xsqlite3OsOpen()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:19946 +0x1a2
  modernc.org/sqlite/lib.memjrnlCreateFile()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:93551 +0xd8
  modernc.org/sqlite/lib.memjrnlWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:93591 +0x13d
  modernc.org/sqlite/lib.Xsqlite3OsWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:19811 +0x4a2
  modernc.org/sqlite/lib.subjournalPage()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:50374 +0x2ed
  modernc.org/sqlite/lib.subjournalPageIfRequired()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:50388 +0x49
  modernc.org/sqlite/lib.Xsqlite3PagerWrite()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:52090 +0x1ca
  modernc.org/sqlite/lib.Xsqlite3BtreeUpdateMeta()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:68628 +0x2dd
  modernc.org/sqlite/lib.Xsqlite3VdbeExec()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:85256 +0x1a644
  modernc.org/sqlite/lib.sqlite3Step()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:77016 +0x80b
  modernc.org/sqlite/lib.Xsqlite3_step()
      /Users/anacrolix/go/pkg/mod/modernc.org/sqlite@v1.14.1/lib/sqlite_darwin_amd64.go:77094 +0x22d
  zombiezen.com/go/sqlite.(*Stmt).step()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlite.go:637 +0x145
  zombiezen.com/go/sqlite.(*Stmt).Step()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlite.go:623 +0x14e
  zombiezen.com/go/sqlite/sqlitex.ExecScript()
      /Users/anacrolix/go/pkg/mod/zombiezen.com/go/sqlite@v0.8.0/sqlitex/exec.go:302 +0x210
  github.com/anacrolix/squirrel.InitSchema()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/conn.go:128 +0xfd
  github.com/anacrolix/squirrel.initDatabase()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/conn.go:165 +0x64
  github.com/anacrolix/squirrel.NewCache()
      /Users/anacrolix/go/src/github.com/anacrolix/squirrel/cache.go:33 +0xcc
  github.com/anacrolix/torrent/storage/sqlite.NewDirectStorage()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/storage/sqlite/direct.go:19 +0x57
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func1()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:333 +0xcc
  github.com/anacrolix/torrent/test.testClientTransfer()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:111 +0x5dd
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func2.1.1.2()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:362 +0x164
  testing.tRunner()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1259 +0x22f
  testing.(*T).Run·dwrap·21()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x47

Goroutine 351 (running) created at:
  testing.(*T).Run()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x726
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func2.1.1()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:361 +0x204
  testing.tRunner()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1259 +0x22f
  testing.(*T).Run·dwrap·21()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x47

Goroutine 293 (running) created at:
  testing.(*T).Run()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x726
  github.com/anacrolix/torrent/test.TestClientTransferVarious.func2.1.1()
      /Users/anacrolix/go/src/github.com/anacrolix/torrent/test/transfer_test.go:361 +0x204
  testing.tRunner()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1259 +0x22f
  testing.(*T).Run·dwrap·21()
      /Users/anacrolix/src/go1.17/src/testing/testing.go:1306 +0x47
==================