From 4868929ff11d08ee39bddf96d3a1f445a8ba47d1 Mon Sep 17 00:00:00 2001 From: Joseph Glanville Date: Fri, 11 Sep 2015 03:05:39 +1000 Subject: [PATCH] ConnPool.Begin/BeginIso will retry if they Acquire a dead connection --- conn_pool.go | 52 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/conn_pool.go b/conn_pool.go index 041ac830..0c5f87f7 100644 --- a/conn_pool.go +++ b/conn_pool.go @@ -214,34 +214,46 @@ func (p *ConnPool) QueryRow(sql string, args ...interface{}) *Row { // Begin acquires a connection and begins a transaction on it. When the // transaction is closed the connection will be automatically released. func (p *ConnPool) Begin() (*Tx, error) { - c, err := p.Acquire() - if err != nil { - return nil, err - } + for { + c, err := p.Acquire() + if err != nil { + return nil, err + } - tx, err := c.Begin() - if err != nil { - return nil, err - } + tx, err := c.Begin() + if err == ErrDeadConn { + p.Release(c) + continue + } + if err != nil { + return nil, err + } - tx.pool = p - return tx, nil + tx.pool = p + return tx, nil + } } // BeginIso acquires a connection and begins a transaction in isolation mode iso // on it. When the transaction is closed the connection will be automatically // released. func (p *ConnPool) BeginIso(iso string) (*Tx, error) { - c, err := p.Acquire() - if err != nil { - return nil, err - } + for { + c, err := p.Acquire() + if err != nil { + return nil, err + } - tx, err := c.BeginIso(iso) - if err != nil { - return nil, err - } + tx, err := c.BeginIso(iso) + if err == ErrDeadConn { + p.Release(c) + continue + } + if err != nil { + return nil, err + } - tx.pool = p - return tx, nil + tx.pool = p + return tx, nil + } }