From 640c1850b49781ae6c3d69095407512ef75d8193 Mon Sep 17 00:00:00 2001 From: monkey92t Date: Mon, 13 Feb 2023 16:06:36 +0800 Subject: [PATCH 1/2] fix: limit the number of connections created Signed-off-by: monkey92t --- internal/pool/pool.go | 32 ++++++++++++++++++++------------ internal/pool/pool_test.go | 26 ++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 12 deletions(-) diff --git a/internal/pool/pool.go b/internal/pool/pool.go index bd17a0284..bb9b14beb 100644 --- a/internal/pool/pool.go +++ b/internal/pool/pool.go @@ -112,18 +112,25 @@ func (p *ConnPool) checkMinIdleConns() { return } for p.poolSize < p.cfg.PoolSize && p.idleConnsLen < p.cfg.MinIdleConns { - p.poolSize++ - p.idleConnsLen++ - - go func() { - err := p.addIdleConn() - if err != nil && err != ErrClosed { - p.connsMu.Lock() - p.poolSize-- - p.idleConnsLen-- - p.connsMu.Unlock() - } - }() + select { + case p.queue <- struct{}{}: + p.poolSize++ + p.idleConnsLen++ + + go func() { + err := p.addIdleConn() + if err != nil && err != ErrClosed { + p.connsMu.Lock() + p.poolSize-- + p.idleConnsLen-- + p.connsMu.Unlock() + } + + p.freeTurn() + }() + default: + return + } } } @@ -401,6 +408,7 @@ func (p *ConnPool) removeConn(cn *Conn) { break } } + atomic.AddUint32(&p.stats.StaleConns, 1) } func (p *ConnPool) closeConn(cn *Conn) error { diff --git a/internal/pool/pool_test.go b/internal/pool/pool_test.go index 92fed14aa..b0f8db7f6 100644 --- a/internal/pool/pool_test.go +++ b/internal/pool/pool_test.go @@ -327,4 +327,30 @@ var _ = Describe("race", func() { } }) }) + + It("limit the number of connections", func() { + opt := &pool.Options{ + Dialer: func(ctx context.Context) (net.Conn, error) { + return &net.TCPConn{}, nil + }, + PoolSize: 10000, + MinIdleConns: 200, + PoolTimeout: 3 * time.Second, + } + p := pool.NewConnPool(opt) + + var wg sync.WaitGroup + for i := 0; i < opt.PoolSize; i++ { + wg.Add(1) + go func() { + defer wg.Done() + _, _ = p.Get(ctx) + }() + } + wg.Wait() + + stats := p.Stats() + Expect(stats.IdleConns).To(Equal(uint32(0))) + Expect(stats.TotalConns).To(Equal(uint32(opt.PoolSize))) + }) }) From 5aece8d5f941d9ac978ef6f57450427737095490 Mon Sep 17 00:00:00 2001 From: monkey92t Date: Mon, 13 Feb 2023 16:16:56 +0800 Subject: [PATCH 2/2] test: fix test error Signed-off-by: monkey92t --- internal/pool/pool_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/pool/pool_test.go b/internal/pool/pool_test.go index b0f8db7f6..76dec996b 100644 --- a/internal/pool/pool_test.go +++ b/internal/pool/pool_test.go @@ -333,8 +333,8 @@ var _ = Describe("race", func() { Dialer: func(ctx context.Context) (net.Conn, error) { return &net.TCPConn{}, nil }, - PoolSize: 10000, - MinIdleConns: 200, + PoolSize: 1000, + MinIdleConns: 50, PoolTimeout: 3 * time.Second, } p := pool.NewConnPool(opt)