Skip to content

Sentinel soft-fail follow-ups: discovery failure as RedisConnectionException, late sentinel init, clear LastException - #3280

Merged
mgravell merged 1 commit into
mainfrom
marc/sentinel-soft-fail-followups
Oct 16, 2026
Merged

mgravell merged 1 commit into
mainfrom
marc/sentinel-soft-fail-followups

Conversation

@mgravell

Copy link
Copy Markdown
Collaborator

Follow-ups to #3187 (AbortOnConnectFail=false for sentinel), as promised in #3271. None of this changes behaviour for abortConnect=true.

Changes

  • Discovery failure surfaces as RedisConnectionException. GetSentinelMasterConnection with a config that has no endpoints of its own (the direct-API pattern: a long-lived SentinelConnect, then a per-service config carrying only ServiceName) threw AggregateException(InvalidOperationException("No nodes to consider")) from the seed connect when nothing was discovered. It now throws the discovery RedisConnectionException, as it did before Fix Sentinel connection leak and AbortOnConnectFail=false handling #3187. Measured against a live sentinel with an unknown service name.
  • Late sentinel initialisation. A sentinel connection whose initial connect soft-failed never ran InitializeSentinel, because only the connect paths call it. Such a connection recovered and followed failovers, but only via the fallback polling: it never subscribed to +switch-master. Measured: subscription absent after recovery. InitializeSentinel is now idempotent and is also reached from a non-first reconfigure that detects a sentinel. The first connect still leaves it to ConnectImpl, so the happy-path ordering is unchanged.
  • LastException cleared on recovery. The discovery failure recorded at connect time stayed in LastException after the connection reached its primary, and the exception factory folded it into every later "no connection available" message. Cleared in OnManagedConnectionRestored once the switch succeeds.
  • Docs. Configuration.md now says what abortConnect means for sentinel connections, and that abortConnect=true is the fail-fast setting.

Tests

  • New SentinelConfigTests.GetSentinelMasterConnection_NothingToSeedWith_AbortDisabled_ThrowsTheDiscoveryFailure (closed loopback port, no topology).
  • SentinelTests.AbortOnConnectFailFalseRecoversOnceSentinelsAppear additionally asserts the +switch-master subscription and a null LastException after recovery; both were false before this change.
  • All Sentinel* classes pass against a local primary/replica/three-sentinel topology (32 passed, 1 long-running skip). dotnet build Build.csproj -c Release /p:CI=true is clean. No public API changes.

…ception, late sentinel init, clear LastException

Follow-ups to #3187 (AbortOnConnectFail=false for sentinel), prompted by the
investigation of #3271:

- GetSentinelMasterConnection with a config that has no endpoints of its own
  and nothing discovered threw AggregateException(InvalidOperationException
  "No nodes to consider") from the seed connect. It now throws the discovery
  RedisConnectionException, as it did before #3187.
- A sentinel connection whose initial connect soft-failed never ran
  InitializeSentinel, because only the connect paths called it; such a
  connection never subscribed to +switch-master and tracked failovers only
  through the fallback polling. InitializeSentinel is now idempotent and is
  also reached from a non-first reconfigure that detects a sentinel.
- The discovery failure recorded as LastException at connect time stayed
  there after recovery and was folded into every later "no connection
  available" message. It is cleared once the managed connection is restored.
- Document what abortConnect means for sentinel connections.
@mgravell
mgravell merged commit 84765ee into main Oct 16, 2026
5 checks passed
@mgravell
mgravell deleted the marc/sentinel-soft-fail-followups branch October 16, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant