mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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 <kardianos@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
9aed4cc395
commit
7db509e682
2 changed files with 58 additions and 4 deletions
|
|
@ -1322,12 +1322,14 @@ func (db *DB) putConnDBLocked(dc *driverConn, err error) bool {
|
|||
err: err,
|
||||
}
|
||||
return true
|
||||
} else if err == nil && !db.closed && db.maxIdleConnsLocked() > len(db.freeConn) {
|
||||
} else if err == nil && !db.closed {
|
||||
if db.maxIdleConnsLocked() > len(db.freeConn) {
|
||||
db.freeConn = append(db.freeConn, dc)
|
||||
db.maxIdleClosed++
|
||||
db.startCleanerLocked()
|
||||
return true
|
||||
}
|
||||
db.maxIdleClosed++
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue