diff options
Diffstat (limited to 'workhorse/internal/goredis/goredis.go')
-rw-r--r-- | workhorse/internal/goredis/goredis.go | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/workhorse/internal/goredis/goredis.go b/workhorse/internal/goredis/goredis.go index 13a9d4cc34f..5566e5a3434 100644 --- a/workhorse/internal/goredis/goredis.go +++ b/workhorse/internal/goredis/goredis.go @@ -150,17 +150,12 @@ func configureRedis(cfg *config.RedisConfig) (*redis.Client, error) { } func configureSentinel(cfg *config.RedisConfig) *redis.Client { - sentinels := make([]string, len(cfg.Sentinel)) - for i := range cfg.Sentinel { - sentinelDetails := cfg.Sentinel[i] - sentinels[i] = fmt.Sprintf("%s:%s", sentinelDetails.Hostname(), sentinelDetails.Port()) - } - + sentinelPassword, sentinels := sentinelOptions(cfg) client := redis.NewFailoverClient(&redis.FailoverOptions{ MasterName: cfg.SentinelMaster, SentinelAddrs: sentinels, Password: cfg.Password, - SentinelPassword: cfg.SentinelPassword, + SentinelPassword: sentinelPassword, DB: getOrDefault(cfg.DB, 0), PoolSize: getOrDefault(cfg.MaxActive, defaultMaxActive), @@ -178,6 +173,25 @@ func configureSentinel(cfg *config.RedisConfig) *redis.Client { return client } +// sentinelOptions extracts the sentinel password and addresses in <host>:<port> format +// the order of priority for the passwords is: SentinelPassword -> first password-in-url +func sentinelOptions(cfg *config.RedisConfig) (string, []string) { + sentinels := make([]string, len(cfg.Sentinel)) + sentinelPassword := cfg.SentinelPassword + + for i := range cfg.Sentinel { + sentinelDetails := cfg.Sentinel[i] + sentinels[i] = fmt.Sprintf("%s:%s", sentinelDetails.Hostname(), sentinelDetails.Port()) + + if pw, exist := sentinelDetails.User.Password(); exist && len(sentinelPassword) == 0 { + // sets password using the first non-empty password + sentinelPassword = pw + } + } + + return sentinelPassword, sentinels +} + func getOrDefault(ptr *int, val int) int { if ptr != nil { return *ptr |