Bump WolverineFx and 6 others#187
Merged
Merged
Conversation
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
Owner
|
@dependabot rebase |
Bumps WolverineFx from 6.17.3 to 6.21.0 Bumps WolverineFx.EntityFrameworkCore from 6.17.3 to 6.21.0 Bumps WolverineFx.FluentValidation from 6.17.3 to 6.21.0 Bumps WolverineFx.Postgresql from 6.17.3 to 6.21.0 Bumps WolverineFx.RabbitMQ from 6.17.3 to 6.21.0 Bumps WolverineFx.RuntimeCompilation from 6.17.3 to 6.21.0 Bumps WolverineFx.SqlServer from 6.17.3 to 6.21.0 --- updated-dependencies: - dependency-name: WolverineFx dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.EntityFrameworkCore dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.FluentValidation dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.Postgresql dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.RabbitMQ dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.RuntimeCompilation dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine - dependency-name: WolverineFx.SqlServer dependency-version: 6.21.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: wolverine ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/nuget/wolverine-59db9e4210
branch
from
July 20, 2026 03:54
6b5d713 to
848bc56
Compare
emeraldleaf
approved these changes
Jul 20, 2026
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.
Pinned WolverineFx at 6.21.0.
Release notes
Sourced from WolverineFx's releases.
6.21.0
Wolverine 6.21.0 is a big one: conjoined multi-tenancy for EF Core, and a measured messaging-performance wave across Kafka and RabbitMQ.
Conjoined multi-tenancy for EF Core (#3465)
Mark an EF Core entity with
ITenanted(the marker shared critter-stack-wide fromJasperFx.MultiTenancy) and register yourDbContextwithAddDbContextWithWolverineManagedConjoinedTenancy<T>(), and Wolverine gives you what Marten users have had for years: a mappedtenant_idcolumn, a tenant-bound global query filter you can't forget, stamp-on-insert,CrossTenantWriteExceptionon cross-tenant writes, conjoined sagas, opt-in Weasel-managed physical tenant partitioning (PostgreSQL list partitions + SQL Server tenant-ordinal), and an authoritativewolverine_tenantsregistry that doubles as a dynamic tenant source and feeds CritterWatch tenant management. The behavior is checked against a port of Marten's conjoined-tenancy compliance battery. See the newConjoinedMultiTenantedEfCoresample app and docs.Messaging performance (GH-3490 / GH-3492)
A client-reported "Wolverine-over-Kafka is 3-12x slower than native" investigation turned into a measured optimization wave (methodology, rigs, and full ledgers are in the repo):
(100, 250ms)settings measured 5.8 seconds publish-to-consume p50; it now measures 136ms, bounded by the timeout. Affects every transport that sends through the batched sender (RabbitMQ routes were unaffected — they don't).MaximumMessagesToReceivelistener knob on both (default 100;1restores strict message-at-a-time persistence).Envelope[]arrival path now applies the same per-envelope guards as single-message arrival (interop serializer unwrap, dead-lettering of unidentifiable messages, expiry, drain latching), and batched inbox writes route to ancillary message stores correctly.SendMessageBatchper-entry failures (throttling, oversize) are now routed to Wolverine's retry machinery instead of being silently dropped — a silent message-loss fix (GH-3493).BufferedInMemory()/ListenerCount()with measured numbers, and a matching page exists for Kafka.Behavior changes to note
Debug(wasInformation) — restore withopts.Policies.MessageSuccessLogLevel(LogLevel.Information).wolverine-execution-timeis now a floating-point histogram and no longer silently drops sub-millisecond executions (same name/unit; the point type changes).Transports and messaging
PrefetchCounton listeners and transport defaults (GH-3471)DelaySecondsfor short scheduled sends on standard queues (GH-3472)DeliverAt(GH-3470)HTTP / gRPC
IAsyncEnumerable<TRequest> -> Task<TResponse>handler shape (#3500)StreamAsync<TRequest, TResponse>overload (#3459)Dependencies
JasperFx 2.30.1 (sender-batching max-age fix), Weasel 9.18.1, Marten 9.16.1.
6.20.0
Wolverine 6.20.0
Dependency upgrades (critter stack)
Multi-tenancy & connection footprint
nodes × databases. Plus daemon tracker-subscription leak hygiene.IntegrateWithWolverine()now honors a database-per-tenant Polecat store and readsMainDatabaseConnectionString.DatabaseDescriptor.Portinstead of re-parsing (jasperfx#514).CritterWatch / connection state
Kafka
SentAtand expose record headers on raw-JSON listeners (GH-3407).JsonSerializerOptionson raw-JSON endpoints now actually applies;PublishRawJsonmapper registration fixed.Sagas
SagaConcurrencyExceptionnow inheritsJasperFx.ConcurrencyException(GH-3444) — existingOnException<ConcurrencyException>()policies now catch saga concurrency failures.Other
TrackedSessionnot-tracked vs not-routed fix (#3435).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)
Commits viewable in compare view.
Pinned WolverineFx.EntityFrameworkCore at 6.21.0.
Release notes
Sourced from WolverineFx.EntityFrameworkCore's releases.
6.21.0
Wolverine 6.21.0 is a big one: conjoined multi-tenancy for EF Core, and a measured messaging-performance wave across Kafka and RabbitMQ.
Conjoined multi-tenancy for EF Core (#3465)
Mark an EF Core entity with
ITenanted(the marker shared critter-stack-wide fromJasperFx.MultiTenancy) and register yourDbContextwithAddDbContextWithWolverineManagedConjoinedTenancy<T>(), and Wolverine gives you what Marten users have had for years: a mappedtenant_idcolumn, a tenant-bound global query filter you can't forget, stamp-on-insert,CrossTenantWriteExceptionon cross-tenant writes, conjoined sagas, opt-in Weasel-managed physical tenant partitioning (PostgreSQL list partitions + SQL Server tenant-ordinal), and an authoritativewolverine_tenantsregistry that doubles as a dynamic tenant source and feeds CritterWatch tenant management. The behavior is checked against a port of Marten's conjoined-tenancy compliance battery. See the newConjoinedMultiTenantedEfCoresample app and docs.Messaging performance (GH-3490 / GH-3492)
A client-reported "Wolverine-over-Kafka is 3-12x slower than native" investigation turned into a measured optimization wave (methodology, rigs, and full ledgers are in the repo):
(100, 250ms)settings measured 5.8 seconds publish-to-consume p50; it now measures 136ms, bounded by the timeout. Affects every transport that sends through the batched sender (RabbitMQ routes were unaffected — they don't).MaximumMessagesToReceivelistener knob on both (default 100;1restores strict message-at-a-time persistence).Envelope[]arrival path now applies the same per-envelope guards as single-message arrival (interop serializer unwrap, dead-lettering of unidentifiable messages, expiry, drain latching), and batched inbox writes route to ancillary message stores correctly.SendMessageBatchper-entry failures (throttling, oversize) are now routed to Wolverine's retry machinery instead of being silently dropped — a silent message-loss fix (GH-3493).BufferedInMemory()/ListenerCount()with measured numbers, and a matching page exists for Kafka.Behavior changes to note
Debug(wasInformation) — restore withopts.Policies.MessageSuccessLogLevel(LogLevel.Information).wolverine-execution-timeis now a floating-point histogram and no longer silently drops sub-millisecond executions (same name/unit; the point type changes).Transports and messaging
PrefetchCounton listeners and transport defaults (GH-3471)DelaySecondsfor short scheduled sends on standard queues (GH-3472)DeliverAt(GH-3470)HTTP / gRPC
IAsyncEnumerable<TRequest> -> Task<TResponse>handler shape (#3500)StreamAsync<TRequest, TResponse>overload (#3459)Dependencies
JasperFx 2.30.1 (sender-batching max-age fix), Weasel 9.18.1, Marten 9.16.1.
6.20.0
Wolverine 6.20.0
Dependency upgrades (critter stack)
Multi-tenancy & connection footprint
nodes × databases. Plus daemon tracker-subscription leak hygiene.IntegrateWithWolverine()now honors a database-per-tenant Polecat store and readsMainDatabaseConnectionString.DatabaseDescriptor.Portinstead of re-parsing (jasperfx#514).CritterWatch / connection state
Kafka
SentAtand expose record headers on raw-JSON listeners (GH-3407).JsonSerializerOptionson raw-JSON endpoints now actually applies;PublishRawJsonmapper registration fixed.Sagas
SagaConcurrencyExceptionnow inheritsJasperFx.ConcurrencyException(GH-3444) — existingOnException<ConcurrencyException>()policies now catch saga concurrency failures.Other
TrackedSessionnot-tracked vs not-routed fix (#3435).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)
Commits viewable in compare view.
Pinned WolverineFx.FluentValidation at 6.21.0.
Release notes
Sourced from WolverineFx.FluentValidation's releases.
6.21.0
Wolverine 6.21.0 is a big one: conjoined multi-tenancy for EF Core, and a measured messaging-performance wave across Kafka and RabbitMQ.
Conjoined multi-tenancy for EF Core (#3465)
Mark an EF Core entity with
ITenanted(the marker shared critter-stack-wide fromJasperFx.MultiTenancy) and register yourDbContextwithAddDbContextWithWolverineManagedConjoinedTenancy<T>(), and Wolverine gives you what Marten users have had for years: a mappedtenant_idcolumn, a tenant-bound global query filter you can't forget, stamp-on-insert,CrossTenantWriteExceptionon cross-tenant writes, conjoined sagas, opt-in Weasel-managed physical tenant partitioning (PostgreSQL list partitions + SQL Server tenant-ordinal), and an authoritativewolverine_tenantsregistry that doubles as a dynamic tenant source and feeds CritterWatch tenant management. The behavior is checked against a port of Marten's conjoined-tenancy compliance battery. See the newConjoinedMultiTenantedEfCoresample app and docs.Messaging performance (GH-3490 / GH-3492)
A client-reported "Wolverine-over-Kafka is 3-12x slower than native" investigation turned into a measured optimization wave (methodology, rigs, and full ledgers are in the repo):
(100, 250ms)settings measured 5.8 seconds publish-to-consume p50; it now measures 136ms, bounded by the timeout. Affects every transport that sends through the batched sender (RabbitMQ routes were unaffected — they don't).MaximumMessagesToReceivelistener knob on both (default 100;1restores strict message-at-a-time persistence).Envelope[]arrival path now applies the same per-envelope guards as single-message arrival (interop serializer unwrap, dead-lettering of unidentifiable messages, expiry, drain latching), and batched inbox writes route to ancillary message stores correctly.SendMessageBatchper-entry failures (throttling, oversize) are now routed to Wolverine's retry machinery instead of being silently dropped — a silent message-loss fix (GH-3493).BufferedInMemory()/ListenerCount()with measured numbers, and a matching page exists for Kafka.Behavior changes to note
Debug(wasInformation) — restore withopts.Policies.MessageSuccessLogLevel(LogLevel.Information).wolverine-execution-timeis now a floating-point histogram and no longer silently drops sub-millisecond executions (same name/unit; the point type changes).Transports and messaging
PrefetchCounton listeners and transport defaults (GH-3471)DelaySecondsfor short scheduled sends on standard queues (GH-3472)DeliverAt(GH-3470)HTTP / gRPC
IAsyncEnumerable<TRequest> -> Task<TResponse>handler shape (#3500)StreamAsync<TRequest, TResponse>overload (#3459)Dependencies
JasperFx 2.30.1 (sender-batching max-age fix), Weasel 9.18.1, Marten 9.16.1.
6.20.0
Wolverine 6.20.0
Dependency upgrades (critter stack)
Multi-tenancy & connection footprint
nodes × databases. Plus daemon tracker-subscription leak hygiene.IntegrateWithWolverine()now honors a database-per-tenant Polecat store and readsMainDatabaseConnectionString.DatabaseDescriptor.Portinstead of re-parsing (jasperfx#514).CritterWatch / connection state
Kafka
SentAtand expose record headers on raw-JSON listeners (GH-3407).JsonSerializerOptionson raw-JSON endpoints now actually applies;PublishRawJsonmapper registration fixed.Sagas
SagaConcurrencyExceptionnow inheritsJasperFx.ConcurrencyException(GH-3444) — existingOnException<ConcurrencyException>()policies now catch saga concurrency failures.Other
TrackedSessionnot-tracked vs not-routed fix (#3435).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)
Commits viewable in compare view.
Updated WolverineFx.Postgresql from 6.17.3 to 6.21.0.
Release notes
Sourced from WolverineFx.Postgresql's releases.
6.21.0
Wolverine 6.21.0 is a big one: conjoined multi-tenancy for EF Core, and a measured messaging-performance wave across Kafka and RabbitMQ.
Conjoined multi-tenancy for EF Core (#3465)
Mark an EF Core entity with
ITenanted(the marker shared critter-stack-wide fromJasperFx.MultiTenancy) and register yourDbContextwithAddDbContextWithWolverineManagedConjoinedTenancy<T>(), and Wolverine gives you what Marten users have had for years: a mappedtenant_idcolumn, a tenant-bound global query filter you can't forget, stamp-on-insert,CrossTenantWriteExceptionon cross-tenant writes, conjoined sagas, opt-in Weasel-managed physical tenant partitioning (PostgreSQL list partitions + SQL Server tenant-ordinal), and an authoritativewolverine_tenantsregistry that doubles as a dynamic tenant source and feeds CritterWatch tenant management. The behavior is checked against a port of Marten's conjoined-tenancy compliance battery. See the newConjoinedMultiTenantedEfCoresample app and docs.Messaging performance (GH-3490 / GH-3492)
A client-reported "Wolverine-over-Kafka is 3-12x slower than native" investigation turned into a measured optimization wave (methodology, rigs, and full ledgers are in the repo):
(100, 250ms)settings measured 5.8 seconds publish-to-consume p50; it now measures 136ms, bounded by the timeout. Affects every transport that sends through the batched sender (RabbitMQ routes were unaffected — they don't).MaximumMessagesToReceivelistener knob on both (default 100;1restores strict message-at-a-time persistence).Envelope[]arrival path now applies the same per-envelope guards as single-message arrival (interop serializer unwrap, dead-lettering of unidentifiable messages, expiry, drain latching), and batched inbox writes route to ancillary message stores correctly.SendMessageBatchper-entry failures (throttling, oversize) are now routed to Wolverine's retry machinery instead of being silently dropped — a silent message-loss fix (GH-3493).BufferedInMemory()/ListenerCount()with measured numbers, and a matching page exists for Kafka.Behavior changes to note
Debug(wasInformation) — restore withopts.Policies.MessageSuccessLogLevel(LogLevel.Information).wolverine-execution-timeis now a floating-point histogram and no longer silently drops sub-millisecond executions (same name/unit; the point type changes).Transports and messaging
PrefetchCounton listeners and transport defaults (GH-3471)DelaySecondsfor short scheduled sends on standard queues (GH-3472)DeliverAt(GH-3470)HTTP / gRPC
IAsyncEnumerable<TRequest> -> Task<TResponse>handler shape (#3500)StreamAsync<TRequest, TResponse>overload (#3459)Dependencies
JasperFx 2.30.1 (sender-batching max-age fix), Weasel 9.18.1, Marten 9.16.1.
6.20.0
Wolverine 6.20.0
Dependency upgrades (critter stack)
Multi-tenancy & connection footprint
nodes × databases. Plus daemon tracker-subscription leak hygiene.IntegrateWithWolverine()now honors a database-per-tenant Polecat store and readsMainDatabaseConnectionString.DatabaseDescriptor.Portinstead of re-parsing (jasperfx#514).CritterWatch / connection state
Kafka
SentAtand expose record headers on raw-JSON listeners (GH-3407).JsonSerializerOptionson raw-JSON endpoints now actually applies;PublishRawJsonmapper registration fixed.Sagas
SagaConcurrencyExceptionnow inheritsJasperFx.ConcurrencyException(GH-3444) — existingOnException<ConcurrencyException>()policies now catch saga concurrency failures.Other
TrackedSessionnot-tracked vs not-routed fix (#3435).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)
Commits viewable in compare view.
Pinned WolverineFx.RabbitMQ at 6.21.0.
Release notes
Sourced from WolverineFx.RabbitMQ's releases.
6.21.0
Wolverine 6.21.0 is a big one: conjoined multi-tenancy for EF Core, and a measured messaging-performance wave across Kafka and RabbitMQ.
Conjoined multi-tenancy for EF Core (#3465)
Mark an EF Core entity with
ITenanted(the marker shared critter-stack-wide fromJasperFx.MultiTenancy) and register yourDbContextwithAddDbContextWithWolverineManagedConjoinedTenancy<T>(), and Wolverine gives you what Marten users have had for years: a mappedtenant_idcolumn, a tenant-bound global query filter you can't forget, stamp-on-insert,CrossTenantWriteExceptionon cross-tenant writes, conjoined sagas, opt-in Weasel-managed physical tenant partitioning (PostgreSQL list partitions + SQL Server tenant-ordinal), and an authoritativewolverine_tenantsregistry that doubles as a dynamic tenant source and feeds CritterWatch tenant management. The behavior is checked against a port of Marten's conjoined-tenancy compliance battery. See the newConjoinedMultiTenantedEfCoresample app and docs.Messaging performance (GH-3490 / GH-3492)
A client-reported "Wolverine-over-Kafka is 3-12x slower than native" investigation turned into a measured optimization wave (methodology, rigs, and full ledgers are in the repo):
(100, 250ms)settings measured 5.8 seconds publish-to-consume p50; it now measures 136ms, bounded by the timeout. Affects every transport that sends through the batched sender (RabbitMQ routes were unaffected — they don't).MaximumMessagesToReceivelistener knob on both (default 100;1restores strict message-at-a-time persistence).Envelope[]arrival path now applies the same per-envelope guards as single-message arrival (interop serializer unwrap, dead-lettering of unidentifiable messages, expiry, drain latching), and batched inbox writes route to ancillary message stores correctly.SendMessageBatchper-entry failures (throttling, oversize) are now routed to Wolverine's retry machinery instead of being silently dropped — a silent message-loss fix (GH-3493).BufferedInMemory()/ListenerCount()with measured numbers, and a matching page exists for Kafka.Behavior changes to note
Debug(wasInformation) — restore withopts.Policies.MessageSuccessLogLevel(LogLevel.Information).wolverine-execution-timeis now a floating-point histogram and no longer silently drops sub-millisecond executions (same name/unit; the point type changes).Transports and messaging
PrefetchCounton listeners and transport defaults (GH-3471)DelaySecondsfor short scheduled sends on standard queues (GH-3472)DeliverAt(GH-3470)HTTP / gRPC
IAsyncEnumerable<TRequest> -> Task<TResponse>handler shape (#3500)StreamAsync<TRequest, TResponse>overload (#3459)Dependencies
JasperFx 2.30.1 (sender-batching max-age fix), Weasel 9.18.1, Marten 9.16.1.
6.20.0
Wolverine 6.20.0
Dependency upgrades (critter stack)
Multi-tenancy & connection footprint
nodes × databases. Plus daemon tracker-subscri...Description has been truncated