Skip to content

Commit ce40cd9

Browse files
ktaekwon000Kim Tae Kwonmonkey92t
authored
Allow FIFO pool in redis client (#1820)
* 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]>
1 parent 247c62a commit ce40cd9

File tree

6 files changed

+38
-4
lines changed

6 files changed

+38
-4
lines changed

cluster.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ type ClusterOptions struct {
6868
ReadTimeout time.Duration
6969
WriteTimeout time.Duration
7070

71+
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
72+
PoolFIFO bool
73+
7174
// PoolSize applies per cluster node and not for the whole cluster.
7275
PoolSize int
7376
MinIdleConns int
@@ -146,6 +149,7 @@ func (opt *ClusterOptions) clientOptions() *Options {
146149
ReadTimeout: opt.ReadTimeout,
147150
WriteTimeout: opt.WriteTimeout,
148151

152+
PoolFIFO: opt.PoolFIFO,
149153
PoolSize: opt.PoolSize,
150154
MinIdleConns: opt.MinIdleConns,
151155
MaxConnAge: opt.MaxConnAge,

internal/pool/pool.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ type Options struct {
5757
Dialer func(context.Context) (net.Conn, error)
5858
OnClose func(*Conn) error
5959

60+
PoolFIFO bool
6061
PoolSize int
6162
MinIdleConns int
6263
MaxConnAge time.Duration
@@ -308,13 +309,21 @@ func (p *ConnPool) freeTurn() {
308309
}
309310

310311
func (p *ConnPool) popIdle() *Conn {
311-
if len(p.idleConns) == 0 {
312+
n := len(p.idleConns)
313+
if n == 0 {
312314
return nil
313315
}
314316

315-
idx := len(p.idleConns) - 1
316-
cn := p.idleConns[idx]
317-
p.idleConns = p.idleConns[:idx]
317+
var cn *Conn
318+
if p.opt.PoolFIFO {
319+
cn = p.idleConns[0]
320+
copy(p.idleConns, p.idleConns[1:])
321+
p.idleConns = p.idleConns[:n-1]
322+
} else {
323+
idx := n - 1
324+
cn = p.idleConns[idx]
325+
p.idleConns = p.idleConns[:idx]
326+
}
318327
p.idleConnsLen--
319328
p.checkMinIdleConns()
320329
return cn

options.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ type Options struct {
7676
// Default is ReadTimeout.
7777
WriteTimeout time.Duration
7878

79+
// Type of connection pool.
80+
// true for FIFO pool, false for LIFO pool.
81+
// Note that fifo has higher overhead compared to lifo.
82+
PoolFIFO bool
7983
// Maximum number of socket connections.
8084
// Default is 10 connections per every available CPU as reported by runtime.GOMAXPROCS.
8185
PoolSize int
@@ -291,6 +295,7 @@ func newConnPool(opt *Options) *pool.ConnPool {
291295
Dialer: func(ctx context.Context) (net.Conn, error) {
292296
return opt.Dialer(ctx, opt.Network, opt.Addr)
293297
},
298+
PoolFIFO: opt.PoolFIFO,
294299
PoolSize: opt.PoolSize,
295300
MinIdleConns: opt.MinIdleConns,
296301
MaxConnAge: opt.MaxConnAge,

ring.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ type RingOptions struct {
7878
ReadTimeout time.Duration
7979
WriteTimeout time.Duration
8080

81+
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
82+
PoolFIFO bool
83+
8184
PoolSize int
8285
MinIdleConns int
8386
MaxConnAge time.Duration
@@ -138,6 +141,7 @@ func (opt *RingOptions) clientOptions() *Options {
138141
ReadTimeout: opt.ReadTimeout,
139142
WriteTimeout: opt.WriteTimeout,
140143

144+
PoolFIFO: opt.PoolFIFO,
141145
PoolSize: opt.PoolSize,
142146
MinIdleConns: opt.MinIdleConns,
143147
MaxConnAge: opt.MaxConnAge,

sentinel.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ type FailoverOptions struct {
5757
ReadTimeout time.Duration
5858
WriteTimeout time.Duration
5959

60+
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
61+
PoolFIFO bool
62+
6063
PoolSize int
6164
MinIdleConns int
6265
MaxConnAge time.Duration
@@ -86,6 +89,7 @@ func (opt *FailoverOptions) clientOptions() *Options {
8689
ReadTimeout: opt.ReadTimeout,
8790
WriteTimeout: opt.WriteTimeout,
8891

92+
PoolFIFO: opt.PoolFIFO,
8993
PoolSize: opt.PoolSize,
9094
PoolTimeout: opt.PoolTimeout,
9195
IdleTimeout: opt.IdleTimeout,
@@ -115,6 +119,7 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options {
115119
ReadTimeout: opt.ReadTimeout,
116120
WriteTimeout: opt.WriteTimeout,
117121

122+
PoolFIFO: opt.PoolFIFO,
118123
PoolSize: opt.PoolSize,
119124
PoolTimeout: opt.PoolTimeout,
120125
IdleTimeout: opt.IdleTimeout,
@@ -146,6 +151,7 @@ func (opt *FailoverOptions) clusterOptions() *ClusterOptions {
146151
ReadTimeout: opt.ReadTimeout,
147152
WriteTimeout: opt.WriteTimeout,
148153

154+
PoolFIFO: opt.PoolFIFO,
149155
PoolSize: opt.PoolSize,
150156
PoolTimeout: opt.PoolTimeout,
151157
IdleTimeout: opt.IdleTimeout,

universal.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ type UniversalOptions struct {
3535
ReadTimeout time.Duration
3636
WriteTimeout time.Duration
3737

38+
// PoolFIFO uses FIFO mode for each node connection pool GET/PUT (default LIFO).
39+
PoolFIFO bool
40+
3841
PoolSize int
3942
MinIdleConns int
4043
MaxConnAge time.Duration
@@ -83,6 +86,7 @@ func (o *UniversalOptions) Cluster() *ClusterOptions {
8386
DialTimeout: o.DialTimeout,
8487
ReadTimeout: o.ReadTimeout,
8588
WriteTimeout: o.WriteTimeout,
89+
PoolFIFO: o.PoolFIFO,
8690
PoolSize: o.PoolSize,
8791
MinIdleConns: o.MinIdleConns,
8892
MaxConnAge: o.MaxConnAge,
@@ -120,6 +124,7 @@ func (o *UniversalOptions) Failover() *FailoverOptions {
120124
ReadTimeout: o.ReadTimeout,
121125
WriteTimeout: o.WriteTimeout,
122126

127+
PoolFIFO: o.PoolFIFO,
123128
PoolSize: o.PoolSize,
124129
MinIdleConns: o.MinIdleConns,
125130
MaxConnAge: o.MaxConnAge,
@@ -155,6 +160,7 @@ func (o *UniversalOptions) Simple() *Options {
155160
ReadTimeout: o.ReadTimeout,
156161
WriteTimeout: o.WriteTimeout,
157162

163+
PoolFIFO: o.PoolFIFO,
158164
PoolSize: o.PoolSize,
159165
MinIdleConns: o.MinIdleConns,
160166
MaxConnAge: o.MaxConnAge,

0 commit comments

Comments
 (0)