diff --git a/protocol/dubbo/pool.go b/protocol/dubbo/pool.go index 62d3c4b0c44c323f9553648fafe4e7da074eff01..bff231e58156e34002d54de6d692462936012778 100644 --- a/protocol/dubbo/pool.go +++ b/protocol/dubbo/pool.go @@ -250,6 +250,13 @@ func (c *gettyRPCClient) close() error { return closeErr } +func (c *gettyRPCClient) safeClose() error { + c.lock.Lock() + defer c.lock.Unlock() + + return c.close() +} + type gettyRPCClientPool struct { rpcClient *Client size int // size of []*gettyRPCClient @@ -270,11 +277,11 @@ func newGettyRPCClientConnPool(rpcClient *Client, size int, ttl time.Duration) * func (p *gettyRPCClientPool) close() { p.Lock() - defer p.Unlock() conns := p.conns p.conns = nil + p.Unlock() for _, conn := range conns { - conn.close() + conn.safeClose() } } @@ -293,7 +300,7 @@ func (p *gettyRPCClientPool) getGettyRpcClient(protocol, addr string) (*gettyRPC p.conns = p.conns[:len(p.conns)-1] if d := now - conn.getActive(); d > p.ttl { - if closeErr := conn.close(); closeErr != nil { + if closeErr := conn.safeClose(); closeErr != nil { p.remove(conn) } continue @@ -311,20 +318,20 @@ func (p *gettyRPCClientPool) release(conn *gettyRPCClient, err error) { return } - p.Lock() - defer p.Unlock() - if err != nil { - conn.close() + conn.safeClose() return } + p.Lock() + defer p.Unlock() + if p.conns == nil { return } if len(p.conns) >= p.size { - if closeErr := conn.close(); closeErr != nil { + if closeErr := conn.safeClose(); closeErr != nil { // delete @conn from client pool p.remove(conn) }