Skip to content

Commit 61baaf5

Browse files
Mykhailo AlipaMykhailo Alipa
authored andcommitted
specify custom health check func via ShardHealthCheckFn option
1 parent 65c527c commit 61baaf5

File tree

5 files changed

+26
-5
lines changed

5 files changed

+26
-5
lines changed

extra/rediscensus/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
22
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
33
github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
44
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
5+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
56
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
67
github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
8+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
79
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
810
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
911
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=

extra/rediscmd/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.15
55
replace github.com/redis/go-redis/v9 => ../..
66

77
require (
8-
github.com/bsm/ginkgo/v2 v2.7.0
9-
github.com/bsm/gomega v1.26.0
8+
github.com/bsm/ginkgo/v2 v2.12.0
9+
github.com/bsm/gomega v1.27.10
1010
github.com/redis/go-redis/v9 v9.5.1
1111
)

extra/rediscmd/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
22
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
3+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
34
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
45
github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
6+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
57
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
68
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
79
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=

extra/redisotel/go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
github.com/bsm/ginkgo/v2 v2.7.0 h1:ItPMPH90RbmZJt5GtkcNvIRuGEdwlBItdNVoyzaNQao=
22
github.com/bsm/ginkgo/v2 v2.7.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
3+
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
34
github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
45
github.com/bsm/gomega v1.26.0/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
6+
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
57
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
68
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
79
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

ring.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,20 @@ import (
2222

2323
var errRingShardsDown = errors.New("redis: all ring shards are down")
2424

25+
// defaultShardHealthCheckFn is the default function used to check the shard liveness
26+
var defaultShardHealthCheckFn = func(ctx context.Context, client *Client) bool {
27+
err := client.Ping(ctx).Err()
28+
return err == nil || err == pool.ErrPoolTimeout
29+
}
30+
2531
//------------------------------------------------------------------------------
2632

2733
type ConsistentHash interface {
2834
Get(string) string
2935
}
3036

37+
type ShardHealthCheckFn func(ctx context.Context, client *Client) bool
38+
3139
type rendezvousWrapper struct {
3240
*rendezvous.Rendezvous
3341
}
@@ -54,10 +62,14 @@ type RingOptions struct {
5462
// ClientName will execute the `CLIENT SETNAME ClientName` command for each conn.
5563
ClientName string
5664

57-
// Frequency of PING commands sent to check shards availability.
65+
// Frequency of executing ShardHealthCheckFn to check shards availability.
5866
// Shard is considered down after 3 subsequent failed checks.
5967
HeartbeatFrequency time.Duration
6068

69+
// A function used to check the shard liveness
70+
// if not set, defaults to defaultShardHealthCheckFn
71+
ShardHealthCheckFn ShardHealthCheckFn
72+
6173
// NewConsistentHash returns a consistent hash that is used
6274
// to distribute keys across the shards.
6375
//
@@ -113,6 +125,10 @@ func (opt *RingOptions) init() {
113125
opt.HeartbeatFrequency = 500 * time.Millisecond
114126
}
115127

128+
if opt.ShardHealthCheckFn == nil {
129+
opt.ShardHealthCheckFn = defaultShardHealthCheckFn
130+
}
131+
116132
if opt.NewConsistentHash == nil {
117133
opt.NewConsistentHash = newRendezvous
118134
}
@@ -408,8 +424,7 @@ func (c *ringSharding) Heartbeat(ctx context.Context, frequency time.Duration) {
408424
var rebalance bool
409425

410426
for _, shard := range c.List() {
411-
err := shard.Client.Ping(ctx).Err()
412-
isUp := err == nil || err == pool.ErrPoolTimeout
427+
isUp := c.opt.ShardHealthCheckFn(ctx, shard.Client)
413428
if shard.Vote(isUp) {
414429
internal.Logger.Printf(ctx, "ring shard state changed: %s", shard)
415430
rebalance = true

0 commit comments

Comments
 (0)