Bump the nuget-minor-patch group with 9 updates#43
Merged
Conversation
Bumps Marten from 9.14.1 to 9.15.4 Bumps Microsoft.AspNetCore.DataProtection.Abstractions from 10.0.9 to 10.0.10 Bumps Microsoft.Extensions.DependencyInjection.Abstractions from 10.0.9 to 10.0.10 Bumps Microsoft.Extensions.Http from 10.0.9 to 10.0.10 Bumps Microsoft.Extensions.Http.Resilience from 10.7.0 to 10.8.0 Bumps Microsoft.NET.Test.Sdk from 18.7.0 to 18.8.1 Bumps Microsoft.Playwright from 1.49.0 to 1.61.0 Bumps Radzen.Blazor from 11.1.3 to 11.1.5 Bumps WolverineFx.Marten from 6.17.1 to 6.19.0 --- updated-dependencies: - dependency-name: Marten dependency-version: 9.15.4 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Microsoft.AspNetCore.DataProtection.Abstractions dependency-version: 10.0.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Microsoft.Extensions.DependencyInjection.Abstractions dependency-version: 10.0.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Microsoft.Extensions.Http dependency-version: 10.0.10 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Microsoft.Extensions.Http.Resilience dependency-version: 10.8.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.8.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Microsoft.Playwright dependency-version: 1.61.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Radzen.Blazor dependency-version: 11.1.5 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: WolverineFx.Marten dependency-version: 6.19.0 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 Marten from 9.14.1 to 9.15.4.
Release notes
Sourced from Marten's releases.
9.15.4
What's Changed
New Contributors
Full Changelog: JasperFx/marten@v9.15.3...v9.15.4
9.15.3
This addresses a potential vulnerability from SQL injection via non-string constant in a LINQ Select projection
Not a common usage, but still.
What's Changed
Full Changelog: JasperFx/marten@9.15.2...v9.15.3
9.15.2
Marten 9.15.2
A patch release. Both fixes come out of the same 512-tenant-database production deployment, reported by @erdtsieck, and both turned out to be worse than the reports described.
Bulk event insert ran a full schema apply on every batch
#4946 — fixed in #4949
The batch
BulkInsertEventsAsyncoverloads opened withStorage.ApplyAllConfiguredChangesToDatabaseAsync()on every call.That is not a cheap check. It calls
Tenancy.BuildDatabases()and runs a full schema delta — partition introspection plusinformation_schemasweeps — across every database in the store. So a sharded store paid one apply per database, per batch. On the reporting deployment, each ~1,000-event batch was triggering 512 schema applies.The measured effect: import throughput collapsed to ~17 events/s, against >3,000/s for the streaming overload. A 686k-event tenant projected to roughly 11 hours. The connection pool filled with ~370 backends whose last statement was Weasel's partition-introspection query, which fed directly into the server-wide connection pressure that deployment was already fighting.
That the streaming overload
BulkInsertEventStreamAsynchas no such call and is fine is the tell: the schema apply was never part of the contract. It was a leftover.The apply is now:
AutoCreateisNone— it is a no-op there by contract, so all that remained was the introspection cost; andIMartenDatabase.Identifier.One subtlety worth recording, because it is the kind of thing that bites later: the memoized apply deliberately does not take a caller's
CancellationToken. The first caller to arrive owns the single in-flight task that every concurrent caller for that database awaits — so binding that shared task to one caller's token would let a single cancelled batch fail sibling batches that were never cancelled. Each caller applies its own token at the await site instead. A schema apply is short and idempotent, so letting it run to completion is the cheaper trade.Under
AutoCreate.None, the event storage must already exist before import. That is the documented contract and it matches the streaming overload — but if you were previously relying on the per-call apply to create it for you under a non-Nonestore, note the change.The document bulk-insert path (
BulkInsertAsync/BulkInsertDocumentsAsync) is unaffected. It routes through the ordinary per-featureEnsureStorageExistsAsyncthat Weasel already memoizes, not a full-store delta.Tenant provisioning silently under-provisioned partitions
#4944 — fixed in #4950
AddPartitionToAllTables, and the tenant-provisioning paths built on it, walked the calling store'sStoreOptionsto decide which tables needed a list partition for a new tenant.So any tool or host that provisions tenants from a store which doesn't register every document type silently under-provisioned. Document types unknown to the caller never got their partitions — and the tenant then failed with a Postgres
23514check-constraint violation on first write to the missing partition. Nothing failed at provisioning time; the damage surfaced later, somewhere else.The workaround was "the provisioning tool must register all document types," which re-creates schema knowledge in a second place and drifts as document types are added.
The sweep is now database-driven: it enumerates tenant list-partitioned tables from the Postgres catalog, so a partially-registered store still provisions every partitioned table it finds.
Scoping is enforced inside the catalog query rather than filtered in memory afterward:
AllSchemaNames()only. Foreign partitioned tables in a shared database are never touched.tenant_id. This is the filter that matters most, and it is what keeps the sweep off Marten's own non-tenant list partitioning:UseArchivedStreamPartitioningkeysmt_eventsonis_archived, andByList()keys on its own field. Without it, a "helpful" sweep would start adding tenant partitions to tables partitioned on something else entirely.ByExternallyManagedListPartitions()are subtracted.Opt out with
SweepPartitionedTablesFromDatabase(default on). No Weasel change was required.Known limitation, and it is a real one: a document type registered into a schema the calling store has never heard of stays invisible to the schema filter — a store cannot own a schema it does not know exists. Single-schema stores (the default, and the reporting deployment's shape) are fully covered. Closing this properly would need a persisted table list alongside
mt_tenant_partitions.... (truncated)
9.15.1
Patch release for a silent data-correctness regression. If you use
ForTenant()on an identity-mapped or dirty-tracked session, upgrade.Fixed
#4947 —
ForTenant()on an identity session stopped returning tenancy-neutral documents (reported by @dervagabund, with a repro — thank you). AForTenant()view of an identity- or dirty-tracked session no longer saw global (tenancy-neutral) documents tracked by the parent session. Since a global document has exactly one row per id for the whole database,LoadAsyncthrough theForTenantview missed the identity map, went to the database, and returnednullfor a document that is there. A silent wrong answer, not an error.Affected: 9.13.0, 9.14.x, 9.15.0. Introduced by the fix for #4801, which tenant-scoped the identity map and version tracker for
ForTenantsessions. That was correct for conjoined documents — where the same id means a different document per tenant — but it was applied per session rather than per document type, so it also isolated document types that are tenancy-neutral and must be shared.Sharing is now decided per document type. A nested
ForTenantsession shares the parent's identity-map and version-tracker entry for a type only when the storage is identity-mapped, the type is notConjoined, and the nested session's database is the same instance as the parent's (under database-per-tenant, the same id in another tenant's database is a different document even for a tenancy-neutral type). The isolation introduced by #4801 is preserved exactly — theBug_4801suite still passes, and the new tests include guard rails asserting conjoined documents stay isolated.Full changelog: JasperFx/marten@9.15.0...9.15.1
9.15.0
Closed issues
findOrAssignTenantDatabaseAsyncreturned early on an existing assignment row, skippingcreatePartitionsForTenant+ per-tenant event-sequence provisioning — so a tenant whose provisioning was interrupted (assignment committed, partitions missing) failed every write with23514forever. Both early-return paths (including a second race-window hole under the advisory lock) now run the same idempotent repair the explicitAddTenantToShardAsync(tenantId, databaseId)overload always ran, guarded to once per process per tenant via the resolution cache.Also in this release
JasperFx.Events.SourceGeneratoranalyzer (JasperFx/jasperfx#505) — CS1061 compile break for no-parameterless-ctor aggregates with instanceApplyreturning the aggregate.pg_inherits) for the #4943 provisioning-tool scenario.Verified against Wolverine (full solution + CoreTests/MartenTests/distribution/Http suites, zero failures) and CritterWatch before publishing. Thanks to @erdtsieck for the dump-verified root-cause analysis.
Commits viewable in compare view.
Updated Microsoft.AspNetCore.DataProtection.Abstractions from 10.0.9 to 10.0.10.
Release notes
Sourced from Microsoft.AspNetCore.DataProtection.Abstractions's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.Extensions.DependencyInjection.Abstractions from 10.0.9 to 10.0.10.
Release notes
Sourced from Microsoft.Extensions.DependencyInjection.Abstractions's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.Extensions.Http from 10.0.9 to 10.0.10.
Release notes
Sourced from Microsoft.Extensions.Http's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.Extensions.Http.Resilience from 10.7.0 to 10.8.0.
Release notes
Sourced from Microsoft.Extensions.Http.Resilience's releases.
10.8.0
This release adds new experimental APIs to Microsoft.Extensions.AI.Abstractions and updates the OpenAI dependency to 2.12.0, alongside documentation, test, and repository maintenance.
Experimental API Changes
New Experimental APIs
AIFunctionNameAttributeandAIParameterNameAttribute#7610 by @jozkee (co-authored by @jeffhandley @Copilot)ToolApprovalRequestContent.RequiresConfirmation(MEAI001) #7549 by @javiercn (co-authored by @Copilot)What's Changed
AI
Vector Data
Documentation Updates
Test Improvements
Repository Infrastructure Updates
... (truncated)
Commits viewable in compare view.
Updated Microsoft.NET.Test.Sdk from 18.7.0 to 18.8.1.
Release notes
Sourced from Microsoft.NET.Test.Sdk's releases.
18.8.1
What's Changed
Full Changelog: microsoft/vstest@v18.8.0...v18.8.1
18.8.0
What's Changed
Full Changelog: microsoft/vstest@v18.7.0...v18.8.0
Commits viewable in compare view.
Updated Microsoft.Playwright from 1.49.0 to 1.61.0.
Release notes
Sourced from Microsoft.Playwright's releases.
1.61.0
🔑 WebAuthn passkeys
New Credentials virtual authenticator, available via BrowserContext.Credentials, lets tests register passkeys and answer
navigator.credentials.create()/navigator.credentials.get()ceremonies in the page — no real hardware key required, works in all browsers:You can also let the app register a passkey once in a setup test, read it back with Credentials.GetAsync(), and seed it into later tests — see Credentials for details.
🗃️ Web Storage
New WebStorage API, available via Page.LocalStorage and Page.SessionStorage, reads and writes the page's storage for the current origin:
New APIs
ArtifactsDirin BrowserType.ConnectOverCDPAsync() controls where artifacts such as traces and downloads are stored when attached to an existing browser.Cursorin Screencast.ShowActionsAsync() controls the cursor decoration rendered for pointer actions.OnFramecallback in Screencast.StartAsync() now receives aTimestampof when the frame was presented by the browser.🛠️ Other improvements
Browser Versions
This version was also tested against the following stable channels:
... (truncated)
1.60.0
💬 Custom assertion messages
Expect()overloads now accept a custom message that is prepended to any failure, giving extra context in test reports:When the assertion fails, the message is prefixed:
🌐 HAR recording on Tracing
Tracing.StartHarAsync() / Tracing.StopHarAsync() expose HAR recording as a first-class tracing API, with the same
Content,ModeandUrlFilteroptions asRecordHar:🪝 Drop API
New Locator.DropAsync() simulates an external drag-and-drop of files or clipboard-like data onto an element. Playwright dispatches
dragenter,dragover, anddropwith a synthetic [DataTransfer] in the page context — works cross-browser and is great for testing upload zones:🎯 Aria snapshots
Page.Locator("body").Boxesoption on Locator.AriaSnapshotAsync() / Page.AriaSnapshotAsync() appends each element's bounding box as[box=x,y,width,height], useful for AI consumption.... (truncated)
1.59.0
🎬 Screencast
New Page.Screencast API provides a unified interface for capturing page content with:
Screencast recording — record video with precise start/stop control, as an alternative to the
recordVideoDiroption:Action annotations — enable built-in visual annotations that highlight interacted elements and display action titles during recording:
ShowActionsAsyncacceptsPosition("top-left","top","top-right","bottom-left","bottom","bottom-right"),Duration(ms per annotation), andFontSize(px). Returns a disposable to stop showing actions.Visual overlays — add chapter titles and custom HTML overlays on top of the page for richer narration:
Real-time frame capture — stream JPEG-encoded frames for custom processing like thumbnails, live previews, AI vision, and more:
... (truncated)
1.58.0
Trace Viewer Improvements
Thanks to @cpAdm for contributing these improvements!
Miscellaneous
BrowserType.ConnectOverCDPAsync() now accepts an
IsLocaloption. When set totrue, it tells Playwright that it runs on the same host as the CDP server, enabling file system optimizations.Breaking Changes⚠️
_reactand_vueselectors. See locators guide for alternatives.:lightselector engine suffix. Use standard CSS selectors instead.Devtoolsfrom BrowserType.LaunchAsync() has been removed. UseArgs = new[] { "--auto-open-devtools-for-tabs" }instead.Browser Versions
1.57.0
Chrome for Testing
Starting with this release, Playwright switches from Chromium, to using Chrome for Testing builds. Both headed and headless browsers are subject to this. Your tests should still be passing after upgrading to Playwright 1.57.
We're expecting no functional changes to come from this switch. The biggest change is the new icon and title in your toolbar.
If you still see an unexpected behaviour change, please file an issue.
On Arm64 Linux, Playwright continues to use Chromium.
Breaking Change
After 3 years of being deprecated, we removed
Page.Accessibilityfrom our API. Please use other libraries such as Axe if you need to test page accessibility. See our Node.js guide for integration with Axe.New APIs
Stepsin Locator.ClickAsync() and Locator.DragToAsync() that configures the number ofmousemoveevents emitted while moving the mouse pointer to the target element.Browser Versions
1.56.0
New APIs
Breaking Changes
Miscellaneous
inputplaceholderBrowser Versions
1.55.0
Codegen
ToBeVisibleAsync()assertions: Codegen can now generate automaticToBeVisibleAsync()assertions for common UI interactions. This feature can be enabled in the Codegen settings UI.Breaking Changes
Miscellaneous
Microsoft.Playwright.Xunit.v3Microsoft.Playwright.MSTest.v4Browser Versions
This version was also tested against the following stable channels:
1.54.0
Highlights
New cookie property
PartitionKeyin browserContext.cookies() and browserContext.addCookies(). This property allows to save and restore partitioned cookies. See CHIPS MDN article for more information. Note that browsers have different support and defaults for cookie partitioning.New option
--user-data-dirin multiple commands. You can specify the same user data dir to reuse browsing state, like authentication, between sessions.pwsh bin/Debug/netX/playwright.ps1 opendoes not open the test recorder anymore. Usepwsh bin/Debug/netX/playwright.ps1 codegeninstead.Browser Versions
This version was also tested against the following stable channels:
1.53.0
Miscellaneous
New Steps in Trace Viewer:

New method Locator.Describe() to describe a locator. Used for trace viewer.
pwsh bin/Debug/netX/playwright.ps1 install --listwill now list all installed browsers, versions and locations.Browser Versions
This version was also tested against the following stable channels:
1.52.0
Highlights
New method Expect(locator).ToContainClassAsync() to ergonomically assert individual class names on the element.
Aria Snapshots got two new properties:
/childrenfor strict matching and/urlfor links.Miscellaneous
MaxRedirectsin apiRequest.NewContextAsync() to control the maximum number of redirects.Refin locator.AriaSnapshotAsync() to generate reference for each element in the snapshot which can later be used to locate the element.Breaking Changes
Cookieheader anymore. If aCookieheader is provided, it will be ignored, and the cookie will be loaded from the browser's cookie store. To set custom cookies, use browserContext.AddCookiesAsync().Browser Versions
This version was also tested against the following stable channels:
1.51.0
Highlights
New option
IndexedDBfor BrowserContext.StorageStateAsync() allows to save and restore IndexedDB contents. Useful when your application uses IndexedDB API to store authentication tokens, like Firebase Authentication.Here is an example following the authentication guide:
New option
Visiblefor locator.filter() allows matching only visible elements.New option
Contrastfor methods page.emulateMedia() and Browser.NewContextAsync() allows to emulate theprefers-contrastmedia feature.New option
FailOnStatusCodemakes all fetch requests made through the APIRequestContext throw on response codes other than 2xx and 3xx.Browser Versions
This version was also tested against the following stable channels:
1.50.0
Support for Xunit
Miscellaneous
UI updates
canvascontent in traces is error-prone. Display is now disabled by default, and can be enabled via theDisplay canvas contentUI setting.CallandNetworkpanels now display additional time information.Breaking
<input>,<select>, or a number of other editable elements.Browser Versions
This version was also tested against the following stable channels:
Commits viewable in compare view.
Updated Radzen.Blazor from 11.1.3 to 11.1.5.
Release notes
Sourced from Radzen.Blazor's releases.
11.1.5
11.1.5 - 2026-07-15
Improvements
TitleFormatandTitleFormatterparameters on the scheduler views give full control over each view's title: a format string, or a formatter function for complete customization.Fixes
OnAfterRenderAsyncinterop completes), avoiding "Cannot create a JSObjectReference from the value 'null'".11.1.4
11.1.4 - 2026-07-13
Improvements
MaxGroupsandOthersLabelproperties onRadzenPivotRowandRadzenPivotColumnlimit the number of row or column groups displayed at each level. The most significant groups (ranked by the sorted aggregate or the first aggregate) are kept and the remaining items are combined into a single localizable "Others" group. Fixes #2470.HandleLabelFormatterproperty accepts a formatter function (receiving aDateTimefor date ranges or adoublefor numeric ranges) for full control over the handle labels, taking precedence overHandleLabelFormatString. Fixes #2617.IsLoadingandLoadingTemplateare now available on DropDown and ListBox, and DropDownDataGrid forwards itsLoadingTemplateto the inner DataGrid. Thanks to @artnim!Fixes
Commits viewable in compare view.
Updated WolverineFx.Marten from 6.17.1 to 6.19.0.
Release notes
Sourced from WolverineFx.Marten's releases.
6.19.0
CosmosDB
CosmosDbConfiguration.PartitionSagasById(): opt-in, saga id becomes the document partition key (GH-3415) @mysticmindCosmosClientwhose serializer would drop a saga'sidat host start; document the camelCase requirement (GH-3416) @mysticmindHTTP / OpenAPI
uuidinstead of falling back tostring(GH-3420) @mysticmindDurability / persistence
IWolverineObserver.ConnectionBudget(GH-3397) @jeremydmillerTest infrastructure only
IntegrationContextfrom disposing a class fixture it doesn't own; pinApplicationAssemblyin the CoreTests harness (GH-3423) @jeremydmillerusing_dynamic_multi_tenancyfrom poisoning its own next run @mysticmindMilestone: https://github.com/JasperFx/wolverine/issues?q=is%3Aissue%20state%3Aclosed%20milestone%3A6.19.0
Full Changelog: JasperFx/wolverine@V6.18.0...V6.19.0
6.18.0
Wolverine 6.18.0
A security-relevant serialization fix, a startup-fatal codegen fix, a silently-dead-listener fix in RabbitMQ, the first F# saga codegen support of any persistence provider, and the CI split that makes "merge when green" mean something again.
If you use MassTransit interop over a durable listener, take this release. See the first section.
#3408 — fixed in #3411
EnvelopeSerializerwrote the typed envelope properties to the wire format and then appended everyEnvelope.Headersentry verbatim, with no reserved-key filter — and the appended entries came last. Because the reader parses reserved keys straight back into typed properties, aHeadersentry under a reserved key silently overwrote the real property on the next read.A value in
envelope.Headers["tenant-id"]is inert while the envelope is in memory. It stops being inert the moment the envelope crosses the serializer — any durable listener, the inbox/outbox, or the scheduled-message store:tenant-idintoenvelope.Headers.env.TenantIdis set from it.saga-idreaches another saga's state, andidrewritesEnvelope.Id— the inbox's dedupe identity.This was live, not theoretical.
MassTransitEnvelope.TransferDataalready copies every incoming MassTransit header intoenvelope.Headersunfiltered (and by assignment, notTryAdd). Any Wolverine app doing MassTransit interop over a durable listener has had this path open. If that describes you, this release is the one to take.The fix filters reserved keys on the write side, so the typed property stays authoritative and a reserved key sitting in
Headersbecomes a no-op.causation-idis deliberately not filtered —DeliveryOptionsintentionally carries it as a loose header forWolverine.Marten'sOutboxedSessionFactory, and it is never promoted by the reader.Startup-fatal codegen fix
#3399 — fixed in #3406 — invalid generated class name for batched (array) message types. This one prevents the application from starting.
Fixes
DaemonMode.Solo/HotColddaemon alongside managed distribution is now an actionable startup exception instead of two schedulers quietly fighting over the same shards.IAgentRuntime.ApplyRestrictionsAsyncpersisted the restriction and then never dispatched the commands it computed, so pausing an agent had no immediate effect. Reported by @erdtsieck against a live cluster.Internalstatus. It now returns an actionable diagnostic telling you to put the saga identity on the request DTO.[AsParameters]now rejects unparseable values in collection query parameters, closing the gap left by the scalar fix in #3372.IEventStorebridge registered twice, soGetServices<IEventStore>()returned the same store instance two times and anything iterating it double-counted. Polecat's ownAddPolecat()had started registeringIEventStoreand Wolverine was still bridging it as well.State = Connected— a silently dead listener. The listener now defers toReconnectedAsync(), which re-declares and re-consumes. Also pins theConnectionMonitortracking invariant that #3370 fixed but nothing guarded.OpenAPI
#3380 (#3418) — OpenAPI parameters are now derived from the full binding chain rather than the handler signature alone. Two real defects closed:
After/Finallypostprocessor were omitted from the operation entirely.string) whenever the description was assembled before those frames resolved — which is exactly the build-time OpenAPI /openapiCLI path, because ASP.NET caches the first ApiExplorer read.More importantly, this ships the OpenAPI shape-test harness that was missing. Adding a shape assertion is now one endpoint plus one
[Fact], which is why this class of omission kept shipping unnoticed.New: Azure Service Bus emulator support
#3366 (#3409) — the docs told you to call
UseAzureServiceBusTesting(), which only ever existed in Wolverine's own test suite. It is now a real, shipping API:... (truncated)
6.17.3
Bug-fix and scale release, following the 6.17.2 community sweep. Every item below came from a community report or a review finding — thank you all.
Closed issues
PeriodicTimer, so at high database counts the metrics polling itself became significant connection pressure. Agents now register their store with a node-wide sequential sweeper that walks the node's databases one at a time across theUpdateMetricsPeriodwindow — at most one metrics connection in flight per node, regardless of database count. The registration set is re-read every pass, so databases join and leave the sweep as agents start and stop without a restart.Disconnectedstate that #3187 fixed. Two follow-ups are tracked in #3391.TrackedSessionwould pick up and then sit waiting on messages the test never sent. The default ignore rule now covers all ofINotToBeRouted(agent commands and framework telemetry), with a deliberate carve-out forAcknowledgement/FailureAcknowledgement, which the session's own acknowledgement APIs depend on. If you are on an older version,IgnoreMessagesMatchingType(t => t.CanBeCastTo<INotToBeRouted>())is the workaround.Fixes from review
UpdateMetricsPeriod = TimeSpan.Zerowould hot-spin the sweep loop (the pre-#3384PeriodicTimerthrew); it is now rejected at configuration time, withDurabilityMetricsEnabled = falseas the way to turn polling off.Marten test-helper:
PauseThenCatchUpOnMartenDaemonActivity#3388 — cold first catch-up appeared to stall (PR #3394, reported by @uniquelau). Investigated in depth. The reported mechanism — that
coordinator.ResumeAsync()does not start never-started shards — does not hold: under Wolverine-managed distribution the coordinator isWolverineProjectionCoordinator, whoseResumeAsyncbuilds the daemon lazily and starts every shard, bypassing agent assignment entirely. The cold path works, and there are now four tests proving it (including with a second subscription-agent consumer sharing the agent family).The real defect was a timeout mismatch, and it explains the reported symptom exactly. The stage runs inside a child
TrackedSessionwhose token cancels atTrackedSession.Timeout— 5 seconds by default — while the catch-up ignored that token and waited on an internal 60-second budget. The session gave up first and left the catch-up envelope started-but-never-finished, which reads as a hang. This is a genuine 6.16 → 6.17 behavior change: the old activeForceAllfinished inside 5 seconds; resume-and-wait on a cold daemon or a busy machine does not. The catch-up now honors the session's token and raises an actionableTimeoutExceptionnaming the store and pointing atTrackActivity().Timeout(...).If you hit this on 6.17.0–6.17.2, raising the tracked-session timeout is the fix.
Docs
IMessageBus.InvokeAsync<T>and the chain that runs is the handler's. The header-identified gap is tracked as #3385, with a clear diagnostic planned.Timeout()bounds the whole session including its stages, so a slow stage likePauseThenCatchUpOnMartenDaemonActivity()is capped by the session's 5-second default, not by any budget internal to the stage.Full changelog: JasperFx/wolverine@V6.17.2...V6.17.3
6.17.2
Community-issue sweep release. Every fix below shipped same-day from issues filed by the community — thank you all.
Closed issues
WolverineApiDescriptionProvidernow enumerates theHttpGraph(complete whenMapWolverineEndpoints()returns) instead of the start-timeEndpointDataSource, so ASP.NET's version-keyed cache can never freeze an empty first read. If you monitor Wolverine hosts with CritterWatch and expose OpenAPI, upgrade to this release (see JasperFx/CritterWatch#689).[AsParameters]+ compound-handlerLoadAsyncbinding the same route variable generated uncompilable code (CS0136/CS0841, host failed at startup) (PR #3381). Binding frames are now emitted once per chain and re-homed so any second consumer reuses them; both the[FromRoute]and[AsParameters]-parameter variants are covered. The related OpenAPI gap (route params bound only byLoadAsyncmissing from the operation) is tracked as #3380.[AsParameters]query binder silently ignored unparseable values (PR #3379). New opt-inWolverineHttpOptions.RejectUnparseableQueryValues: a present-but-unparseable query value short-circuits with a 400 ProblemDetails naming the parameter, matching ASP.NET minimal APIs; missing values keep their initializer in both modes. The default flips to strict in Wolverine 7.0.IMessageContext, plus a fullITenantDetectionPolicies-style mirror (opts.TenantId.IsRequestHeaderValue(...),IsClaimTypeNamed(...),DetectWith<T>()) that sets the codegen tenant variable Marten/Polecat session frames consume — with a zero-config default when the client stampstenant-id. New docs page: gRPC multi-tenancy.DurabilityMetricsEnabled = falseand raisingUpdateMetricsPeriodas mitigations for metrics-polling connection load at high tenant-database counts (PR #3378). The per-node sweeper implementation is in progress on the issue.Dependency bumps
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