Skip to content

Commit 7db509e

Browse files
committed
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 #27792 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]>
1 parent 9aed4cc commit 7db509e

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)