Skip to content

Commit

Permalink
Allow FIFO pool in redis client (redis#1820)
Browse files Browse the repository at this point in the history
* Initial commit for FIFO pool

* Change PoolType string to PoolFIFO bool

* Remove redundant type

* add PoolFIFO option to all clients

Signed-off-by: monkey92t <[email protected]>

Co-authored-by: Kim Tae Kwon <[email protected]>
Co-authored-by: monkey92t <[email protected]>
  • Loading branch information
3 people authored Jul 16, 2021
1 parent 247c62a commit ce40cd9
Show file tree
Hide file tree
Showing 6 changed files with 38 additions and 4 deletions.
4 changes: 4 additions & 0 deletions cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ type ClusterOptions struct {
ReadTimeout time.Duration
WriteTimeout time.Duration

// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
PoolFIFO bool

// PoolSize applies per cluster node and not for the whole cluster.
PoolSize int
MinIdleConns int
Expand Down Expand Up @@ -146,6 +149,7 @@ func (opt *ClusterOptions) clientOptions() *Options {
ReadTimeout: opt.ReadTimeout,
WriteTimeout: opt.WriteTimeout,

PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
MinIdleConns: opt.MinIdleConns,
MaxConnAge: opt.MaxConnAge,
Expand Down
17 changes: 13 additions & 4 deletions internal/pool/pool.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ type Options struct {
Dialer func(context.Context) (net.Conn, error)
OnClose func(*Conn) error

PoolFIFO bool
PoolSize int
MinIdleConns int
MaxConnAge time.Duration
Expand Down Expand Up @@ -308,13 +309,21 @@ func (p *ConnPool) freeTurn() {
}

func (p *ConnPool) popIdle() *Conn {
if len(p.idleConns) == 0 {
n := len(p.idleConns)
if n == 0 {
return nil
}

idx := len(p.idleConns) - 1
cn := p.idleConns[idx]
p.idleConns = p.idleConns[:idx]
var cn *Conn
if p.opt.PoolFIFO {
cn = p.idleConns[0]
copy(p.idleConns, p.idleConns[1:])
p.idleConns = p.idleConns[:n-1]
} else {
idx := n - 1
cn = p.idleConns[idx]
p.idleConns = p.idleConns[:idx]
}
p.idleConnsLen--
p.checkMinIdleConns()
return cn
Expand Down
5 changes: 5 additions & 0 deletions options.go
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ type Options struct {
// Default is ReadTimeout.
WriteTimeout time.Duration

// Type of connection pool.
// true for FIFO pool, false for LIFO pool.
// Note that fifo has higher overhead compared to lifo.
PoolFIFO bool
// Maximum number of socket connections.
// Default is 10 connections per every available CPU as reported by runtime.GOMAXPROCS.
PoolSize int
Expand Down Expand Up @@ -291,6 +295,7 @@ func newConnPool(opt *Options) *pool.ConnPool {
Dialer: func(ctx context.Context) (net.Conn, error) {
return opt.Dialer(ctx, opt.Network, opt.Addr)
},
PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
MinIdleConns: opt.MinIdleConns,
MaxConnAge: opt.MaxConnAge,
Expand Down
4 changes: 4 additions & 0 deletions ring.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ type RingOptions struct {
ReadTimeout time.Duration
WriteTimeout time.Duration

// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
PoolFIFO bool

PoolSize int
MinIdleConns int
MaxConnAge time.Duration
Expand Down Expand Up @@ -138,6 +141,7 @@ func (opt *RingOptions) clientOptions() *Options {
ReadTimeout: opt.ReadTimeout,
WriteTimeout: opt.WriteTimeout,

PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
MinIdleConns: opt.MinIdleConns,
MaxConnAge: opt.MaxConnAge,
Expand Down
6 changes: 6 additions & 0 deletions sentinel.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ type FailoverOptions struct {
ReadTimeout time.Duration
WriteTimeout time.Duration

// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
PoolFIFO bool

PoolSize int
MinIdleConns int
MaxConnAge time.Duration
Expand Down Expand Up @@ -86,6 +89,7 @@ func (opt *FailoverOptions) clientOptions() *Options {
ReadTimeout: opt.ReadTimeout,
WriteTimeout: opt.WriteTimeout,

PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
PoolTimeout: opt.PoolTimeout,
IdleTimeout: opt.IdleTimeout,
Expand Down Expand Up @@ -115,6 +119,7 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options {
ReadTimeout: opt.ReadTimeout,
WriteTimeout: opt.WriteTimeout,

PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
PoolTimeout: opt.PoolTimeout,
IdleTimeout: opt.IdleTimeout,
Expand Down Expand Up @@ -146,6 +151,7 @@ func (opt *FailoverOptions) clusterOptions() *ClusterOptions {
ReadTimeout: opt.ReadTimeout,
WriteTimeout: opt.WriteTimeout,

PoolFIFO: opt.PoolFIFO,
PoolSize: opt.PoolSize,
PoolTimeout: opt.PoolTimeout,
IdleTimeout: opt.IdleTimeout,
Expand Down
6 changes: 6 additions & 0 deletions universal.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ type UniversalOptions struct {
ReadTimeout time.Duration
WriteTimeout time.Duration

// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
PoolFIFO bool

PoolSize int
MinIdleConns int
MaxConnAge time.Duration
Expand Down Expand Up @@ -83,6 +86,7 @@ func (o *UniversalOptions) Cluster() *ClusterOptions {
DialTimeout: o.DialTimeout,
ReadTimeout: o.ReadTimeout,
WriteTimeout: o.WriteTimeout,
PoolFIFO: o.PoolFIFO,
PoolSize: o.PoolSize,
MinIdleConns: o.MinIdleConns,
MaxConnAge: o.MaxConnAge,
Expand Down Expand Up @@ -120,6 +124,7 @@ func (o *UniversalOptions) Failover() *FailoverOptions {
ReadTimeout: o.ReadTimeout,
WriteTimeout: o.WriteTimeout,

PoolFIFO: o.PoolFIFO,
PoolSize: o.PoolSize,
MinIdleConns: o.MinIdleConns,
MaxConnAge: o.MaxConnAge,
Expand Down Expand Up @@ -155,6 +160,7 @@ func (o *UniversalOptions) Simple() *Options {
ReadTimeout: o.ReadTimeout,
WriteTimeout: o.WriteTimeout,

PoolFIFO: o.PoolFIFO,
PoolSize: o.PoolSize,
MinIdleConns: o.MinIdleConns,
MaxConnAge: o.MaxConnAge,
Expand Down

0 comments on commit ce40cd9

Please sign in to comment.