]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.11] database/sql: correctly report MaxIdleClosed stat
authorDaniel Theophanes <kardianos@gmail.com>
Sun, 30 Sep 2018 05:10:43 +0000 (22:10 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 1 Nov 2018 18:40:52 +0000 (18:40 +0000)
Previously the MaxIdleClosed counter was incremented when added
to the free connection list, rather then when it wasn't added
to the free connection list. Flip this logic to correct.

Fixes #28325

Change-Id: I405302c14fb985369dab48fbe845e5651afc4ccf
Reviewed-on: https://go-review.googlesource.com/c/138578
Run-TryBot: Daniel Theophanes <kardianos@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
(cherry picked from commit 7db509e682891f3bc501c7b23e32e02c64893557)
Reviewed-on: https://go-review.googlesource.com/c/146697
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Andrew Bonventre <andybons@golang.org>
Reviewed-by: Daniel Theophanes <kardianos@gmail.com>
src/database/sql/sql.go
src/database/sql/sql_test.go

index 36179855db2b6d247e7258913222fc6794bc72ad..44840b879834e40312f22df1ae883929b0090b7d 100644 (file)
@@ -1322,11 +1322,13 @@ func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
                        err:  err,
                }
                return true
-       } else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
-               db.freeConn = append(db.freeConn, dc)
+       } else if err == nil && !db.closed {
+               if db.maxIdleConnsLocked() > len(db.freeConn) {
+                       db.freeConn = append(db.freeConn, dc)
+                       db.startCleanerLocked()
+                       return true
+               }
                db.maxIdleClosed++
-               db.startCleanerLocked()
-               return true
        }
        return false
 }
index f194744aefe727b0b0e51039de90c0fb29ac4345..e52091c3afd0c36d46ba4c9baaa32d840ddd033f 100644 (file)
@@ -3415,6 +3415,58 @@ func TestConnectionLeak(t *testing.T) {
        wg.Wait()
 }
 
+func TestStatsMaxIdleClosedZero(t *testing.T) {
+       db := newTestDB(t, "people")
+       defer closeDB(t, db)
+
+       db.SetMaxOpenConns(1)
+       db.SetMaxIdleConns(1)
+       db.SetConnMaxLifetime(0)
+
+       preMaxIdleClosed := db.Stats().MaxIdleClosed
+
+       for i := 0; i < 10; i++ {
+               rows, err := db.Query("SELECT|people|name|")
+               if err != nil {
+                       t.Fatal(err)
+               }
+               rows.Close()
+       }
+
+       st := db.Stats()
+       maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
+       t.Logf("MaxIdleClosed: %d", maxIdleClosed)
+       if maxIdleClosed != 0 {
+               t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
+       }
+}
+
+func TestStatsMaxIdleClosedTen(t *testing.T) {
+       db := newTestDB(t, "people")
+       defer closeDB(t, db)
+
+       db.SetMaxOpenConns(1)
+       db.SetMaxIdleConns(0)
+       db.SetConnMaxLifetime(0)
+
+       preMaxIdleClosed := db.Stats().MaxIdleClosed
+
+       for i := 0; i < 10; i++ {
+               rows, err := db.Query("SELECT|people|name|")
+               if err != nil {
+                       t.Fatal(err)
+               }
+               rows.Close()
+       }
+
+       st := db.Stats()
+       maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
+       t.Logf("MaxIdleClosed: %d", maxIdleClosed)
+       if maxIdleClosed != 10 {
+               t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
+       }
+}
+
 type nvcDriver struct {
        fakeDriver
        skipNamedValueCheck bool