fix: limit the number of connections created (#2441)

* fix: limit the number of connections created

Signed-off-by: monkey92t <golang@88.com>
This commit is contained in:
Monkey 2023-02-14 18:01:53 +08:00 committed by GitHub
parent 0d306237c7
commit 3532f2a414
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 11 deletions

View File

@ -112,18 +112,25 @@ func (p *ConnPool) checkMinIdleConns() {
return return
} }
for p.poolSize < p.cfg.PoolSize && p.idleConnsLen < p.cfg.MinIdleConns { for p.poolSize < p.cfg.PoolSize && p.idleConnsLen < p.cfg.MinIdleConns {
p.poolSize++ select {
p.idleConnsLen++ case p.queue <- struct{}{}:
p.poolSize++
p.idleConnsLen++
go func() { go func() {
err := p.addIdleConn() err := p.addIdleConn()
if err != nil && err != ErrClosed { if err != nil && err != ErrClosed {
p.connsMu.Lock() p.connsMu.Lock()
p.poolSize-- p.poolSize--
p.idleConnsLen-- p.idleConnsLen--
p.connsMu.Unlock() p.connsMu.Unlock()
} }
}()
p.freeTurn()
}()
default:
return
}
} }
} }
@ -401,6 +408,7 @@ func (p *ConnPool) removeConn(cn *Conn) {
break break
} }
} }
atomic.AddUint32(&p.stats.StaleConns, 1)
} }
func (p *ConnPool) closeConn(cn *Conn) error { func (p *ConnPool) closeConn(cn *Conn) error {

View File

@ -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: 1000,
MinIdleConns: 50,
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)))
})
}) })