Skip to content

Commit

Permalink
Add connection pool queuing strategies in HostClient. (#1238)
Browse files Browse the repository at this point in the history
* At first, we implement LIFO(conventional) and FIFO which indicate in #1236
* Change default strategy FIFO
  • Loading branch information
u5surf committed Mar 15, 2022
1 parent f7423e3 commit 8f5e51f
Showing 1 changed file with 29 additions and 4 deletions.
33 changes: 29 additions & 4 deletions client.go
Expand Up @@ -618,6 +618,14 @@ type RetryIfFunc func(request *Request) bool
// TransportFunc wraps every request/response.
type TransportFunc func(*Request, *Response) error

// ConnPoolStrategyType define strategy of connection pool enqueue/dequeue
type ConnPoolStrategyType int

const (
FIFO ConnPoolStrategyType = iota
LIFO
)

// HostClient balances http requests among hosts listed in Addr.
//
// HostClient may be used for balancing load among multiple upstream hosts.
Expand Down Expand Up @@ -772,6 +780,9 @@ type HostClient struct {
// Transport defines a transport-like mechanism that wraps every request/response.
Transport TransportFunc

// Connection pool strategy. Can be either LIFO or FIFO (default).
ConnPoolStrategy ConnPoolStrategyType

clientName atomic.Value
lastUseTime uint32

Expand Down Expand Up @@ -1497,6 +1508,10 @@ var (
// to broken server.
ErrConnectionClosed = errors.New("the server closed connection before returning the first response byte. " +
"Make sure the server returns 'Connection: close' response header before closing the connection")

// ErrConnPoolStrategyNotImpl is returned when HostClient.ConnPoolStrategy is not implement yet.
// If you see this error, then you need to check your HostClient configuration.
ErrConnPoolStrategyNotImpl = errors.New("connection pool strategy is not implement")
)

type timeoutError struct{}
Expand Down Expand Up @@ -1544,10 +1559,20 @@ func (c *HostClient) acquireConn(reqTimeout time.Duration, connectionClose bool)
}
}
} else {
n--
cc = c.conns[n]
c.conns[n] = nil
c.conns = c.conns[:n]
switch c.ConnPoolStrategy {
case LIFO:
n--
cc = c.conns[n]
c.conns[n] = nil
c.conns = c.conns[:n]
case FIFO:
cc = c.conns[0]
copy(c.conns, c.conns[1:])
c.conns[n-1] = nil
c.conns = c.conns[:n-1]
default:
return nil, ErrConnPoolStrategyNotImpl
}
}
c.connsLock.Unlock()

Expand Down

0 comments on commit 8f5e51f

Please sign in to comment.