]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.8] database/sql: ensure driverConns are closed if not returned...
authorDaniel Theophanes <kardianos@gmail.com>
Thu, 9 Feb 2017 05:38:51 +0000 (21:38 -0800)
committerRuss Cox <rsc@golang.org>
Fri, 10 Feb 2017 17:53:36 +0000 (17:53 +0000)
Previously if a connection was requested but timed out during the
request and when acquiring the db.Lock the connection request
is fulfilled and the request is unable to be returned to the
connection pool, then then driver connection would not be closed.

No tests were added or modified because I was unable to determine
how to trigger this situation without something invasive.

Change-Id: I9d4dc680e3fdcf63d79d212174a5b8b313f363f1
Reviewed-on: https://go-review.googlesource.com/36641
Reviewed-by: Russ Cox <rsc@golang.org>
Reviewed-on: https://go-review.googlesource.com/36714
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/database/sql/sql.go

index 1e27b17cf9afa99bf607050df169e268338ebd8e..c016681fca13c305aaea2cbfd6fc0707135c5827 100644 (file)
@@ -939,14 +939,14 @@ func (db *DB) conn(ctx context.Context, strategy connReuseStrategy) (*driverConn
                        // on it after removing.
                        db.mu.Lock()
                        delete(db.connRequests, reqKey)
+                       db.mu.Unlock()
                        select {
                        default:
                        case ret, ok := <-req:
                                if ok {
-                                       db.putConnDBLocked(ret.conn, ret.err)
+                                       db.putConn(ret.conn, ret.err)
                                }
                        }
-                       db.mu.Unlock()
                        return nil, ctx.Err()
                case ret, ok := <-req:
                        if !ok {