Skip to content

Commit 2668e11

Browse files
feat(options): add DialerRetries and DialerRetryTimeout to ClusterOptions, RingOptions, and FailoverOptions (#3686)
Add DialerRetries and DialerRetryTimeout fields to ClusterOptions, RingOptions, and FailoverOptions to allow users to configure connection retry behavior for cluster, ring, and sentinel clients. These options were previously only available for the standard Client and were added to connection pools in #3518. This change ensures feature parity across all client types. Changes: - Add DialerRetries and DialerRetryTimeout fields to ClusterOptions - Add DialerRetries and DialerRetryTimeout fields to RingOptions - Add DialerRetries and DialerRetryTimeout fields to FailoverOptions - Update clientOptions() methods to pass through these values - Update sentinelOptions() method to pass through these values - Add tests to verify correct pass-through behavior Fixes issue where ClusterClient, Ring, and FailoverClient users could not customize connection retry behavior and were stuck with defaults (5 retries, 100ms backoff). Co-authored-by: Nedyalko Dyakov <1547186+ndyakov@users.noreply.github.com>
1 parent 981333f commit 2668e11

4 files changed

Lines changed: 101 additions & 3 deletions

File tree

options_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,3 +333,60 @@ func TestMaxConcurrentDialsOptions(t *testing.T) {
333333
})
334334
}
335335
}
336+
337+
func TestClusterOptionsDialerRetries(t *testing.T) {
338+
clusterOpt := &ClusterOptions{
339+
DialerRetries: 10,
340+
DialerRetryTimeout: 200 * time.Millisecond,
341+
}
342+
343+
opt := clusterOpt.clientOptions()
344+
345+
if opt.DialerRetries != 10 {
346+
t.Errorf("expected DialerRetries=10, got %d", opt.DialerRetries)
347+
}
348+
if opt.DialerRetryTimeout != 200*time.Millisecond {
349+
t.Errorf("expected DialerRetryTimeout=200ms, got %v", opt.DialerRetryTimeout)
350+
}
351+
}
352+
353+
func TestRingOptionsDialerRetries(t *testing.T) {
354+
ringOpt := &RingOptions{
355+
DialerRetries: 10,
356+
DialerRetryTimeout: 200 * time.Millisecond,
357+
}
358+
359+
opt := ringOpt.clientOptions()
360+
361+
if opt.DialerRetries != 10 {
362+
t.Errorf("expected DialerRetries=10, got %d", opt.DialerRetries)
363+
}
364+
if opt.DialerRetryTimeout != 200*time.Millisecond {
365+
t.Errorf("expected DialerRetryTimeout=200ms, got %v", opt.DialerRetryTimeout)
366+
}
367+
}
368+
369+
func TestFailoverOptionsDialerRetries(t *testing.T) {
370+
failoverOpt := &FailoverOptions{
371+
DialerRetries: 10,
372+
DialerRetryTimeout: 200 * time.Millisecond,
373+
}
374+
375+
opt := failoverOpt.clientOptions()
376+
377+
if opt.DialerRetries != 10 {
378+
t.Errorf("expected DialerRetries=10, got %d", opt.DialerRetries)
379+
}
380+
if opt.DialerRetryTimeout != 200*time.Millisecond {
381+
t.Errorf("expected DialerRetryTimeout=200ms, got %v", opt.DialerRetryTimeout)
382+
}
383+
384+
// Also verify sentinelOptions passes them through
385+
sentinelOpt := failoverOpt.sentinelOptions("localhost:26379")
386+
if sentinelOpt.DialerRetries != 10 {
387+
t.Errorf("expected sentinel DialerRetries=10, got %d", sentinelOpt.DialerRetries)
388+
}
389+
if sentinelOpt.DialerRetryTimeout != 200*time.Millisecond {
390+
t.Errorf("expected sentinel DialerRetryTimeout=200ms, got %v", sentinelOpt.DialerRetryTimeout)
391+
}
392+
}

osscluster.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,18 @@ type ClusterOptions struct {
8686
MinRetryBackoff time.Duration
8787
MaxRetryBackoff time.Duration
8888

89-
DialTimeout time.Duration
89+
DialTimeout time.Duration
90+
91+
// DialerRetries is the maximum number of retry attempts when dialing fails.
92+
//
93+
// default: 5
94+
DialerRetries int
95+
96+
// DialerRetryTimeout is the backoff duration between retry attempts.
97+
//
98+
// default: 100 milliseconds
99+
DialerRetryTimeout time.Duration
100+
90101
ReadTimeout time.Duration
91102
WriteTimeout time.Duration
92103
ContextTimeoutEnabled bool
@@ -367,6 +378,8 @@ func (opt *ClusterOptions) clientOptions() *Options {
367378
MaxRetryBackoff: opt.MaxRetryBackoff,
368379

369380
DialTimeout: opt.DialTimeout,
381+
DialerRetries: opt.DialerRetries,
382+
DialerRetryTimeout: opt.DialerRetryTimeout,
370383
ReadTimeout: opt.ReadTimeout,
371384
WriteTimeout: opt.WriteTimeout,
372385
ContextTimeoutEnabled: opt.ContextTimeoutEnabled,

ring.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,18 @@ type RingOptions struct {
108108
MinRetryBackoff time.Duration
109109
MaxRetryBackoff time.Duration
110110

111-
DialTimeout time.Duration
111+
DialTimeout time.Duration
112+
113+
// DialerRetries is the maximum number of retry attempts when dialing fails.
114+
//
115+
// default: 5
116+
DialerRetries int
117+
118+
// DialerRetryTimeout is the backoff duration between retry attempts.
119+
//
120+
// default: 100 milliseconds
121+
DialerRetryTimeout time.Duration
122+
112123
ReadTimeout time.Duration
113124
WriteTimeout time.Duration
114125
ContextTimeoutEnabled bool
@@ -220,6 +231,8 @@ func (opt *RingOptions) clientOptions() *Options {
220231
MaxRetries: -1,
221232

222233
DialTimeout: opt.DialTimeout,
234+
DialerRetries: opt.DialerRetries,
235+
DialerRetryTimeout: opt.DialerRetryTimeout,
223236
ReadTimeout: opt.ReadTimeout,
224237
WriteTimeout: opt.WriteTimeout,
225238
ContextTimeoutEnabled: opt.ContextTimeoutEnabled,

sentinel.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,18 @@ type FailoverOptions struct {
8989
MinRetryBackoff time.Duration
9090
MaxRetryBackoff time.Duration
9191

92-
DialTimeout time.Duration
92+
DialTimeout time.Duration
93+
94+
// DialerRetries is the maximum number of retry attempts when dialing fails.
95+
//
96+
// default: 5
97+
DialerRetries int
98+
99+
// DialerRetryTimeout is the backoff duration between retry attempts.
100+
//
101+
// default: 100 milliseconds
102+
DialerRetryTimeout time.Duration
103+
93104
ReadTimeout time.Duration
94105
WriteTimeout time.Duration
95106
ContextTimeoutEnabled bool
@@ -176,6 +187,8 @@ func (opt *FailoverOptions) clientOptions() *Options {
176187
WriteBufferSize: opt.WriteBufferSize,
177188

178189
DialTimeout: opt.DialTimeout,
190+
DialerRetries: opt.DialerRetries,
191+
DialerRetryTimeout: opt.DialerRetryTimeout,
179192
ReadTimeout: opt.ReadTimeout,
180193
WriteTimeout: opt.WriteTimeout,
181194
ContextTimeoutEnabled: opt.ContextTimeoutEnabled,
@@ -225,6 +238,8 @@ func (opt *FailoverOptions) sentinelOptions(addr string) *Options {
225238
WriteBufferSize: 4096,
226239

227240
DialTimeout: opt.DialTimeout,
241+
DialerRetries: opt.DialerRetries,
242+
DialerRetryTimeout: opt.DialerRetryTimeout,
228243
ReadTimeout: opt.ReadTimeout,
229244
WriteTimeout: opt.WriteTimeout,
230245
ContextTimeoutEnabled: opt.ContextTimeoutEnabled,

0 commit comments

Comments
 (0)