lib / pq

Pure Go Postgres driver for database/sql
https://pkg.go.dev/github.com/lib/pq
MIT License
9.02k stars 910 forks source link

race on unix when using postgresql unix socket #908

Open yansal opened 4 years ago

yansal commented 4 years ago

Here is a small program to reproduce the race:

func main() {
    databaseURL := os.Getenv("DATABASE_URL")
    pqconnector, err := pq.NewConnector(databaseURL)
    if err != nil {
        log.Fatal(err)
    }
    db := sql.OpenDB(pqconnector)

    const n = 2
    var wg sync.WaitGroup
    wg.Add(n)
    for i := 0; i < n; i++ {
        go func() {
            defer wg.Done()
            var now time.Time
            if err := db.QueryRowContext(context.Background(), `select now()`).Scan(&now); err != nil {
                log.Fatal(err)
            }
        }()
    }
    wg.Wait()
}

Run with the following commands:

go build -race -trimpath
DATABASE_URL="host=/path/to/postgresql/unix/socket/directory" ./pqrace
==================
WARNING: DATA RACE
Write at 0x00c00008c720 by goroutine 9:
  runtime.mapassign_faststr()
      runtime/map_faststr.go:202 +0x0
  github.com/lib/pq.dial()
      github.com/lib/pq@v1.2.0/conn.go:334 +0x6c9
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:298 +0x295
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Previous read at 0x00c00008c720 by goroutine 10:
  runtime.mapaccess1_faststr()
      runtime/map_faststr.go:12 +0x0
  github.com/lib/pq.(*conn).handlePgpass()
      github.com/lib/pq@v1.2.0/conn.go:211 +0x21c
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:296 +0x23f
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Goroutine 9 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b

Goroutine 10 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b
==================
==================
WARNING: DATA RACE
Read at 0x00c00008c720 by goroutine 10:
  runtime.mapaccess1_faststr()
      runtime/map_faststr.go:12 +0x0
  github.com/lib/pq.network()
      github.com/lib/pq@v1.2.0/conn.go:371 +0x71
  github.com/lib/pq.dial()
      github.com/lib/pq@v1.2.0/conn.go:331 +0x66
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:298 +0x295
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Previous write at 0x00c00008c720 by goroutine 9:
  runtime.mapassign_faststr()
      runtime/map_faststr.go:202 +0x0
  github.com/lib/pq.dial()
      github.com/lib/pq@v1.2.0/conn.go:334 +0x6c9
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:298 +0x295
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Goroutine 10 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b

Goroutine 9 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b
==================
==================
WARNING: DATA RACE
Write at 0x00c0000ba328 by goroutine 10:
  github.com/lib/pq.dial()
      github.com/lib/pq@v1.2.0/conn.go:334 +0x6e1
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:298 +0x295
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Previous write at 0x00c0000ba328 by goroutine 9:
  github.com/lib/pq.dial()
      github.com/lib/pq@v1.2.0/conn.go:334 +0x6e1
  github.com/lib/pq.(*Connector).open()
      github.com/lib/pq@v1.2.0/conn.go:298 +0x295
  github.com/lib/pq.(*Connector).Connect()
      github.com/lib/pq@v1.2.0/connector.go:27 +0x50
  database/sql.(*DB).conn()
      database/sql/sql.go:1228 +0xa15
  database/sql.(*DB).query()
      database/sql/sql.go:1565 +0x76
  database/sql.(*DB).QueryContext()
      database/sql/sql.go:1547 +0xe4
  main.main.func1()
      database/sql/sql.go:1648 +0x12a

Goroutine 10 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b

Goroutine 9 (running) created at:
  main.main()
      pqrace@/main.go:26 +0x15b
==================
Found 3 data race(s)
sfllaw commented 4 years ago

This looks like it's a duplicate of #847.