From b50116ccaebabed85652fd1cf4b84e9f793b0947 Mon Sep 17 00:00:00 2001 From: TJDawson10 Date: Fri, 24 Jul 2026 12:28:46 -0400 Subject: [PATCH] fix(redis2/redis3): support separate sentinel auth credentials (#10412) redis2_sentinel and redis3_sentinel stores only passed Username/Password into redis.FailoverOptions, which authenticates against the Redis master/replica servers. When Sentinel itself requires auth (requirepass set in sentinel.conf), go-redis had no credentials to send to it, causing a NOAUTH error before ever reaching the master. Add sentinel_username/sentinel_password config options that map to go-redis's SentinelUsername/SentinelPassword fields, distinct from the existing master auth credentials. --- weed/command/scaffold/filer.toml | 3 +++ weed/filer/redis2/redis_sentinel_store.go | 24 +++++++++++++---------- weed/filer/redis3/redis_sentinel_store.go | 24 +++++++++++++---------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/weed/command/scaffold/filer.toml b/weed/command/scaffold/filer.toml index e1aea5a72..e593b41ab 100644 --- a/weed/command/scaffold/filer.toml +++ b/weed/command/scaffold/filer.toml @@ -237,6 +237,9 @@ addresses = ["172.22.12.7:26379","172.22.12.8:26379","172.22.12.9:26379"] masterName = "master" username = "" password = "" +# credentials used to authenticate against the sentinel nodes themselves (if they require auth) +sentinel_username = "" +sentinel_password = "" database = 0 # prefix for filer redis keys keyPrefix = "" diff --git a/weed/filer/redis2/redis_sentinel_store.go b/weed/filer/redis2/redis_sentinel_store.go index 10ed62273..5cadf6a37 100644 --- a/weed/filer/redis2/redis_sentinel_store.go +++ b/weed/filer/redis2/redis_sentinel_store.go @@ -26,22 +26,26 @@ func (store *Redis2SentinelStore) Initialize(configuration util.Configuration, p configuration.GetString(prefix+"masterName"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), + configuration.GetString(prefix+"sentinel_username"), + configuration.GetString(prefix+"sentinel_password"), configuration.GetInt(prefix+"database"), configuration.GetString(prefix+"keyPrefix"), ) } -func (store *Redis2SentinelStore) initialize(addresses []string, masterName string, username string, password string, database int, keyPrefix string) (err error) { +func (store *Redis2SentinelStore) initialize(addresses []string, masterName string, username string, password string, sentinelUsername string, sentinelPassword string, database int, keyPrefix string) (err error) { store.Client = redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: masterName, - SentinelAddrs: addresses, - Username: username, - Password: password, - DB: database, - MinRetryBackoff: time.Millisecond * 100, - MaxRetryBackoff: time.Minute * 1, - ReadTimeout: time.Second * 30, - WriteTimeout: time.Second * 5, + MasterName: masterName, + SentinelAddrs: addresses, + Username: username, + Password: password, + SentinelUsername: sentinelUsername, + SentinelPassword: sentinelPassword, + DB: database, + MinRetryBackoff: time.Millisecond * 100, + MaxRetryBackoff: time.Minute * 1, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 5, }) store.keyPrefix = keyPrefix return diff --git a/weed/filer/redis3/redis_sentinel_store.go b/weed/filer/redis3/redis_sentinel_store.go index b9b0354e0..d066342f7 100644 --- a/weed/filer/redis3/redis_sentinel_store.go +++ b/weed/filer/redis3/redis_sentinel_store.go @@ -28,21 +28,25 @@ func (store *Redis3SentinelStore) Initialize(configuration util.Configuration, p configuration.GetString(prefix+"masterName"), configuration.GetString(prefix+"username"), configuration.GetString(prefix+"password"), + configuration.GetString(prefix+"sentinel_username"), + configuration.GetString(prefix+"sentinel_password"), configuration.GetInt(prefix+"database"), ) } -func (store *Redis3SentinelStore) initialize(addresses []string, masterName string, username string, password string, database int) (err error) { +func (store *Redis3SentinelStore) initialize(addresses []string, masterName string, username string, password string, sentinelUsername string, sentinelPassword string, database int) (err error) { store.Client = redis.NewFailoverClient(&redis.FailoverOptions{ - MasterName: masterName, - SentinelAddrs: addresses, - Username: username, - Password: password, - DB: database, - MinRetryBackoff: time.Millisecond * 100, - MaxRetryBackoff: time.Minute * 1, - ReadTimeout: time.Second * 30, - WriteTimeout: time.Second * 5, + MasterName: masterName, + SentinelAddrs: addresses, + Username: username, + Password: password, + SentinelUsername: sentinelUsername, + SentinelPassword: sentinelPassword, + DB: database, + MinRetryBackoff: time.Millisecond * 100, + MaxRetryBackoff: time.Minute * 1, + ReadTimeout: time.Second * 30, + WriteTimeout: time.Second * 5, }) store.redsync = redsync.New(goredis.NewPool(store.Client)) return