Repository navigation
Bump the backend-dependencies group with 9 updates - #19
dependabot[bot] wants to merge 2 commits into
Conversation
Bumps FluentValidation from 12.1.1 to 12.2.0 Bumps FluentValidation.DependencyInjectionExtensions from 12.1.1 to 12.2.0 Bumps Marten from 9.47.0 to 9.50.2 Bumps Microsoft.AspNetCore.Authentication.JwtBearer from 11.0.0-rc.1.26425.128 to 11.0.0-rc.2.26504.105 Bumps Microsoft.AspNetCore.OpenApi from 11.0.0-rc.1.26425.128 to 11.0.0-rc.2.26504.105 Bumps Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0 Bumps WolverineFx from 6.48.2 to 6.50.2 Bumps WolverineFx.RuntimeCompilation from 6.48.2 to 6.50.2 Bumps xunit.runner.visualstudio from 4.0.0 to 4.0.1 --- updated-dependencies: - dependency-name: FluentValidation dependency-version: 12.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: FluentValidation.DependencyInjectionExtensions dependency-version: 12.2.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: Marten dependency-version: 9.50.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer dependency-version: 11.0.0-rc.2.26504.105 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: backend-dependencies - dependency-name: Microsoft.AspNetCore.OpenApi dependency-version: 11.0.0-rc.2.26504.105 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: backend-dependencies - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: WolverineFx dependency-version: 6.50.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: WolverineFx.RuntimeCompilation dependency-version: 6.50.2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: backend-dependencies - dependency-name: xunit.runner.visualstudio dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: backend-dependencies ... Signed-off-by: dependabot[bot] <support@github.com>
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…dencies-38475361a2
|
|
This pull request was built based on a group rule. Closing it will not ignore any of these versions in future pull requests. To ignore these dependencies, configure ignore rules in dependabot.yml |



Rebasing might not happen immediately, so don't worry if this takes some time.
Note: if you make any changes to this PR yourself, they will take precedence over the rebase.
Updated FluentValidation from 12.1.1 to 12.2.0.
Release notes
Sourced from FluentValidation's releases.
12.2.0
Release notes
Please read the upgrade guide if you are moving from 11.x to 12.x
Changes in 12.2.0
Changes in 12.1.0
Changes in 12.0.0
Downloads
Binaries can be downloaded from nuget:
Commits viewable in compare view.
Updated FluentValidation.DependencyInjectionExtensions from 12.1.1 to 12.2.0.
Release notes
Sourced from FluentValidation.DependencyInjectionExtensions's releases.
12.2.0
Release notes
Please read the upgrade guide if you are moving from 11.x to 12.x
Changes in 12.2.0
Changes in 12.1.0
Changes in 12.0.0
Downloads
Binaries can be downloaded from nuget:
Commits viewable in compare view.
Updated Marten from 9.47.0 to 9.50.2.
Release notes
Sourced from Marten's releases.
9.50.2
A maintenance release. Nothing in a shipped Marten package changed, and nothing here requires a configuration or code change.
Dependencies
System.Security.Cryptography.Pkcs). Npgsql doesn't bring that package in. Every finding was in the Nuke build tool or the samples:System.Security.Cryptography.Pkcs,System.Security.Cryptography.XmlandNuGet.Packaging.EventPublishersample and the Aspire sample moved from 1.8.x to 1.19.x.The same advisory does reach Polecat and Weasel's SQL Server and Oracle packages, through their database drivers. Those are fixed in Polecat 5.40.2 and Weasel 9.45.1.
9.50.1
A patch release with one addition, for Wolverine's agent assignment. Nothing here requires a configuration or code change.
Event store
IEventStore.TryDescribeDatabasesAsync()is answered straight from the tenancy (#5664). JasperFx 2.87.1 adds this narrower call, the database half ofTryCreateUsage(). It returns each database's server, name and tenant ids without reading the highest event sequence or describing every projection, subscription, event type and tag type. Wolverine 6.50.0 asks for it on every leader heartbeat, for every store, where it used to build the full usage (JasperFx/wolverine#5002). It follows on from #5652, so thanks again to @uniquelau for a report that came with the heartbeat maths already done.Dependencies
9.50.0
A bug-fix release. Nothing here requires a configuration or code change, but three things change what an application observes — read the box below before upgrading.
LINQ —
Include()joined on the queried document's own idThree separate defects in the same corner, found by pulling on the first one. An
Include()joined on the queried document's own id builds a temp table, and that temp table was missing the id it is joined on.42703: column d.id does not existin a query session when the queried document had any duplicated field. Lightweight, identity-map and dirty-tracked sessions were unaffected. Thanks to @Blackclaws for the report and the fix (#5651).42703, in a query session, when the query also calledStats(). Unlike #5650 this did not depend on a duplicated field;Stats()wraps the select clause, which hid it from the check that puts the id back.Stats()with anInclude()and aSelect()projection reportedTotalResultsas the size of the page rather than the number of matches, wheneverTake()was used. No exception, just a wrong number, on every session kind. The temp table already held the correct count — PostgreSQL evaluates a window function beforeLIMIT— but re-applying the projection emitted a secondcount(*) over()against the already-truncated temp table.If you page a projected grid with
Stats()andInclude(), #5654 is the one to read.Event store
ERRORfor every attempt; underUseWolverineManagedEventSubscriptionDistributionthe leader does this for every store on a ten-second heartbeat, which is tens of thousands of server-sideERRORlines a day for a store that can never hold an event. Marten now asks the catalog first, so nothing reaches the server log. Thanks to @uniquelau for a report that came with the heartbeat maths already done.IEventStore.FindDatabaseForTenantAsync, so a caller waiting on or querying a single tenant touches only that tenant's database instead of all of them. Goes throughITenancy.TryFindDatabase, neverFindOrCreateDatabase, so a lookup cannot bring an unknown tenant into existence.Native AOT
#5649 (partial) — a DCB
[BoundaryAggregate]fetch failed natively withMissingMethodException, becauseEventGraph.Build<TDoc>()closedSingleStreamProjection<,>at runtime even though both type arguments were known at compile time. And tag-type auto-discovery swallowed the AOT failure in the same breath as a benign one, leaving a store running with the tag type quietly absent; it now says so. Verified by publishing and running the native binary, not by a clean publish.Still open:
RegisterTagType<TTag>()closes its own open generic and remains broken under Native AOT. That needs a reflection-free construction path in JasperFx.Events plus a new overload — see the discussion on #5649. Thanks to @skoging for an unusually thorough report, with native runs and three costed alternatives.Dependencies
db-patchdrop files no longer drop every schema withCASCADE; they roll back only what the patch touched (weasel#706). This changes what an existing drop file does. Primary keys can also now be added to and removed from existing tables (weasel#707).Known issue
Stats()withInclude()and aSelect()projection is fixed here, but note that theInclude()itself still follows the page, not the match set — it reads from the same truncated temp table. Only the statistics column outlives theTake(). That is existing, intended behaviour; it is called out because #5654 makes the distinction visible for the first time.9.49.0
The LINQ projection surface works under Native AOT
The theme of this release. #5624 came in as "a projection into an anonymous type cannot be
materialized under Native AOT". Publishing
Marten.AotRuntimeSmokenatively and running it showedsomething much wider: every
Select()projection into a new object failed from a native binary,a named DTO exactly as hard as an anonymous one, and it failed before the serializer was ever
reached.
A projection is parsed out of an expression tree, so the parser only has
selectExpression.Typeandclosed its select clause over that
TypewithMakeGenericType+Activator.CreateInstance— thedefect class of #5328, one step later in the pipeline. Only a bare
stringscalar survived, becauseits clause happens not to be generic, which is what made the surface look healthy.
Shapes that threw from a native binary before this release and run now:
Select(x => new Summary { ... })— a named DTOSelect(x => x.Lines)— a collection member, and the element type of aSelectMany(x => x.Lines)Select(x => x.Amount)for every framework scalar type,decimal?and the other nullable ones includedSelect(x => x.Status)andMaxAsync(x => x.Status)for an enum of your own — see the one line belowGroupBy(...).Select(g => new Tally { ... })The fix is
SelectClauseResolvers, which does for projected types what #5328'sDocumentStorageResolversdoes for document types: a registry populated fromMartenLinqQueryable<T>'s constructor, which every projected type reaches becauseQueryable.Select<TSource, TResult>()asks the provider forCreateQuery<TResult>(). The reflectivepath remains the fallback wherever a JIT is available, so nothing changes for JIT-mode apps.
One line for an enum or struct of your own
Marten's scalar select clause is declared
where T : structand the registration point aboveconstrains its own
Ttonotnull, so Marten can root the scalar types it renders itself —decimal,Guid,DateOnlyand the rest need nothing — but not one out of your assembly:Only bare scalar projections need it. Projecting the same enum as a member of a named type, and
filtering on it, never did. When the registration is missing, the failure now names that exact call
instead of reporting a missing parameterless constructor on an internal generic.
An anonymous projection is refused with the remedy
With a source-generated
JsonSerializerContextassigned to... (truncated)
9.48.0
Document diagnostics: filter and order by document properties (jasperfx#869, #5631)
IDocumentStoreDiagnostics.QueryDocumentsAsyncnow appliesDocumentQueryOptions.Where/OrderBy/Argumentsinstead of refusing them. The text goes ontoQuery<T>()through JasperFx 2.84.0's Dynamic LINQ helper, so member casing, enum storage, duplicated fields, conjoined tenancy, soft deletes and hierarchies are Marten's own; only the SELECT list is swapped for the diagnostics read's columns, so the JSON comes back byte-exact with its metadata, and the total counts the filtered rows. Operator text is never spliced into SQL, and the read issues no DDL.Measured against a LINQ-to-objects oracle over 83 shapes and three storage configurations; every shape is either right or refused:
<>/ a negated comparison on a nullable member unless the text says what null should do (JasperFx'sSqlNullSemantics). Date-part members and inlinein (…)lists are refused honestly by the provider.DateTimearguments compare correctly againsttimestamp without time zonelocators.Fixes
Count/LongCountpredicates through the Where parser, with null semantics and bound parameters (#5625).StartStreamthat loses a race for the same stream id now throwsExistingStreamIdCollisionExceptioninstead of a raw 23505, soQuickWithServerTimestampsbehaves like Rich and Quick (#5628).Dependencies
JasperFx 2.84.0
Commits viewable in compare view.
Updated Microsoft.AspNetCore.Authentication.JwtBearer from 11.0.0-rc.1.26425.128 to 11.0.0-rc.2.26504.105.
Release notes
Sourced from Microsoft.AspNetCore.Authentication.JwtBearer's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.AspNetCore.OpenApi from 11.0.0-rc.1.26425.128 to 11.0.0-rc.2.26504.105.
Release notes
Sourced from Microsoft.AspNetCore.OpenApi's releases.
No release notes found for this version range.
Commits viewable in compare view.
Updated Microsoft.NET.Test.Sdk from 18.10.1 to 18.11.0.
Release notes
Sourced from Microsoft.NET.Test.Sdk's releases.
18.11.0
What's Changed
New Contributors
Full Changelog: microsoft/vstest@v18.10.1...v18.11.0
Commits viewable in compare view.
Updated WolverineFx from 6.48.2 to 6.50.2.
Release notes
Sourced from WolverineFx's releases.
6.50.2
A dependency patch release. No configuration or code changes needed.
Dependencies
This moves Wolverine onto the Critter Stack releases that fix CVE-2026-84008 / GHSA-846f-f764-76mx (
System.Security.Cryptography.Pkcs, high-severity denial of service) (#5018):Weasel.SqlServerandWeasel.Oraclenow reference the patched Pkcs directly.Polecatnow references the patched Pkcs directly. This also brings in Polecat 5.39 and 5.40.Marten,Marten.AspNetCoreandMarten.Newtonsoft. Marten was never affected by the advisory.Wolverine 6.50.1 already pinned the patched Pkcs in
WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServer, so applications on 6.50.1 were already protected. Those pins stay, because Wolverine referencesMicrosoft.Data.SqlClientandOracle.ManagedDataAccess.Coredirectly. 6.50.2 means the upstream libraries carry the fix too, so a NuGet audit comes back clean whichever of them your application references directly.6.50.1
Patch release with a memory-leak fix and two security dependency updates.
Fixes
WolverineRuntimenow disposes itsMeter(#5012, #5013). The runtime'sSystem.Diagnostics.Metrics.Meterused to stay in the process-wide staticMeterregistry after the host was disposed. The durable persistence gauges on it hold callbacks back into the runtime, so every disposed host stayed reachable for the life of the process. Test suites that build manyWebApplicationFactoryorHostinstances with durable persistence saw the heap grow without bound. Thanks to @AndriiKononenko3 for the detailed report and the retention path.Security dependency updates
System.Security.Cryptography.Pkcs, high-severity denial of service). The package arrived transitively at vulnerable versions throughMicrosoft.Data.SqlClient,Oracle.ManagedDataAccess.Coreand Polecat.WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServernow reference the patched version directly: 9.0.21 on net9.0 and 10.0.13 on net10.0. Every package built on them, includingWolverineFx.PolecatandWolverineFx.Http.Polecat, picks up the fix.Microsoft.AspNetCore.SignalR.Common, high-severity denial of service).WolverineFx.SignalRnow depends onMicrosoft.AspNetCore.SignalR.Client9.0.21 on net9.0 and 10.0.13 on net10.0, up from 9.0.8.6.50.0
Wolverine 6.50.0 is a feature release. The headline is a new way to send a message to every node in your cluster. Just as much of this release came from the community, though: five community pull requests landed, and several issue reports led straight to fixes.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.50.0-alpha.1and are still pre-release.Broadcast a message to every node in the cluster
BroadcastToAllNodesAsync()(#4993, closes #4988). Wolverine's normal delivery is competing consumers, where exactly one node handles a message. Sometimes you want every node to hear about something instead: a cache to invalidate, a configuration change to pick up, some node-local state to reset. Now you can just do this:Every running node, including the one that sent it, handles the message exactly once with its own handler. The sending node gets the message on the local routes its type already has, or on
local://default, and it's never forwarded to the external routesPublishAsync()would use. Every other node gets a copy on its node control endpoint, which is the broker control queue if you've configured one and the database control queue otherwise. Nodes that have gone stale are skipped, using the same rule the leader applies before ejecting a node. A broadcast from inside a handler goes through the outbox like any other outgoing message, and correlation ids are stamped as usual. InSoloandServerlessdurability modes the message is delivered to this node only, andMediatorOnlyrefuses it just likePublishAsync(). It's an extension method onIMessageBus, so no otherIMessageBusimplementation breaks, andTestMessageContextrecords broadcasts in a newBroadcastToAllNodeslist for your unit tests. See the new Broadcast Messages to Every Node guide.From the community
A big thank you to everyone who sent pull requests and reports for this release:
@jcd1991 contributed two PostgreSQL transport features:
LISTEN/NOTIFYwakeups for PostgreSQL queues (#4998, closes #3480). WithEnableQueueNotifications(), an idle queue listener is woken as soon as a message is written instead of waiting out its polling interval. In local benchmarks the median delivery time on an idle queue dropped from about 650ms to under 3ms. It's off by default because it holds one extra, long-lived database connection per database per running process. Read the trade-offs in the new Queue Notifications with LISTEN/NOTIFY section before you turn it on.EnableDeterministicQueueOrdering()now preserves their order, and it was followed up for SQL Server, MySQL, Oracle and SQLite in #4987.@jcd1991 also fixed Wolverine.HTTP treating a container-registered service as the JSON request body on POST and PUT endpoints (#5010, closes #3863, reported by @erdtsieck). The same parameter on a GET endpoint was correctly injected, but on a POST or PUT every call failed with a 500. An explicitly registered, non-keyed concrete type is now resolved from the container on every endpoint. This is a behavior change: if you register a type in the container and post it as a request body without
[FromBody], add[FromBody]to keep binding it from the request.@erdtsieck found and fixed a ping-pong in agent assignment during blue/green warm-ups (#5000, closes #4999). Projection partitions that could only run on the previous version's nodes moved between those nodes on every evaluation, which showed up in production as 1,000 to 3,000
ReassignAgentcommands a minute. A partition that fits nowhere now stays where it is unless another node is strictly lighter. The follow-up in #5001 makes it settle in one move.@PascalEschbach contributed a big round of NATS follow-ups (#4976, closes #4973), with tests for every change:
resources setupprovisioning declared streams once per connection;TrustTenantIdHeadersetting;ILoggerFactory;#4985 followed up on the core side.
@Maflend reported that the static handler registry ignored custom discovery rules once conventional discovery was disabled (#4984), a regression since 6.44.0. It's fixed in #4992.
@uniquelau's report in marten#5652 led to #5011, below: the leader no longer builds every event store's full usage descriptor on every heartbeat.
Agents and event subscriptions
IEventStore.RegisteredShardNames()and the newIEventStore.TryDescribeDatabasesAsync(), instead of a fullTryCreateUsage()that also read the highest event sequence and described every projection, subscription and event type, for every store, every 10 seconds. To get the full saving, also take Marten 9.50.1, Polecat 5.40.1 or Fisher 1.20.2, which answerTryDescribeDatabasesAsync()straight from their tenancy.IProjectionDaemon.IsRebuilding(), so it can no longer start a second copy of the shard on top of a running rebuild.Transports and persistence
OptimizeQueueThroughput()(#4991, closes #4989).EnableDeterministicQueueOrdering()for SQL Server, MySQL, Oracle and SQLite (#4987).HTTP
Valuestrong-typed id wrappers, such asrecord struct OrderId(Guid Value), without aTryParse(#4995, closes #4978).... (truncated)
6.49.0
Wolverine 6.49.0 is a feature release. The big themes are optimized envelope ids for SQL Server, additive per-message topic routing across NATS, RabbitMQ and MQTT, a long list of NATS hardening, and a big round of Event Modeling and Bobcat work. Thank you to @knotekbr, @me-azlam-kp, @faustodc, @luisarellano09 and @alesdvorakcz, whose reports, tests and pull requests are all over this one.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.49.0-alpha.3and are still pre-release.SQL Server
uniqueidentifierstarting from its last six bytes, so to SQL Server those ids arrive in random order and fragment the clustered inbox, outbox and dead letter tables. One production inbox was measured at 99% fragmented with its pages half full. The newEnvelopeIdGeneration.NewIdSqlServerOrderuses the same NewId algorithm with the timestamp where SQL Server sorts on it. Wolverine now switches to it on its own at startup when every message store in the application is SQL Server -- plain SQL Server persistence, the SQL Server transport, EF Core on SQL Server, or Polecat -- and you haven't setEnvelopeIdGenerationyourself. There's no schema change. If a SQL Server-only application sends messages to Wolverine services that store their envelopes in PostgreSQL, opt out, because the receiving service uses the same id as its inbox key and PostgreSQL indexes these ids worse than random GUIDs. Either setopts.EnvelopeIdGeneration = EnvelopeIdGeneration.NewIdor use the newoptimizeEnvelopeIdsForSqlServer: falseoverloads ofPersistMessagesWithSqlServer(),UseSqlServerPersistenceAndTransport()and Polecat'sIntegrateWithWolverine(). Behind it,IMessageStoregains aPreferredEnvelopeIdGenerationmember with a default implementation, so existing stores are unaffected.Routing
PublishMessagesToNatsSubject<T>(),PublishMessagesToRabbitMqExchange<T>()orPublishMessagesToMqttTopic<T>()-- used to silently switch off an explicitPublishMessage<T>().ToLocalQueue()rule, local routing to a handler, and broker conventions for the same message type. Each of those now has an overload that takesadditive: true, so the other routing rules still apply. The original overloads are unchanged. A customIMessageRouteSourcecan opt into the same behavior through the newIPassThroughMessageRouteSource, andExplainRoutingFor()labels such a source[additive, pass-through].MultipleHandlerBehavior.Separatedfor conventional routing on Amazon SQS, Azure Service Bus queues and GCP Pub/Sub (#4948, #4949, #4951, closing #4524, #4525 and #4526). Each handler type gets its own queue or subscription, on top of a small new hook for routing conventions.NATS
DiscardPolicy.New, a failedNats-Expected-*check, an oversized message -- used to be retried three times, logged as errors, and dropped, whileSendAsync()returned as if it worked. Now it isn't retried, andSendAsync()throws the newSendRejectedExceptionwith the JetStream error inside. Other transports can throwSendRejectedExceptionfrom their senders to get the same treatment.DefineStream()used to be created as a default work-queue stream, which then showed up as drift underProvisioning(Verify).ConfigureJetStreamPublish.HTTP
[RequestSizeLimit], for example, now answers 413 instead of a 500 saying the body could not be deserialized.Persistence and durability
PartitionPerTenantfor a table that already exists, and EF Core, Marten and Polecat conjoined tenancy are tested together in one database. Along the way, this fixed a saga saved with a temporary EF Core key landing under a tenant id that was a random GUID.MessageIdentity.IdAndDestination(#4969, closes #4216). Running the shared message store tests under that identity found that it put slashes into Cosmos document ids, which Cosmos does not allow, so every update quietly missed its document. That's fixed, and CosmosDB and RavenDB both now run the whole contract under that identity.Microsoft.Azure.Cosmos3.63.2 and pinning the emulator image.Agents and leadership
DurabilitySettingshave backward-compatible defaults.Code generation
Event Modeling and Bobcat
wolverine scaffoldfollows Bobcat'sFeatures/{Chapter}layout (#4959), gains--jsonoutput with stable notice codes (#4947, closes #4928), and has a round of output fixes: record views built withCreate, the events that start a stream first, and long attributes on their own line (#4929). Scaffolded HTTP endpoints are tested against Marten, Polecat and Fisher, and a stream start answers 201 with its id (#4947, closes #4927).[Emits]inference, definition discovery,describe-event-model, and new WolverineFx.Bobcat assertions.FetchLatestread models, and DCB and multi-stream scaffolding.ThenEventuallyCausedchecks the events an act caused past an async boundary (#4965, closes #4939). The new WolverineFx.Bobcat step finds them by correlation id once the async daemons catch up, and there's an opt-in correlation header for every HTTP endpoint.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.
Commits viewable in compare view.
Updated WolverineFx.RuntimeCompilation from 6.48.2 to 6.50.2.
Release notes
Sourced from WolverineFx.RuntimeCompilation's releases.
6.50.2
A dependency patch release. No configuration or code changes needed.
Dependencies
This moves Wolverine onto the Critter Stack releases that fix CVE-2026-84008 / GHSA-846f-f764-76mx (
System.Security.Cryptography.Pkcs, high-severity denial of service) (#5018):Weasel.SqlServerandWeasel.Oraclenow reference the patched Pkcs directly.Polecatnow references the patched Pkcs directly. This also brings in Polecat 5.39 and 5.40.Marten,Marten.AspNetCoreandMarten.Newtonsoft. Marten was never affected by the advisory.Wolverine 6.50.1 already pinned the patched Pkcs in
WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServer, so applications on 6.50.1 were already protected. Those pins stay, because Wolverine referencesMicrosoft.Data.SqlClientandOracle.ManagedDataAccess.Coredirectly. 6.50.2 means the upstream libraries carry the fix too, so a NuGet audit comes back clean whichever of them your application references directly.6.50.1
Patch release with a memory-leak fix and two security dependency updates.
Fixes
WolverineRuntimenow disposes itsMeter(#5012, #5013). The runtime'sSystem.Diagnostics.Metrics.Meterused to stay in the process-wide staticMeterregistry after the host was disposed. The durable persistence gauges on it hold callbacks back into the runtime, so every disposed host stayed reachable for the life of the process. Test suites that build manyWebApplicationFactoryorHostinstances with durable persistence saw the heap grow without bound. Thanks to @AndriiKononenko3 for the detailed report and the retention path.Security dependency updates
System.Security.Cryptography.Pkcs, high-severity denial of service). The package arrived transitively at vulnerable versions throughMicrosoft.Data.SqlClient,Oracle.ManagedDataAccess.Coreand Polecat.WolverineFx.SqlServer,WolverineFx.OracleandWolverineFx.ClaimCheck.SqlServernow reference the patched version directly: 9.0.21 on net9.0 and 10.0.13 on net10.0. Every package built on them, includingWolverineFx.PolecatandWolverineFx.Http.Polecat, picks up the fix.Microsoft.AspNetCore.SignalR.Common, high-severity denial of service).WolverineFx.SignalRnow depends onMicrosoft.AspNetCore.SignalR.Client9.0.21 on net9.0 and 10.0.13 on net10.0, up from 9.0.8.6.50.0
Wolverine 6.50.0 is a feature release. The headline is a new way to send a message to every node in your cluster. Just as much of this release came from the community, though: five community pull requests landed, and several issue reports led straight to fixes.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.50.0-alpha.1and are still pre-release.Broadcast a message to every node in the cluster
BroadcastToAllNodesAsync()(#4993, closes #4988). Wolverine's normal delivery is competing consumers, where exactly one node handles a message. Sometimes you want every node to hear about something instead: a cache to invalidate, a configuration change to pick up, some node-local state to reset. Now you can just do this:Every running node, including the one that sent it, handles the message exactly once with its own handler. The sending node gets the message on the local routes its type already has, or on
local://default, and it's never forwarded to the external routesPublishAsync()would use. Every other node gets a copy on its node control endpoint, which is the broker control queue if you've configured one and the database control queue otherwise. Nodes that have gone stale are skipped, using the same rule the leader applies before ejecting a node. A broadcast from inside a handler goes through the outbox like any other outgoing message, and correlation ids are stamped as usual. InSoloandServerlessdurability modes the message is delivered to this node only, andMediatorOnlyrefuses it just likePublishAsync(). It's an extension method onIMessageBus, so no otherIMessageBusimplementation breaks, andTestMessageContextrecords broadcasts in a newBroadcastToAllNodeslist for your unit tests. See the new Broadcast Messages to Every Node guide.From the community
A big thank you to everyone who sent pull requests and reports for this release:
@jcd1991 contributed two PostgreSQL transport features:
LISTEN/NOTIFYwakeups for PostgreSQL queues (#4998, closes #3480). WithEnableQueueNotifications(), an idle queue listener is woken as soon as a message is written instead of waiting out its polling interval. In local benchmarks the median delivery time on an idle queue dropped from about 650ms to under 3ms. It's off by default because it holds one extra, long-lived database connection per database per running process. Read the trade-offs in the new Queue Notifications with LISTEN/NOTIFY section before you turn it on.EnableDeterministicQueueOrdering()now preserves their order, and it was followed up for SQL Server, MySQL, Oracle and SQLite in #4987.@jcd1991 also fixed Wolverine.HTTP treating a container-registered service as the JSON request body on POST and PUT endpoints (#5010, closes #3863, reported by @erdtsieck). The same parameter on a GET endpoint was correctly injected, but on a POST or PUT every call failed with a 500. An explicitly registered, non-keyed concrete type is now resolved from the container on every endpoint. This is a behavior change: if you register a type in the container and post it as a request body without
[FromBody], add[FromBody]to keep binding it from the request.@erdtsieck found and fixed a ping-pong in agent assignment during blue/green warm-ups (#5000, closes #4999). Projection partitions that could only run on the previous version's nodes moved between those nodes on every evaluation, which showed up in production as 1,000 to 3,000
ReassignAgentcommands a minute. A partition that fits nowhere now stays where it is unless another node is strictly lighter. The follow-up in #5001 makes it settle in one move.@PascalEschbach contributed a big round of NATS follow-ups (#4976, closes #4973), with tests for every change:
resources setupprovisioning declared streams once per connection;TrustTenantIdHeadersetting;ILoggerFactory;#4985 followed up on the core side.
@Maflend reported that the static handler registry ignored custom discovery rules once conventional discovery was disabled (#4984), a regression since 6.44.0. It's fixed in #4992.
@uniquelau's report in marten#5652 led to #5011, below: the leader no longer builds every event store's full usage descriptor on every heartbeat.
Agents and event subscriptions
IEventStore.RegisteredShardNames()and the newIEventStore.TryDescribeDatabasesAsync(), instead of a fullTryCreateUsage()that also read the highest event sequence and described every projection, subscription and event type, for every store, every 10 seconds. To get the full saving, also take Marten 9.50.1, Polecat 5.40.1 or Fisher 1.20.2, which answerTryDescribeDatabasesAsync()straight from their tenancy.IProjectionDaemon.IsRebuilding(), so it can no longer start a second copy of the shard on top of a running rebuild.Transports and persistence
OptimizeQueueThroughput()(#4991, closes #4989).EnableDeterministicQueueOrdering()for SQL Server, MySQL, Oracle and SQLite (#4987).HTTP
Valuestrong-typed id wrappers, such asrecord struct OrderId(Guid Value), without aTryParse(#4995, closes #4978).... (truncated)
6.49.0
Wolverine 6.49.0 is a feature release. The big themes are optimized envelope ids for SQL Server, additive per-message topic routing across NATS, RabbitMQ and MQTT, a long list of NATS hardening, and a big round of Event Modeling and Bobcat work. Thank you to @knotekbr, @me-azlam-kp, @faustodc, @luisarellano09 and @alesdvorakcz, whose reports, tests and pull requests are all over this one.
The two Bobcat packages,
WolverineFx.BobcatandWolverineFx.Bobcat.Http, ship as6.49.0-alpha.3and are still pre-release.SQL Server
uniqueidentifierstarting from its last six bytes, so to SQL Server those ids arrive in random order and fragment the clustered inbox, outbox and dead letter tables. One production inbox was measured at 99% fragmented with its pages half full. The newEnvelopeIdGeneration.NewIdSqlServerOrderuses the same NewId algorithm with the timestamp where SQL Server sorts on it. Wolverine now switches to it on its own at startup when every message store in the application is SQL Server -- plain SQL Server persistence, the SQL Server transport, EF Core on SQL Server, or Polecat -- and you haven't setEnvelopeIdGenerationyourself. There's no schema change. If a SQL Server-only application sends messages to Wolverine services that store their envelopes in PostgreSQL, opt out, because the receiving service uses the same id as its inbox key and PostgreSQL indexes these ids worse than random GUIDs. Either setopts.EnvelopeIdGeneration = EnvelopeIdGeneration.NewIdor use the newoptimizeEnvelopeIdsForSqlServer: falseoverloads ofPersistMessagesWithSqlServer(),UseSqlServerPersistenceAndTransport()and Polecat'sIntegrateWithWolverine(). Behind it,IMessageStoregains aPreferredEnvelopeIdGenerationmember with a default implementation, so existing stores are unaffected.Routing
PublishMessagesToNatsSubject<T>(),PublishMessagesToRabbitMqExchange<T>()orPublishMessagesToMqttTopic<T>()-- used to silently switch off an explicitPublishMessage<T>().ToLocalQueue()rule, local routing to a handler, and broker conventions for the same message type. Each of those now has an overload that takesadditive: true, so the other routing rules still apply. The original overloads are unchanged. A customIMessageRouteSourcecan opt into the same behavior through the newIPassThroughMessageRouteSource, andExplainRoutingFor()labels such a source[additive, pass-through].MultipleHandlerBehavior.Separatedfor conventional routing on Amazon SQS, Azure Service Bus queues and GCP Pub/Sub (#4948, #4949, #4951, closing #4524, #4525 and #4526). Each handler type gets its own queue or subscription, on top of a small new hook for routing conventions.NATS
DiscardPolicy.New, a failedNats-Expected-*check, an oversized message -- used to be retried three times, logged as errors, and dropped, whileSendAsync()returned as if it worked. Now it isn't retried, andSendAsync()throws the newSendRejectedExceptionwith the JetStream error inside. Other transports can throwSendRejectedExceptionfrom their senders to get the same treatment.DefineStream()used to be created as a default work-queue stream, which then showed up as drift underProvisioning(Verify).ConfigureJetStreamPublish.HTTP
[RequestSizeLimit], for example, now answers 413 instead of a 500 saying the body could not be deserialized.Persistence and durability
PartitionPerTenantfor a table that already exists, and EF Core, Marten and Polecat conjoined tenancy are tested together in one database. Along the way, this fixed a saga saved with a temporary EF Core key landing under a tenant id that was a random GUID.MessageIdentity.IdAndDestination(#4969, closes #4216). Running the shared message store tests under that identity found that it put slashes into Cosmos document ids, which Cosmos does not allow, so every update quietly missed its document. That's fixed, and CosmosDB and RavenDB both now run the whole contract under that identity.Microsoft.Azure.Cosmos3.63.2 and pinning the emulator image.Agents and leadership
DurabilitySettingshave backward-compatible defaults.Code generation
Event Modeling and Bobcat
wolverine scaffoldfollows Bobcat'sFeatures/{Chapter}layout (#4959), gains--jsonoutput with stable notice codes (#4947, closes #4928), and has a round of output fixes: record views built withCreate, the events that start a stream first, and long attributes on their own line (#4929). Scaffolded HTTP endpoints are tested against Marten, Polecat and Fisher, and a stream start answers 201 with its id (#4947, closes #4927).[Emits]inference, definition discovery,describe-event-model, and new WolverineFx.Bobcat assertions.FetchLatestread models, and DCB and multi-stream scaffolding.ThenEventuallyCausedchecks the events an act caused past an async boundary (#4965, closes #4939). The new WolverineFx.Bobcat step finds them by correlation id once the async daemons catch up, and there's an opt-in correlation header for every HTTP endpoint.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.
Commits viewable in compare view.
Updated xunit.runner.visualstudio from 4.0.0 to 4.0.1.
Release notes
Sourced from xunit.runner.visualstudio's releases.
4.0.1
Release notes: https://xunit.net/releases/visualstudio/4.0.1
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