Repository navigation
Bump Aspire.Hosting.Docker and 6 others - #301
Open
dependabot[bot] wants to merge 1 commit into
Open
dependabot[bot] wants to merge 1 commit into
dependabot[bot] wants to merge 1 commit into
Conversation
Bumps Aspire.Hosting.Docker from 13.6.0 to 13.6.1 Bumps Aspire.Hosting.PostgreSQL from 13.6.0 to 13.6.1 Bumps Aspire.Hosting.Testing from 13.6.0 to 13.6.1 Bumps Marten from 9.45.0 to 9.47.0 Bumps Quartz.Extensions.Hosting from 4.3.0 to 4.4.0 Bumps Radzen.Blazor from 12.0.5 to 12.0.8 Bumps WolverineFx.Marten from 6.45.0 to 6.48.3 --- updated-dependencies: - dependency-name: Aspire.Hosting.Docker dependency-version: 13.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Aspire.Hosting.PostgreSQL dependency-version: 13.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Aspire.Hosting.Testing dependency-version: 13.6.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Marten dependency-version: 9.47.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Quartz.Extensions.Hosting dependency-version: 4.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Radzen.Blazor dependency-version: 12.0.8 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: WolverineFx.Marten dependency-version: 6.48.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch ... Signed-off-by: dependabot[bot] <support@github.com>
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.
Updated Aspire.Hosting.Docker from 13.6.0 to 13.6.1.
Release notes
Sourced from Aspire.Hosting.Docker's releases.
13.6.1
What's New in Aspire 13.6.1
Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows.
🐛 Fixes
📊 Dashboard CPU usage could increase during long-running metric ingestion — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes #20725. (#20747, backport of #20736, @JamesNK)
📈 The Metrics tree could not be scrolled — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes #20728. (#20762, backport of #20758, @heyysiri)
🧭 Dashboard navigation could fail after a browser disconnect — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. (#20545, backport of #20527, @JamesNK)
🖥️ Container exec watches could terminate shortly after AppHost startup — A stalled DCP watch connection could produce a critical
Watch task over Kubernetes ContainerExec resources terminated unexpectedlyerror and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. (#20664, backport of #20466, @radical)🪟 Session-scoped containers could remain running after stopping a .NET AppHost on Windows — AppHosts launched through
dotnet runordotnet watchnow allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C andaspire stopflows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes #20495. (#20514, backport of #20494, @danegsta)Full Changelog: v13.6.0...v13.6.1
Full commit: 3751e615ad660621f2a7aa4c390ef48e08a0eed8
Commits viewable in compare view.
Updated Aspire.Hosting.PostgreSQL from 13.6.0 to 13.6.1.
Release notes
Sourced from Aspire.Hosting.PostgreSQL's releases.
13.6.1
What's New in Aspire 13.6.1
Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows.
🐛 Fixes
📊 Dashboard CPU usage could increase during long-running metric ingestion — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes #20725. (#20747, backport of #20736, @JamesNK)
📈 The Metrics tree could not be scrolled — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes #20728. (#20762, backport of #20758, @heyysiri)
🧭 Dashboard navigation could fail after a browser disconnect — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. (#20545, backport of #20527, @JamesNK)
🖥️ Container exec watches could terminate shortly after AppHost startup — A stalled DCP watch connection could produce a critical
Watch task over Kubernetes ContainerExec resources terminated unexpectedlyerror and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. (#20664, backport of #20466, @radical)🪟 Session-scoped containers could remain running after stopping a .NET AppHost on Windows — AppHosts launched through
dotnet runordotnet watchnow allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C andaspire stopflows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes #20495. (#20514, backport of #20494, @danegsta)Full Changelog: v13.6.0...v13.6.1
Full commit: 3751e615ad660621f2a7aa4c390ef48e08a0eed8
Commits viewable in compare view.
Updated Aspire.Hosting.Testing from 13.6.0 to 13.6.1.
Release notes
Sourced from Aspire.Hosting.Testing's releases.
13.6.1
What's New in Aspire 13.6.1
Patch release for Aspire 13.6 that reduces dashboard CPU usage during sustained metric ingestion, restores scrolling in the Metrics tree, improves dashboard navigation, fixes container exec watch failures, and ensures session-scoped containers are cleaned up when stopping .NET AppHosts on Windows.
🐛 Fixes
📊 Dashboard CPU usage could increase during long-running metric ingestion — Metric retention repeatedly scanned retained history on every insertion, causing steadily increasing CPU usage even with a fixed workload. Cleanup now skips dimensions below capacity and removes only the oldest surplus points when needed. Existing retention limits and exemplar behavior are unchanged, and no configuration changes are required. Regression introduced in 13.6. Fixes #20725. (#20747, backport of #20736, @JamesNK)
📈 The Metrics tree could not be scrolled — The meter and instrument tree now scrolls when it exceeds the viewport, allowing you to reach and select instruments below the fold. Regression introduced in 13.6. Fixes #20728. (#20762, backport of #20758, @heyysiri)
🧭 Dashboard navigation could fail after a browser disconnect — Pending page-state updates now persist session state before navigating and skip navigation when the browser has disconnected, avoiding an unhandled navigation failure. The navigation rail's overflow button also has consistent sizing, icon alignment, and hover styling in expanded and collapsed layouts and both light and dark themes. (#20545, backport of #20527, @JamesNK)
🖥️ Container exec watches could terminate shortly after AppHost startup — A stalled DCP watch connection could produce a critical
Watch task over Kubernetes ContainerExec resources terminated unexpectedlyerror and stop subsequent terminal state and log updates from being observed. Watch connection attempts now retry after timeouts, and periodic restarts correctly recreate connections without swallowing unrelated cancellation. Regression introduced in 13.6.0. (#20664, backport of #20466, @radical)🪟 Session-scoped containers could remain running after stopping a .NET AppHost on Windows — AppHosts launched through
dotnet runordotnet watchnow allow DCP to finish resource cleanup during shutdown, including existing Ctrl+C andaspire stopflows. Persistent resources remain unaffected, while direct .NET launches and TypeScript/polyglot AppHosts retain their existing process protection. Fixes #20495. (#20514, backport of #20494, @danegsta)Full Changelog: v13.6.0...v13.6.1
Full commit: 3751e615ad660621f2a7aa4c390ef48e08a0eed8
Commits viewable in compare view.
Updated Marten from 9.45.0 to 9.47.0.
Release notes
Sourced from Marten's releases.
9.47.0
The
FetchForWriting/FetchLatestconsistency release, plus a bounded async-daemon shutdown.Read the behaviour changes before upgrading. Two of them can change how your projections and
subscriptions behave on every deployment, and two more refuse a batch shape that used to be accepted.
Subscription and projection drains are now bounded by
StopAndDrainTimeout([#5610])Via JasperFx 2.81.0 (jasperfx#953 and jasperfx#983). When a shard stops — host shutdown, or reassignment
to another node — the page in flight finishes, pages still queued are skipped and resumed by the next
owner from committed progression, and a page still running at
Projections.StopAndDrainTimeout(default 5 seconds) is cancelled with its transaction rolled back.
This fixes a real failure: a node that loses a shard's lock no longer keeps applying its backlog
alongside the new owner, an overlap that could end in
ProgressionProgressOutOfOrderExceptionand aStopped shard. Graceful shutdown is also bounded now, rather than waiting out the whole backlog and
potentially overrunning a Kubernetes termination grace period.
If your projection or subscription pages take longer than 5 seconds, raise the timeout:
Otherwise those pages are cancelled and re-processed on every shutdown and rebalance. Delivery was
always at-least-once, so no guarantee changed, but duplicates become much more likely — and side effects
performed outside the Marten session (HTTP calls, sends that bypass the transactional outbox) are not
rolled back with the page. Note this applies to async projections as well as subscriptions; the upstream
note covers only subscriptions and is out of date.
A batched
FetchLatestor expected-versionFetchForWritingmust be first in its batch ([#5604])For an aggregate projected with
ProjectionLifecycle.Asynconly. Both now bracket their reads inbegin transaction isolation level repeatable read read only…endso those reads share one snapshot,and PostgreSQL accepts that only as a transaction's first statement. So:
batch.Events.FetchLatest<T>(id)andbatch.Events.FetchForWriting<T>(id, version)have to be thefirst operation in their batch, and
FetchForExclusiveWriting.Both are refused at the enlisting call, naming the call to move, rather than surfacing later as a bare
25001. Inline and Live aggregates are unaffected, and inside a caller-owned transaction no bracket isemitted so neither rule applies. If you batch a
FetchLatestbehind aLoad, move it to the front.New
SnapshotRaceExceptionfrom a batched exclusive fetch ([#5613])A batched
FetchForExclusiveWritingon an Async aggregate now throwsMarten.Exceptions.SnapshotRaceExceptionin the rare case where the daemon commits a snapshot between that batch's two reads. Retry the batch, or
fetch outside a batch — outside a batch Marten retries for you and you will never see it.
... (truncated)
9.46.0
Mostly a resiliency and Native AOT release. Five behaviour changes — the retry ones are the most likely to be noticed, because Marten now surfaces failures it used to absorb.
Behaviour changes
A command timeout is no longer retried on reads (#5566, #5580). An attempt that timed out has already spent the whole
CommandTimeout, so retrying it three times held the caller for four timeouts instead of one. This covers both shapes: Npgsql's client-sideCommandTimeout, and a server-sidestatement_timeout, which arrives as57014 query_canceledwith noTimeoutExceptionanywhere in the exception. Connection-pool exhaustion arrives in the same shape and so is no longer retried either — a deliberate trade, documented in the resiliency guide along with what to do instead.Sticky, ambient and external session lifetimes now fail loudly (#5582, #5598), via the new
SessionTransactionUnusableException. Two things used to go wrong silently. A broken connection reportedConnectionState.Closed, so Marten reopened it — onto a different backend — and handed the command the stale transaction, which Npgsql accepts; aSerializablesession then quietly answered from a newer snapshot. And a command timeout inside a transaction aborted it, after which every later call returned a bare25P02naming neither the timeout nor the way out. For caller-owned transactions Marten records the cause and reports it but rolls nothing back — the scope is still yours.The async serializable session builders now produce a serializable session (#5594).
OpenSerializableSessionAsync(new SessionOptions())previously returned a session that was neither serializable nor auto-closing: it held one connection open for its lifetime with no transaction. These two methods now pinIsolationLeveltoSerializableand begin the transaction eagerly. A non-Serializable level passed to them is overridden rather than silently honoured.The async daemon spends one retry budget instead of two (#5593).
ResilientEventLoaderand theQuerySessioninside it were both given the same pipeline, so a handled failure ran up to sixteen times.A retried write no longer accumulates exceptions across attempts (#5591). The exception list was shared, and
ExecuteBatchPagesAsyncbranches on its count — so one operation failing twice turned a rethrow into anAggregateException, making the caller's exception type depend on how many retries happened.Native AOT
Strong-typed document ids now work (#5589, #5579), with one registration per document type:
Previously a single strong-typed id anywhere in the store killed the application while the first document's mapping was built. The identity path closes a chain of generics over your id type, and a native image has no instantiation for them unless something roots it; naming all three types is what roots them. Under a JIT the call does nothing — unregistered types still take the reflective path. Not yet covered: F# single-case discriminated-union ids, and
.IsOneOfover a strong-typed id. The intent is forMarten.SourceGeneratorto emit these registrations so the call becomes unnecessary.Also AOT: a decimal comparison in a LINQ filter is documented with a tested workaround (#5597) — it is the BCL expression-tree factory rather than Marten, but it only shows up from a native binary. Marten's AOT runtime gate now covers strong-typed ids and decimals, so these stay pinned.
Fixes
PrefixSearchquotes each word as a tsquery lexeme (#5571, #5568), so a search box containing&,|,!,(,:or a tab no longer produces42601: syntax error in tsquery. Not an injection — the term was already a parameter — but the documented contract says each word is treated as a prefix, and raw input has to be escaped to honour that.AdvisoryLockshutdown release is bounded, and the vendored copy moves back to Weasel (#5572, #5576).catch-and-Console.WriteLine-and-rethrow blocks removed (#5584) — they bypassedIMartenSessionLoggerand any configuredILogger, and one of them also closed a connection on the line above the one that opened it.Dependencies
JasperFx 2.80.2 (#5590) and Weasel 9.41.0 (#5596, #5576). Both carry Native AOT work of their own on the identity path — JasperFx's
ValueTypeInfowrappers and aggregate identity sources, Weasel's non-genericIIdentificationfacade.🤖 Generated with Claude Code
https://claude.ai/code/session_01481eiEZg1Bv6pu4DrgPRg3
Commits viewable in compare view.
Updated Quartz.Extensions.Hosting from 4.3.0 to 4.4.0.
Release notes
Sourced from Quartz.Extensions.Hosting's releases.
4.4.0
Quartz.NET 4.4 is history you can run a business on. Each run says what it achieved: succeeded, failed,
cancelled or skipped, with a summary and metrics. The history keeps that per job, sweeps it by result and charts
it over time, and a health check degrades when a required job stops succeeding. Recovery respects rolling
deploys, and triggers already due fire in the transaction that acquires them: at 20 triggers a second on
PostgreSQL, 95–99 % of firings land within ±50 ms, up from 54 % on 4.3.0. Quartz.Weasel now manages the job store's schema on six databases, adding MySQL, Oracle and Firebird.
Highlights
context.Result, a status per job, retentionby result, and a chart of runs over time. Execution history and outcomes
RequireSuccessWithin(jobKey, TimeSpan.FromHours(26))degrades when a nightly jobstops succeeding. Execution history and outcomes
RunAtStartup, scheduling a triggeralready paused, and pausing a set of keys with a reason in one call. Scheduling
420–429 firings a second. Reliability and clustering
or the restarted node. Reliability and clustering
Quartz.Weasel.MySQL,Quartz.Weasel.OracleandQuartz.Weasel.FirebirdjoinPostgreSQL, SQL Server and SQLite. Databases and Weasel
HTTP API and dashboard
Execution history and outcomes
context.Result = JobRunReport.Skipped("…").With("released", 3).JobRunResult {Succeeded, Failed, Cancelled, Skipped}.1059/1060).
MisfireReason.Vetoed). Manual runs (TriggerJob) are marked.JobRunStatus: last run, last success and failure, consecutive failures, counts.RetentionByResult,MisfireRetention) andMaxEntriesPerJob.sweeps per cluster.
with history on went from 113–248 to 77–189 firings a second. Tracked in #3979.
database/migrations/database/migrations/…. (#3972)and the HTTP API's
JobExecutedevent carry it, not the wrapper's "Job threw an unhandled exception". Logtemplates are unchanged.
... (truncated)
Commits viewable in compare view.
Updated Radzen.Blazor from 12.0.5 to 12.0.8.
Release notes
Sourced from Radzen.Blazor's releases.
12.0.8
12.0.8 - 2026-10-10
Improvements
AllowOverlapparameter. When it isfalsea move or resize that would place a tile over another visible tile is blocked: the tile first tries the free axis alone so a diagonal drag slides along the neighbor, otherwise it stays at its last valid cell. Tiles that already overlap when the drag starts are ignored so they can still be pulled apart. The default staystrue.Fixes
ReloadwhenKeyPropertyis set. The row toggler icon resolved the expanded state by key while the detail row andCollapseItemresolved it by object reference, so afterReloadreturned fresh objects with the same keys the icon stayed expanded, the detail disappeared and clicking the icon could not remove the stale entry. The row template now usesIsRowExpanded,CollapseItemremoves the stored key that matches byKeyProperty,Singleexpand mode compares withItemEqualsand the hierarchy view re-keys the child data to the fresh parent object so expanded children survive a reload (#2752).Valuewhen it is declared beforeDatain the markup. Blazor assigns parameters in markup order and theDatasetter resets the stored value wheneverDatachanges, so aValuedeclared beforeDatawas lost on the first render and again every timeDatawas replaced. TheValueparameter is now captured before the first await and re-applied after the base call when theDatasetter has reset it (#2754).Datais an EF CoreIQueryable. The null guard added aroundAny/AllandIsEmpty/IsNotEmptycollection filters protects in-memory data withnullcollections, but EF Core cannot translate anullcomparison of a projected collection such asc.Orders.Select(o => o.Number).ToList()and failed the whole query with "could not be translated". The guard is now emitted only for in-memory sources, so database providers get a plainAny/Allas in 11.1.6 (#2755).12.0.7
12.0.7 - 2026-10-08
Fixes
ViewStartandViewEndaViewChangehandler assigns during a mouse wheel zoom or scrollbar pan. The callbacks fired while the internal zoom guard was active, so a handler that re-anchored the bound range, for example to keep the latest data in view, updated the parent state while the chart kept rendering the cursor-centered range until the next unrelated render. AfterViewStartChanged,ViewEndChangedandViewChangecomplete the chart now takes the range it received, clamps it and raisesZoomChangedagain if the zoom level moved.ShowDays="false"is usable again with the drill-down navigation. The month and year grids were rendered inside the sameShowDaysblock as the day table, so a month or year picker showed only the header: the title cycled through the month and year views with nothing drawn, the year-range view had no way back and its arrows moved the current date by twelve years. The grids are now rendered regardless ofShowDaysand only the day table is gated by it. WithShowDaysfalse the calendar opens in the month grid, the title drills up to the year grid, a year cell returns to the month grid and a month cell stays there with the picked month highlighted and focused. Picking a month changesCurrentDateand raisesCurrentDateChangedas the v11 header dropdowns did; the boundValueis not committed, so existing handlers keep working.DropDownnavigation withShowDaysfalse still renders only the header dropdowns.INDEX($W$7:$W$521,...)in column V andINDEX($V$31:$V$521,...)in column W recursed through the whole block and crashed with a stack overflow in WebAssembly. Recalculation now follows a calculation chain: only the cells dirtied by a change are recalculated, every other formula cell is read from its stored value, and a formula that reads a dirty precedent not yet calculated is re-queued after it, so stack depth is bounded by formula nesting instead of data size and cycles are detected at calculation time. Cell and range expressions evaluate to references that are dereferenced only where values are needed, soINDEX,ROW,COLUMN,ROWS,COLUMNS,VLOOKUP,HLOOKUPandXLOOKUPread only the cells they use, andIF,IFERROR,IFNA,IFS,SWITCHandCHOOSEevaluate only the branch they take, soROW(A5)in A5 is 5 instead of#CIRCULARandCHOOSE(1,5,1/0)is 5. An error criterion inCOUNTIF,SUMIF,AVERAGEIFand the*IFSfunctions matches cells holding the same error instead of failing the formula. The dependency graph stores each distinct range once with the formulas that read it, which cut building it for the reported workbook from 23.8 s to 0.3 s. All formula cells of the three attached workbooks match the values Excel saved (#2750).XmlReaderinstead of loading each sheet part into anXDocument, so the cell elements are never materialized asXElementandXAttributeobjects. Loading that workbook in WebAssembly allocates 244 MB instead of 535 MB and takes 10.7 s instead of 20.4 s.12.0.6
12.0.6 - 2026-10-06
Improvements
Worksheet.RightToLeftdisplays a sheet right to left, with column A on the right.XlsxWriterwrites it asrightToLeft="1"on the sheet view andXlsxReaderreads it back, so Arabic and Hebrew workbooks no longer open left to right. TheRadzenDataGridExcel export follows the computed direction of the rendered grid, and the newDataGridExcelExportOptions.RightToLeftoverrides it (#2748).Fixes
OnPancalls that each re-rendered every column and took over two minutes to settle. The zoom and pan interop is now serialized, with the newest pan position and the accumulated wheel steps sent in one call,RadzenColumnSeriesandRadzenBarSeriesskip the items outside the zoomed plot area, andRadzenLineSeriesandRadzenAreaSeriesbuild their path from the points that reach it plus the neighbors the curve needs, unlessAnimateDataUpdatesis set. A zoomed chart with 20000 columns now settles 40 ms after the last scrollbar move (#2749).MinandMaxand noStepalways labelsMax. The tick step divides the pinned range evenly instead of rounding up to a whole number, which pushed the last tick pastMaxand dropped it whenever the range was not a multiple of the tick count, for exampleMin="0" Max="100"ended at 68. Axes withStep, with a single bound or with neither are unchanged.CultureandHeaderDateFormatinstead of a hard-codedM/d. The day labels of the Day zoom and the week range labels of the Month zoom useHeaderDateFormatwhen it is set, and otherwise the short date pattern of the Gantt culture without its year part (M/dfor en-US,dd/MMfor en-GB,dd.MMfor de-DE). The Gantt passes itsCultureandUICultureto the inner scheduler, and the zoom buttons carry a class per view (rz-gantt-view-day,-week,-month,-year,-years) so an application can hide a zoom by class instead of by position (#2745).ResizeObserverfired once more with a 0x0 size for the detached scroll container and calledOnResizeon an already disposedDotNetObjectReference. The observer now disconnects itself when the scroller is no longer connected, and the call is guarded like the other resize observers (#2746).applyQuotePrefixon the cell style of a quote-prefixed cell. The attribute is not part ofCT_Xfin ECMA-376, so strict readers such as openpyxl refused the file with "unexpected keyword argument 'applyQuotePrefix'". OnlyquotePrefix="1"is written now (#2747).Commits viewable in compare view.
Updated WolverineFx.Marten from 6.45.0 to 6.48.3.
Release notes
Sourced from WolverineFx.Marten's releases.
6.48.3
A patch release for blue/green warm-ups at fleet scale, from a second production report by @erdtsieck on 6.48.2: every green-only agent went to the first green node to register, and the two green nodes that joined seconds later got nothing for half an hour.
WOLVERINE_FLEET_SCALE=production.IQuerySessionbut sends messages now gets its commit (#4910, @srimalw; #4912 for Polecat and Fisher). TheIQuerySessionpermutation of #2941: the read-only parameter was served by casting the outbox-enrolled session, butCanApplyignored it, so a scheduled cascade was never handled and a durable local message only ever ran from memory. Reading alone still does not make a chain transactional; reading plus sending does — an injectedIMessageBus, a returnedOutgoingMessages, or a cascading return value.Everything else is as in 6.48.2.
6.48.2
A patch release for agent assignment at fleet scale, from a production report by @erdtsieck: ~62,000 per-tenant event-subscription agents on 5 to 8 nodes, where a newly elected leader spent 66 minutes in its first assignment evaluation during a blue/green warm-up and three leaders in a row were replaced before one finished.
AssignmentGrid.MatchAgentsToCapableNodesForwas quadratic in the agent count whenever any capability differed between nodes — which a single bumped projection version is enough to trigger.batchCommandsremoving each start command from the list one at a time, the heartbeatFill()-ing every running agent into the node record, per-placementFill()on the grid's node, and per-placement recounts in both even distribution paths. Measured through the leader's real evaluation at the reported shape: the even blue/green path's first evaluation went from 76 s to under 5 s.DurabilitySettings.LeaderTakeoverHoldEvaluations(default 1, 0 disables) withholds bare first-time placements for that many evaluations after election, so the predecessor's starts can surface as assignment rows and be kept where they are. It stands down when no other node holds any assignment, so a cold start pays nothing.WOLVERINE_CHAOS_SOAK=<rounds>) that stays out of CI.Everything else is as in 6.48.1.
6.48.1
A patch release for one global partitioning bug found by @alexandrefresnais right after 6.48.0.
Everything else is as in 6.48.0.
6.48.0
A fast follow-up to 6.47.0 with five fixes, three of them for how a Wolverine cluster behaves when nodes come and go.
Clustering and agent distribution
StartAgents,StopAgents,QueryAgentPresence) were logged as enqueued, never reached the broker, and timed out, so agents stopped on a scaled-in node were never re-placed. Routes now resolve their sending agent on every use. Reported from production on Azure Container Apps with Azure Service Bus control queues; the workaround there was a very longSendingAgentIdleTimeout.TooBusy, so the back pressure sweep later restarted the slot on a node that no longer owned it. Reported with a complete reproduction by @alexandrefresnais.ApplyRestrictionsAsyncwaits for the released or pinned agent to appear in the persisted node assignments and throwsAgentRestrictionsNotConfirmedExceptionnaming it, instead of returning as if the agent had started. NewDurabilitySettings.AgentRestrictionConfirmationTimeout(default 10 seconds) bounds the wait. This is what lets CritterWatch stop acknowledging a restart that started nothing.RabbitMQ
Deduplication
[Deduplicated]takes its own claim window (#4857, #4858, by @uniquelau).[Deduplicated(WindowInSeconds = 600)]gives one handler a different claim lifetime from the host-wideDeduplicationWindow, matching what[DeduplicatedWithResponse]already offered for HTTP. Works across the RDBMS, Marten, Polecat and Fisher deduplicators; pre-generated code for handlers without a window is unchanged.Thanks to @alexandrefresnais, @tannerwatson and @uniquelau for the reports, reproductions and pull requests.
6.47.0
Wolverine 6.47.0 is a release that largely came from outside the core team. The biggest change in it, a hardening pass over the NATS JetStream transport, was reported, designed and written by a community member, and so was the fix for a global partitioning handoff that stranded scheduled messages. Thank you to everyone who sent code, reproductions, or diagnoses this time around.
Community contributions
NATS JetStream
Sending durably over JetStream, with an outbox in front of a stream, lost messages in several places without an error or a log line. All of them are closed (#4856, with follow-ups in #4859):
DiscardPolicy.New, a failedNats-Expected-*check, an oversized message) with aPubAckcarrying an error, not an exception. Wolverine read only the sequence, reported success, and the durable outbox deleted a message the stream never stored. It throws now, the outbox keeps the message, and a duplicateNats-Msg-Idis still a success.MaxDeliveris used up. A buffered listener acknowledges on receipt, so under the old guard the message was simply gone. The dead letter copy carries its ownNats-Msg-Id, because the original's id had it discarded as a duplicate when the dead letter subject sat in the same stream.AsWorkQueue()has always meant interest retention, which drops a message published while no consumer is bound, which is exactly the startup and rebalancing window a sharded topology has. The streamsUseShardedNatsSubjects()declares now keep a message until it is acknowledged.AsWorkQueue()itself is unchanged; its docs now say what it does.ConfigureNatsOpts()gives you the last word over the NATS.Net client options, for the pending channel size, ping interval and anything else Wolverine does not surface. It applies to the shared and every tenant connection.AckWaitorMaxDeliverin code just works.Provisioning(NatsProvisioning.CreateOnly | CreateOrUpdate | Verify)controls what startup does with declared streams and named consumers that already exist, withVerifyfailing the start and listing every deviation. Resource setup and the listener now write the same consumer settings, filter included, so aVerifyhost starts cleanly after resource setup.InvokeAsync()fails at once when nobody is listening. A request now carries a per-request reply subject, so the server's "no responders" answer reaches the waiting call and it fails in milliseconds withWolverineRequestReplyExceptioninstead of waiting out its timeout. The responding side answers on that exact subject, which a NATS user limited toallow_responsesrequires.Global partitioning and durability
An exploratory pass over global partitioning after the long chain of slot handoff fixes, looking for the next "runs on a node that does not own the slot" before it was reported (#4853). It found two:
And around it:
Envelope.Attempts; a database or broker queue saw attempts go 1 then 3 (#4855).Native AOT
The 6.46.0 AOT work stopped at the first failure each publish cycle, because the smoke target did. That is fixed, and the lanes it now runs found the rest:
SideEffectPolicycould not findExecuteonIStartStream, the HTTPIEndpointMetadataProviderclose was trimmed, and Marten could not mapEnvelopein a native image. All three are rooted or avoided now.InvokeAsync<Guid>request/reply shape, killed a native image at startup because the routing warm-up closed a generic over it reflectively. The routers take the message type as an argument now, so the one reflective close every message type had to be rooted for is gone, along with everything that existed to prop it up.Also in this release
JasperFx.Events.InMemoryprototyping store, so a store-agnostic application's handlers run before anyone has chosen Marten, Polecat or Fisher. Only Wolverine's store-agnostic usage is supported (#4844).6.46.0
Wolverine 6.46.0 is the release where Native AOT stopped being aspirational. Ten of the changes below came out of one sustained hunt, and the pattern that emerged is worth stating plainly: under Native AOT, the fix is almost never to root a generic harder — it is to stop closing one.
Thank you to the people outside the core team who shipped code in this one. Five of the fixes here came from the community, and several of them are in corners the maintainers would not have found on their own.
Community contributions
[FromClaim]code generation was broken for URI claim types (#4783), and EF Core had three distinct problems in one report:[Entity]on a step method, query plans, and multi-tenantDbContextresolution (#4769).User-scope warning (#4779), plus a documentation fix for something that bites every newcomer: the first-use handler compile counts against a tracked session's timeout (#4786).[Deduplicated]claims are kept in the main store when you run a database per tenant (#4813). Every[Deduplicated]chain used to throw on its first keyed message in that configuration.Native AOT
Sagas work under Native AOT now (#4809). That took three separate blockers, and each one taught us a rule that is now written down:
[DynamicDependency]preserves metadata, not code. An AOT root over a value-type instantiation is silently ineffective — no warning, no diagnostic, just a missing type at startup. The roots that appear to work survive through reference-type canonical sharing, which is why this went unnoticed for so long.Acting on those: a frame can now contribute its own AOT root (#4801), the EF Core frames closed over your
DbContextare rooted (#4803), and the Marten, Polecat and FisherFetchLatestframes were de-genericized rather than rooted (#4793, #4806). The HTTP and response-aware chain paths got the closed generics they need (#4790), and an[UnconditionalSuppressMessage]scope that ILC rejects outright was fixed (#4791).Two things worth calling out for anyone running AOT in production:
Guidtenant id, or a[DeduplicationIdentity]on aGuid, which needs no configuration at all. Both crashed the host at startup in a native image. Neither was reachable by any existing rooting mechanism, so both now avoid closing the generic at all.Durability and clustered agents
A wave of fixes to inbox ownership and global partition slots, all of them cases where a message could stall rather than fail:
TenantedSenderdeliberately cannot forward anISenderCallback— doing so broke fire-and-forget senders in a previous attempt. There is now aCallbackAwareTenantedSenderfor the senders that settle the outbox themselves, with the original left exactly as it was. Every broker-per-tenant transport can use it; only MQTT does so far.Security and dependencies
System.Formats.Asn17.0.0 is lifted, and the whole package graph is audited (#4781, GH-4773).JasperFx.Eventsinterface breaks a store at runtime rather than at compile time, so leaving a store package behind is the actual hazard.Commits viewable in compare view.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions