diff --git a/ring.go b/ring.go index e1b4991..44fc623 100644 --- a/ring.go +++ b/ring.go @@ -56,6 +56,9 @@ type RingOptions struct { // See https://arxiv.org/abs/1406.2294 for reference HashReplicas int + // NewClient creates a shard client with provided name and options. + NewClient func(name string, opt *Options) *Client + // Optional hook that is called when a new shard is created. OnNewShard func(*Client) @@ -390,7 +393,12 @@ func NewRing(opt *RingOptions) *Ring { func newRingShard(opt *RingOptions, name, addr string) *Client { clopt := opt.clientOptions(name) clopt.Addr = addr - shard := NewClient(clopt) + var shard *Client + if opt.NewClient != nil { + shard = opt.NewClient(name, clopt) + } else { + shard = NewClient(clopt) + } if opt.OnNewShard != nil { opt.OnNewShard(shard) } diff --git a/ring_test.go b/ring_test.go index eef8dc2..e2ea991 100644 --- a/ring_test.go +++ b/ring_test.go @@ -196,6 +196,20 @@ var _ = Describe("Redis Ring", func() { }) }) + Describe("new client callback", func() { + It("can be initialized with a new client callback", func() { + opts := redisRingOptions() + opts.NewClient = func(name string, opt *redis.Options) *redis.Client { + opt.Password = "password1" + return redis.NewClient(opt) + } + ring = redis.NewRing(opts) + + err := ring.Ping().Err() + Expect(err).To(MatchError("ERR Client sent AUTH, but no password is set")) + }) + }) + It("supports Process hook", func() { err := ring.Ping().Err() Expect(err).NotTo(HaveOccurred())