nebius/SWE-rebench-V2-PRs huggingface dataset:
Repository: go-redis/redis
Pull request #1281 (2020-03-25 11:07:55)

Add client instantiation callback to allow more flexible configuration
There's currently no way to specify a TLS configuration for a Redis Ring setup. This adds configuration for this so it can be set up in a similar way as the password, with either a single one for all shards or a
configuration per shard.


Patch:
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)
 	}


Test patch:
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())