Skip to content

Commit 62678ef

Browse files
authored
Allow diff ports on boostrapNode and redis pods (#64)
Boostrapping fails if the bootstrapNode and RF's redis port are different. The operator uses the bootstrapNode's port when trying to run `SLAVEOF` on the RF pods and fails to connect: Example RF config: ```yaml bootstrapNode: enabled: true host: redis-primary-host.io port: "36379" ... redis: port: 6679 ... ``` Example failure logs: ``` time="2025-06-05T19:08:29Z" level=info msg="Making pod rfr-redis-0 slave of redis-primary-host.io:36379" namespace=redis-test redisfailover=redis service=redis.healer src="checker.go:261" time="2025-06-05T19:08:29Z" level=error msg="error on object processing: dial tcp 10.244.2.7:36379: connect: connection refused" controller-id=redisfailover object-key=redis-test/redis operator=redisfailover service=kooper.controller src="controller.go:282" ``` This alters `MakeSlaveOfWithPort` to allow the caller to speficy different ports for the primary and replica redis instances. Additonally, `SetExternalMasterOnAll` is alertered to pass along the boostrapNode's port as well as the RF resources's port - which _can_ be different.
1 parent 8b3c993 commit 62678ef

File tree

5 files changed

+23
-20
lines changed

5 files changed

+23
-20
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ Also check this project's [releases](https://github.com/powerhome/redis-operator
99

1010
## Unreleased
1111

12+
- [Allow different ports on BootstrapNode and RF](https://github.com/powerhome/redis-operator/pull/64)
13+
1214
## [v4.1.0] - 2025-01-16
1315

1416
### Changed

mocks/service/redis/Client.go

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

operator/redisfailover/service/heal.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (r *RedisFailoverHealer) SetOldestAsMaster(rf *redisfailoverv1.RedisFailove
141141
newMasterIP = pod.Status.PodIP
142142
} else {
143143
r.logger.Infof("Making pod %s slave of %s", pod.Name, newMasterIP)
144-
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, newMasterIP, port, password); err != nil {
144+
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, port, newMasterIP, port, password); err != nil {
145145
r.logger.WithField("redisfailover", rf.ObjectMeta.Name).WithField("namespace", rf.ObjectMeta.Namespace).Errorf("Make slave failed, slave pod ip: %s, master ip: %s, error: %v", pod.Status.PodIP, newMasterIP, err)
146146
}
147147

@@ -182,7 +182,7 @@ func (r *RedisFailoverHealer) SetMasterOnAll(masterIP string, rf *redisfailoverv
182182
continue
183183
}
184184
r.logger.WithField("redisfailover", rf.ObjectMeta.Name).WithField("namespace", rf.ObjectMeta.Namespace).Infof("Making pod %s slave of %s", pod.Name, masterIP)
185-
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, masterIP, port, password); err != nil {
185+
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, port, masterIP, port, password); err != nil {
186186
r.logger.WithField("redisfailover", rf.ObjectMeta.Name).WithField("namespace", rf.ObjectMeta.Namespace).Errorf("Make slave failed, slave ip: %s, master ip: %s, error: %v", pod.Status.PodIP, masterIP, err)
187187
return err
188188
}
@@ -209,9 +209,10 @@ func (r *RedisFailoverHealer) SetExternalMasterOnAll(masterIP, masterPort string
209209
return err
210210
}
211211

212+
port := rf.Spec.Redis.Port.ToString()
212213
for _, pod := range ssp.Items {
213214
r.logger.WithField("redisfailover", rf.ObjectMeta.Name).WithField("namespace", rf.ObjectMeta.Namespace).Infof("Making pod %s slave of %s:%s", pod.Name, masterIP, masterPort)
214-
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, masterIP, masterPort, password); err != nil {
215+
if err := r.redisClient.MakeSlaveOfWithPort(pod.Status.PodIP, port, masterIP, masterPort, password); err != nil {
215216
return err
216217
}
217218

operator/redisfailover/service/heal_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func TestSetOldestAsMasterMultiplePodsMakeSlaveOfError(t *testing.T) {
124124
ms.On("UpdatePodLabels", namespace, mock.AnythingOfType("string"), mock.Anything).Return(nil)
125125
mr := &mRedisService.Client{}
126126
mr.On("MakeMaster", "0.0.0.0", "0", "").Once().Return(nil)
127-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0.0.0.0", "0", "").Once().Return(errors.New(""))
127+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "0.0.0.0", "0", "").Once().Return(errors.New(""))
128128

129129
healer := rfservice.NewRedisFailoverHealer(ms, mr, log.DummyLogger{})
130130

@@ -157,7 +157,7 @@ func TestSetOldestAsMasterMultiplePods(t *testing.T) {
157157
ms.On("UpdatePodLabels", namespace, mock.AnythingOfType("string"), mock.Anything).Return(nil)
158158
mr := &mRedisService.Client{}
159159
mr.On("MakeMaster", "0.0.0.0", "0", "").Once().Return(nil)
160-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0.0.0.0", "0", "").Once().Return(nil)
160+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "0.0.0.0", "0", "").Once().Return(nil)
161161

162162
healer := rfservice.NewRedisFailoverHealer(ms, mr, log.DummyLogger{})
163163

@@ -200,7 +200,7 @@ func TestSetOldestAsMasterOrdering(t *testing.T) {
200200
ms.On("UpdatePodLabels", namespace, mock.AnythingOfType("string"), mock.Anything).Return(nil)
201201
mr := &mRedisService.Client{}
202202
mr.On("MakeMaster", "1.1.1.1", "0", "").Once().Return(nil)
203-
mr.On("MakeSlaveOfWithPort", "0.0.0.0", "1.1.1.1", "0", "").Once().Return(nil)
203+
mr.On("MakeSlaveOfWithPort", "0.0.0.0", "0", "1.1.1.1", "0", "").Once().Return(nil)
204204

205205
healer := rfservice.NewRedisFailoverHealer(ms, mr, log.DummyLogger{})
206206

@@ -264,7 +264,7 @@ func TestSetMasterOnAllMakeSlaveOfError(t *testing.T) {
264264
ms.On("UpdatePodLabels", namespace, mock.AnythingOfType("string"), mock.Anything).Return(nil)
265265
mr := &mRedisService.Client{}
266266
mr.On("IsMaster", "0.0.0.0", "0", "").Return(true, nil)
267-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0.0.0.0", "0", "").Once().Return(errors.New(""))
267+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "0.0.0.0", "0", "").Once().Return(errors.New(""))
268268

269269
healer := rfservice.NewRedisFailoverHealer(ms, mr, log.DummyLogger{})
270270

@@ -297,7 +297,7 @@ func TestSetMasterOnAll(t *testing.T) {
297297
ms.On("UpdatePodLabels", namespace, mock.AnythingOfType("string"), mock.Anything).Return(nil)
298298
mr := &mRedisService.Client{}
299299
mr.On("IsMaster", "0.0.0.0", "0", "").Return(true, nil)
300-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0.0.0.0", "0", "").Once().Return(nil)
300+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "0.0.0.0", "0", "").Once().Return(nil)
301301

302302
healer := rfservice.NewRedisFailoverHealer(ms, mr, log.DummyLogger{})
303303

@@ -355,12 +355,12 @@ func TestSetExternalMasterOnAll(t *testing.T) {
355355

356356
mr := &mRedisService.Client{}
357357
if !expectError {
358-
mr.On("MakeSlaveOfWithPort", "0.0.0.0", "5.5.5.5", "6379", "").Once().Return(nil)
358+
mr.On("MakeSlaveOfWithPort", "0.0.0.0", "0", "5.5.5.5", "6379", "").Once().Return(nil)
359359
if test.errorOnMakeSlaveOf {
360360
expectError = true
361-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "5.5.5.5", "6379", "").Once().Return(errors.New(""))
361+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "5.5.5.5", "6379", "").Once().Return(errors.New(""))
362362
} else {
363-
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "5.5.5.5", "6379", "").Once().Return(nil)
363+
mr.On("MakeSlaveOfWithPort", "1.1.1.1", "0", "5.5.5.5", "6379", "").Once().Return(nil)
364364
}
365365
}
366366

service/redis/client.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type Client interface {
2727
MakeMaster(ip, port, password string) error
2828
ResetReplicaConnections(ip, port, password string) error
2929
MakeSlaveOf(ip, masterIP, password string) error
30-
MakeSlaveOfWithPort(ip, masterIP, masterPort, password string) error
30+
MakeSlaveOfWithPort(ip, port, masterIP, masterPort, password string) error
3131
GetSentinelMonitor(ip string, port string) (string, string, error)
3232
SetCustomSentinelConfig(ip string, port string, configs []string) error
3333
SetCustomRedisConfig(ip string, port string, configs []string, password string) error
@@ -313,12 +313,12 @@ func (c client) ResetReplicaConnections(ip string, port string, password string)
313313
}
314314

315315
func (c *client) MakeSlaveOf(ip, masterIP, password string) error {
316-
return c.MakeSlaveOfWithPort(ip, masterIP, redisPort, password)
316+
return c.MakeSlaveOfWithPort(ip, redisPort, masterIP, redisPort, password)
317317
}
318318

319-
func (c *client) MakeSlaveOfWithPort(ip, masterIP, masterPort, password string) error {
319+
func (c *client) MakeSlaveOfWithPort(ip, port, masterIP, masterPort, password string) error {
320320
options := &rediscli.Options{
321-
Addr: net.JoinHostPort(ip, masterPort), // this is IP and Port for the RedisFailover redis
321+
Addr: net.JoinHostPort(ip, port), // this is IP and Port for the RedisFailover redis
322322
Password: password,
323323
DB: 0,
324324
}

0 commit comments

Comments
 (0)