Skip to content

Commit 369c188

Browse files
kardianosbradfitz
authored andcommitted
[release-branch.go1.11] database/sql: correctly report MaxIdleClosed stat
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]> (cherry picked from commit 7db509e) Reviewed-on: https://go-review.googlesource.com/c/146697 Run-TryBot: Brad Fitzpatrick <[email protected]> Reviewed-by: Andrew Bonventre <[email protected]> Reviewed-by: Daniel Theophanes <[email protected]>
1 parent eb46d15 commit 369c188

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

src/database/sql/sql.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1322,11 +1322,13 @@ func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
13221322
err: err,
13231323
}
13241324
return true
1325-
} else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
1326-
db.freeConn = append(db.freeConn, dc)
1325+
} else if err == nil && !db.closed {
1326+
if db.maxIdleConnsLocked() > len(db.freeConn) {
1327+
db.freeConn = append(db.freeConn, dc)
1328+
db.startCleanerLocked()
1329+
return true
1330+
}
13271331
db.maxIdleClosed++
1328-
db.startCleanerLocked()
1329-
return true
13301332
}
13311333
return false
13321334
}

src/database/sql/sql_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3415,6 +3415,58 @@ func TestConnectionLeak(t *testing.T) {
34153415
wg.Wait()
34163416
}
34173417

3418+
func TestStatsMaxIdleClosedZero(t *testing.T) {
3419+
db := newTestDB(t, "people")
3420+
defer closeDB(t, db)
3421+
3422+
db.SetMaxOpenConns(1)
3423+
db.SetMaxIdleConns(1)
3424+
db.SetConnMaxLifetime(0)
3425+
3426+
preMaxIdleClosed := db.Stats().MaxIdleClosed
3427+
3428+
for i := 0; i < 10; i++ {
3429+
rows, err := db.Query("SELECT|people|name|")
3430+
if err != nil {
3431+
t.Fatal(err)
3432+
}
3433+
rows.Close()
3434+
}
3435+
3436+
st := db.Stats()
3437+
maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
3438+
t.Logf("MaxIdleClosed: %d", maxIdleClosed)
3439+
if maxIdleClosed != 0 {
3440+
t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
3441+
}
3442+
}
3443+
3444+
func TestStatsMaxIdleClosedTen(t *testing.T) {
3445+
db := newTestDB(t, "people")
3446+
defer closeDB(t, db)
3447+
3448+
db.SetMaxOpenConns(1)
3449+
db.SetMaxIdleConns(0)
3450+
db.SetConnMaxLifetime(0)
3451+
3452+
preMaxIdleClosed := db.Stats().MaxIdleClosed
3453+
3454+
for i := 0; i < 10; i++ {
3455+
rows, err := db.Query("SELECT|people|name|")
3456+
if err != nil {
3457+
t.Fatal(err)
3458+
}
3459+
rows.Close()
3460+
}
3461+
3462+
st := db.Stats()
3463+
maxIdleClosed := st.MaxIdleClosed - preMaxIdleClosed
3464+
t.Logf("MaxIdleClosed: %d", maxIdleClosed)
3465+
if maxIdleClosed != 10 {
3466+
t.Fatal("expected 0 max idle closed conns, got: ", maxIdleClosed)
3467+
}
3468+
}
3469+
34183470
type nvcDriver struct {
34193471
fakeDriver
34203472
skipNamedValueCheck bool

0 commit comments

Comments
 (0)