Repository navigation
Scan: observe the faults of abandoned page tasks after a sync timeout or dispose (#3260) - #3267
Merged
Merged
Conversation
mgravell
added a commit
that referenced
this pull request
Oct 9, 2026
Absorbs the drift up to the 3.4.0 cut. Most of main's changes landed in v3's PhysicalBridge/PhysicalConnection/CursorEnumerable, which v4 has deleted, so several are re-expressed in v4 terms rather than merged textually: - #3266 duplicate LoggerMessage event ids: taken as-is. 124/125 (maintenance), 126 (TLS established) and 127 (ConnectionFailed) shipped in 3.4.0, so the v4-only events that had claimed those ids move to 128-131; the guard test (LoggerEventIdTests) covers both. - #3268 create-implementation-plan skill: taken as-is. - #3260/#3267 scan faults after a sync timeout or dispose: the fix targets CursorEnumerable's page prefetch, which v4 does not have (no prefetch; the sync face uses the synchronous Send). The intent is kept as tests on v4's scans: a faulted page surfaces as its own exception, sync and async, and nothing is fetched once the enumeration is let go. - #3257 ConnectionAttemptCompleted: v4 has no PhysicalConnection until an attempt succeeds, so ConnectionAttempt carries the record through the transport factory and the handshake instead - stages Connect, Tunnel, Tls, Handshake, Established; client/server certificate observation and the TLS host; one outcome per attempt. Created only when someone subscribes. Abandoned (executor disposal) reports ConnectionDisposed; outliving the connect timeout reports UnableToConnect with the timeout. A refused AUTH is reported as Handshake + AuthenticationFailure although v4 keeps the connection (parity with v3's fire-and-forget AUTH). - #3264 dedicated pub/sub connection under RESP3 by default: v4's "RESP3, so share" becomes SharesSubscriptions (RESP3 *and* SharedSubscriptionConnection). v4 keeps pay-per-play dialling: the subscription socket is dialled up front only for the configuration channel, as under RESP2. The dedicated subscription connection now raises ConnectionRestored (Subscription) when it (re)connects, as v3's subscription bridge did - previously only reachable under RESP2, and silent there too (Issue922_ReconnectRaised). It does not trigger a reconfigure: topology is read over the interactive leg, and the subscription leg connects just after the initial connect. - 3.4 bump: version.json stays 4.0; the 3.4.0 API surface is reconciled into PublicAPI.Shipped.txt. Also fixed while here: the auth-refusal callback added for #3257 was a lambda capturing `this`, which landed in the closure scope OnPush chains to and let the socket root the multiplexer (GarbageCollectionTests.MuxerIsCollected). Closes ledger rows D6 and D7.
FloatingMilkshake
pushed a commit
to FloatingMilkshake/MechanicalMilkshake
that referenced
this pull request
Oct 9, 2026
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [StackExchange.Redis](https://seredis.dev/) ([source](https://github.com/StackExchange/StackExchange.Redis)) | nuget | minor | `3.3.1` → `3.4.0` | --- ### Release Notes <details> <summary>StackExchange/StackExchange.Redis (StackExchange.Redis)</summary> ### [`v3.4.0`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/3.4.0) [Compare Source](StackExchange/StackExchange.Redis@3.3.1...3.4.0) #### Major Changes - In RESP3, by default the library now uses **separate** connections for pub/sub; see [#​3264](StackExchange/StackExchange.Redis#3264) - Smart-client-handoffs is now enabled by default on Redis Enterprise and AMR; see [#​3248](StackExchange/StackExchange.Redis#3248) - Some logging events incorrectly used duplicated ids - resolved; see [#​3266](StackExchange/StackExchange.Redis#3266) #### All Changes - Recover promptly from a cluster failover; fix the configuration channel under RESP3 and with a channel prefix ([#​3254](StackExchange/StackExchange.Redis#3254)) by [@​mgravell](https://github.com/mgravell) in [#​3255](StackExchange/StackExchange.Redis#3255) - Preserve binary members as VectorSetRange bounds by [@​Laurianti](https://github.com/Laurianti) in [#​3256](StackExchange/StackExchange.Redis#3256) - Smart client handoffs: reinstate auto-enlistment for the hosted providers and remove \[Experimental] by [@​mgravell](https://github.com/mgravell) in [#​3248](StackExchange/StackExchange.Redis#3248) - docs: fix retry-category test in the custom RetryPolicy sample by [@​mgravell](https://github.com/mgravell) in [#​3265](StackExchange/StackExchange.Redis#3265) - Fix duplicate LoggerMessage event ids; add a guard test by [@​mgravell](https://github.com/mgravell) in [#​3266](StackExchange/StackExchange.Redis#3266) - Scan: observe the faults of abandoned page tasks after a sync timeout or dispose ([#​3260](StackExchange/StackExchange.Redis#3260)) by [@​mgravell](https://github.com/mgravell) in [#​3267](StackExchange/StackExchange.Redis#3267) - Report the outcome of every physical connection attempt, identifying the client certificate used by [@​mgravell](https://github.com/mgravell) in [#​3257](StackExchange/StackExchange.Redis#3257) - Use a dedicated pub/sub connection under RESP3 by default by [@​mgravell](https://github.com/mgravell) in [#​3264](StackExchange/StackExchange.Redis#3264) #### Tooling - docs(agents): add create-implementation-plan-for-redis-api-change skill by [@​uglide](https://github.com/uglide) in [#​3268](StackExchange/StackExchange.Redis#3268) #### New Contributors - [@​Laurianti](https://github.com/Laurianti) made their first contribution in [#​3256](StackExchange/StackExchange.Redis#3256) **Full Changelog**: <StackExchange/StackExchange.Redis@3.3.1...3.4.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDkuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.milkshake.services/FloatingMilkshake/MechanicalMilkshake/pulls/9 Reviewed-by: Milkshake <floatingmilkshake@noreply.milkshake.services>
FloatingMilkshake
pushed a commit
to FloatingMilkshake/Azusa
that referenced
this pull request
Oct 9, 2026
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [StackExchange.Redis](https://seredis.dev/) ([source](https://github.com/StackExchange/StackExchange.Redis)) | nuget | minor | `3.3.1` → `3.4.0` | --- ### Release Notes <details> <summary>StackExchange/StackExchange.Redis (StackExchange.Redis)</summary> ### [`v3.4.0`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/3.4.0) [Compare Source](StackExchange/StackExchange.Redis@3.3.1...3.4.0) #### Major Changes - In RESP3, by default the library now uses **separate** connections for pub/sub; see [#​3264](StackExchange/StackExchange.Redis#3264) - Smart-client-handoffs is now enabled by default on Redis Enterprise and AMR; see [#​3248](StackExchange/StackExchange.Redis#3248) - Some logging events incorrectly used duplicated ids - resolved; see [#​3266](StackExchange/StackExchange.Redis#3266) #### All Changes - Recover promptly from a cluster failover; fix the configuration channel under RESP3 and with a channel prefix ([#​3254](StackExchange/StackExchange.Redis#3254)) by [@​mgravell](https://github.com/mgravell) in [#​3255](StackExchange/StackExchange.Redis#3255) - Preserve binary members as VectorSetRange bounds by [@​Laurianti](https://github.com/Laurianti) in [#​3256](StackExchange/StackExchange.Redis#3256) - Smart client handoffs: reinstate auto-enlistment for the hosted providers and remove \[Experimental] by [@​mgravell](https://github.com/mgravell) in [#​3248](StackExchange/StackExchange.Redis#3248) - docs: fix retry-category test in the custom RetryPolicy sample by [@​mgravell](https://github.com/mgravell) in [#​3265](StackExchange/StackExchange.Redis#3265) - Fix duplicate LoggerMessage event ids; add a guard test by [@​mgravell](https://github.com/mgravell) in [#​3266](StackExchange/StackExchange.Redis#3266) - Scan: observe the faults of abandoned page tasks after a sync timeout or dispose ([#​3260](StackExchange/StackExchange.Redis#3260)) by [@​mgravell](https://github.com/mgravell) in [#​3267](StackExchange/StackExchange.Redis#3267) - Report the outcome of every physical connection attempt, identifying the client certificate used by [@​mgravell](https://github.com/mgravell) in [#​3257](StackExchange/StackExchange.Redis#3257) - Use a dedicated pub/sub connection under RESP3 by default by [@​mgravell](https://github.com/mgravell) in [#​3264](StackExchange/StackExchange.Redis#3264) #### Tooling - docs(agents): add create-implementation-plan-for-redis-api-change skill by [@​uglide](https://github.com/uglide) in [#​3268](StackExchange/StackExchange.Redis#3268) #### New Contributors - [@​Laurianti](https://github.com/Laurianti) made their first contribution in [#​3256](StackExchange/StackExchange.Redis#3256) **Full Changelog**: <StackExchange/StackExchange.Redis@3.3.1...3.4.0> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xNDkuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE0OS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.milkshake.services/FloatingMilkshake/Azusa/pulls/9 Reviewed-by: Milkshake <floatingmilkshake@noreply.milkshake.services>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3260.
A synchronous scan (
HashScan,SetScan,SortedSetScan,Keys) that hitsSyncTimeoutthrowsRedisTimeoutExceptionand walks away from the task wrapping the in-flight page. When that page later faults (backlog timeout, socket closed), the fault has no observer and surfaces asTaskScheduler.UnobservedTaskException, exactly as reported.Changes in
CursorEnumerable:breakout of aforeach), via a singleAbandonPending.AggregateException, on both the sync and async paths; this matches the rest of the sync surface. Previously the type depended on timing: a fault during the await rethrew the cause, a fault that had already happened (typical with prefetching) came wrapped. Behaviour change, called out deliberately.NullReferenceExceptionbecause the enumerator has noMessageto report;ExceptionFactory.Timeoutnow accepts null.Tests:
CursorEnumerableFaultTests, six server-free tests driven by a scriptedRedisDatabase. Five of six fail onmainfor the reasons above; the dispose test was verified to fail with the observation line removed.Not addressed: calling
MoveNext()again after a sync timeout while the earlier page is still in flight double-processes the reply. Pre-existing, separate issue.No 2.x backport is planned; the fix ships in the current release, which is a non-breaking upgrade from 2.13.x.
Checklist