From 39b096d01e17dd37adfcaae297fcd67a1f0b1d8c Mon Sep 17 00:00:00 2001 From: Jack Christensen Date: Thu, 20 Aug 2020 22:04:56 -0500 Subject: [PATCH] pgxpool waits for connection cleanup to finish before making room in pool refs #679 --- go.mod | 6 +++--- go.sum | 6 ++++++ pgxpool/pool.go | 9 +++++++-- pgxpool/pool_test.go | 10 ++++++++-- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index a6f31432..0cc5e003 100644 --- a/go.mod +++ b/go.mod @@ -5,11 +5,11 @@ go 1.12 require ( github.com/cockroachdb/apd v1.1.0 github.com/gofrs/uuid v3.2.0+incompatible - github.com/jackc/pgconn v1.6.4 + github.com/jackc/pgconn v1.6.5-0.20200821030021-3eb5432c4738 github.com/jackc/pgio v1.0.0 - github.com/jackc/pgproto3/v2 v2.0.2 + github.com/jackc/pgproto3/v2 v2.0.4 github.com/jackc/pgtype v1.4.2 - github.com/jackc/puddle v1.1.1 + github.com/jackc/puddle v1.1.2-0.20200821025810-91d0159cc97a github.com/mattn/go-colorable v0.1.6 // indirect github.com/rs/zerolog v1.15.0 github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc diff --git a/go.sum b/go.sum index b53f5875..83088ac9 100644 --- a/go.sum +++ b/go.sum @@ -40,6 +40,8 @@ github.com/jackc/pgconn v1.6.3 h1:4Ks3RKvSvKPolXZsnLQTDAsokDhgID14Cv4ehECmzlY= github.com/jackc/pgconn v1.6.3/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= github.com/jackc/pgconn v1.6.4 h1:S7T6cx5o2OqmxdHaXLH1ZeD1SbI8jBznyYE9Ec0RCQ8= github.com/jackc/pgconn v1.6.4/go.mod h1:w2pne1C2tZgP+TvjqLpOigGzNqjBgQW9dUw/4Chex78= +github.com/jackc/pgconn v1.6.5-0.20200821030021-3eb5432c4738 h1:t/IRFEw2da5v6DroUIYPbEIDWxGGyvVLItoO7gOUBZM= +github.com/jackc/pgconn v1.6.5-0.20200821030021-3eb5432c4738/go.mod h1:gm9GeeZiC+Ja7JV4fB/MNDeaOqsCrzFiZlLVhAompxk= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= @@ -59,6 +61,8 @@ github.com/jackc/pgproto3/v2 v2.0.1 h1:Rdjp4NFjwHnEslx2b66FfCI2S0LhO4itac3hXz6WX github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.2 h1:q1Hsy66zh4vuNsajBUF2PNqfAMMfxU5mk594lPE9vjY= github.com/jackc/pgproto3/v2 v2.0.2/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= +github.com/jackc/pgproto3/v2 v2.0.4 h1:RHkX5ZUD9bl/kn0f9dYUWs1N7Nwvo1wwUYvKiR26Zco= +github.com/jackc/pgproto3/v2 v2.0.4/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8 h1:Q3tB+ExeflWUW7AFcAhXqk40s9mnNYLk1nOkKNZ5GnU= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= @@ -95,6 +99,8 @@ github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0f github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1 h1:PJAw7H/9hoWC4Kf3J8iNmL1SwA6E8vfsLqBiL+F6CtI= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.1.2-0.20200821025810-91d0159cc97a h1:ec2LCBkfN1pOq0PhLRH/QitjSXr9s2dnh0gOFyohxHM= +github.com/jackc/puddle v1.1.2-0.20200821025810-91d0159cc97a/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= diff --git a/pgxpool/pool.go b/pgxpool/pool.go index fb7d3017..7d9e86f2 100644 --- a/pgxpool/pool.go +++ b/pgxpool/pool.go @@ -190,8 +190,13 @@ func ConnectConfig(ctx context.Context, config *Config) (*Pool, error) { return cr, nil }, func(value interface{}) { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - value.(*connResource).conn.Close(ctx) + ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) + conn := value.(*connResource).conn + conn.Close(ctx) + select { + case <-conn.PgConn().CleanupChan(): + case <-ctx.Done(): + } cancel() }, config.MaxConns, diff --git a/pgxpool/pool_test.go b/pgxpool/pool_test.go index 17be648f..4cc1e1a3 100644 --- a/pgxpool/pool_test.go +++ b/pgxpool/pool_test.go @@ -609,6 +609,12 @@ func TestConnReleaseWhenBeginFail(t *testing.T) { assert.NoError(t, err) } - stats := db.Stat() - assert.EqualValues(t, 0, stats.TotalConns()) + for i := 0; i < 1000; i++ { + if db.Stat().TotalConns() == 0 { + break + } + time.Sleep(time.Millisecond) + } + + assert.EqualValues(t, 0, db.Stat().TotalConns()) }