]> Cypherpunks repositories - gostls13.git/commitdiff
database/sql: fix accumulation of bad conns on prepared statements
authorMatt Joiner <anacrolix@gmail.com>
Wed, 14 Aug 2013 16:27:30 +0000 (09:27 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 14 Aug 2013 16:27:30 +0000 (09:27 -0700)
Fixes an issue where prepared statements that outlive many
connections become expensive to invoke.

Fixes #6081

R=golang-dev
CC=bradfitz, golang-dev
https://golang.org/cl/12646044

src/pkg/database/sql/sql.go
src/pkg/database/sql/sql_test.go

index 352a7e82d94c55bb8cca59623e4fcac620bd8cd2..f0c86a8aeb2289a09b9b5fef87467585beedf939 100644 (file)
@@ -518,12 +518,12 @@ var (
 func (db *DB) connIfFree(wanted *driverConn) (*driverConn, error) {
        db.mu.Lock()
        defer db.mu.Unlock()
-       if wanted.inUse {
-               return nil, errConnBusy
-       }
        if wanted.dbmuClosed {
                return nil, errConnClosed
        }
+       if wanted.inUse {
+               return nil, errConnBusy
+       }
        for i, conn := range db.freeConn {
                if conn != wanted {
                        continue
@@ -590,6 +590,7 @@ func (db *DB) putConn(dc *driverConn, err error) {
        if err == driver.ErrBadConn {
                // Don't reuse bad connections.
                db.mu.Unlock()
+               dc.Close()
                return
        }
        if putConnHook != nil {
index 2b9347aedaab94316ff02eaed96ca7e944e34c2d..693f5e3a3c50589bcd39aaf18341bc219047fd94 100644 (file)
@@ -1112,7 +1112,6 @@ func manyConcurrentQueries(t testOrBench) {
 }
 
 func TestIssue6081(t *testing.T) {
-       t.Skip("known broken test")
        db := newTestDB(t, "people")
        defer closeDB(t, db)