diff --git a/docs/ReleaseNotes.md b/docs/ReleaseNotes.md index c7d16f61d..009149768 100644 --- a/docs/ReleaseNotes.md +++ b/docs/ReleaseNotes.md @@ -8,7 +8,7 @@ Current package versions: ## Unreleased -- (none) +- Avoid sentinel issues if `ROLE` unavailable; fix #3064 ([#3088 by @mgravell](https://github.com/StackExchange/StackExchange.Redis/pull/3088)) ## 2.13.10 diff --git a/src/StackExchange.Redis/ConnectionMultiplexer.Sentinel.cs b/src/StackExchange.Redis/ConnectionMultiplexer.Sentinel.cs index 61b36b014..35276347d 100644 --- a/src/StackExchange.Redis/ConnectionMultiplexer.Sentinel.cs +++ b/src/StackExchange.Redis/ConnectionMultiplexer.Sentinel.cs @@ -240,10 +240,28 @@ public ConnectionMultiplexer GetSentinelMasterConnection(ConfigurationOptions co // verify role is primary according to: // https://redis.io/topics/sentinel-clients - if (connection.GetServer(newPrimaryEndPoint)?.Role()?.Value == RedisLiterals.master) + bool isPrimary; + var server = connection.GetServer(newPrimaryEndPoint); + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract + if (server is { }) { - success = true; - break; + try + { + isPrimary = connection.CommandMap.IsAvailable(RedisCommand.ROLE) + ? server.Role()?.Value == RedisLiterals.master + : !server.IsReplica; + } + catch + { + // fallback if ROLE unavailable but not declared; see #3064 + isPrimary = !server.IsReplica; + } + + if (isPrimary) + { + success = true; + break; + } } Thread.Sleep(100);