go-sqlite icon indicating copy to clipboard operation
go-sqlite copied to clipboard

Xsqlite3_open_v2 (via sqlitex.Open) needs to be synchronized

Open peterbourgon opened this issue 4 years ago • 1 comments

module temp

go 1.16

require zombiezen.com/go/sqlite v0.5.0 // indirect
package main

import (
        "context"
        "fmt"
        "sync"

        "zombiezen.com/go/sqlite"
        "zombiezen.com/go/sqlite/sqlitex"
)

func main() {
        var wg sync.WaitGroup
        for i := 0; i < 32; i++ {
                go func() { defer wg.Done(); f() }()
        }
        wg.Wait()
}

func f() {
        var (
                ctx      = context.Background()
                uri      = "file::memory:?mode=memory&cache=shared"
                flags    = sqlite.OpenReadWrite | sqlite.OpenCreate | sqlite.OpenURI | sqlite.OpenNoMutex
                poolSize = 32
        )

        pool, err := sqlitex.Open(uri, flags, poolSize)
        if err != nil {
                panic(err)
        }
        defer pool.Close()

        conn := pool.Get(ctx)
        if conn == nil {
                panic(fmt.Errorf("nil conn"))
        }
        defer pool.Put(conn)

        if err := sqlitex.Exec(conn, `SELECT 1;`, nil); err != nil {
                panic(err)
        }
}
$ go run -race main.go
==================
WARNING: DATA RACE
Read at 0x000001b620d4 by goroutine 20:
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:158713 +0x158
  modernc.org/sqlite/lib.openDatabase()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:161013 +0x364
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:161348 +0x684
  zombiezen.com/go/sqlite.openConn()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlite.go:136 +0x648
  zombiezen.com/go/sqlite.OpenConn()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlite.go:80 +0xe7
  zombiezen.com/go/sqlite/sqlitex.Open()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlitex/pool.go:103 +0x2e8
  main.f()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:28 +0x8f
  main.main.func1()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:15 +0x64

Previous write at 0x000001b620d4 by goroutine 19:
  modernc.org/sqlite/lib.Xsqlite3_initialize()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:158728 +0x65b
  modernc.org/sqlite/lib.openDatabase()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:161013 +0x364
  modernc.org/sqlite/lib.Xsqlite3_open_v2()
      /Users/pbourgon/pkg/mod/modernc.org/[email protected]/lib/sqlite_darwin_amd64.go:161348 +0x684
  zombiezen.com/go/sqlite.openConn()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlite.go:136 +0x648
  zombiezen.com/go/sqlite.OpenConn()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlite.go:80 +0xe7
  zombiezen.com/go/sqlite/sqlitex.Open()
      /Users/pbourgon/pkg/mod/zombiezen.com/go/[email protected]/sqlitex/pool.go:103 +0x2e8
  main.f()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:28 +0x8f
  main.main.func1()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:15 +0x64

Goroutine 20 (running) created at:
  main.main()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:15 +0x94

Goroutine 19 (running) created at:
  main.main()
      /var/folders/m4/192hdv6n19j9x2v86k1r29rw0000gn/T/tmp.z2VKC9Xr/main.go:15 +0x94
==================
Found 1 data race(s)
exit status 66

Protecting the OpenConn call with a mutex solves it, apparently.

peterbourgon avatar Aug 10 '21 16:08 peterbourgon

I believe this is an upstream issue with non-linux/amd64 platforms, so filed https://gitlab.com/cznic/sqlite/-/issues/62.

zombiezen avatar Aug 15 '21 21:08 zombiezen

This has been fixed upstream.

zombiezen avatar Feb 03 '23 04:02 zombiezen