Skip to content

Bump the wolverine group with 5 updates - #232

Merged
github-actions[bot] merged 1 commit into
mainfrom
dependabot/nuget/wolverine-dc3462ba6a
Nov 2, 2026
Merged

github-actions[bot] merged 1 commit into
mainfrom
dependabot/nuget/wolverine-dc3462ba6a

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Nov 2, 2026

Copy link
Copy Markdown
Contributor

Updated Marten from 9.54.1 to 9.57.0.

Release notes

Sourced from Marten's releases.

9.57.0

Highlights

  • Compaction no longer deletes the history of a stream that folds to null. A stream deleted by its own aggregate, through ShouldDelete or DeleteEvent<T>, used to lose its whole history to an empty snapshot. Compaction now leaves it alone and logs an information line. (#​5797)
  • Event data masking now reaches archived and skipped events. IncludeStream and IncludeEvents used to leave those rows in plain text and report success. (#​5797)
  • opts.Events.AutoDiscoverTagTypes turns off automatic DCB tag type registration, for stores that use strong-typed identifiers but not DCB. It's on by default, and explicit RegisterTagType<T>() calls work either way. Thanks to @​gschuager for the report and the design. (#​5806)
  • EventStoreUsage reports the event store's TenancyStyle, so a console can tell conjoined events from conjoined documents. (#​5805)
  • JasperFx 2.98.0 and Weasel 9.48.0.

Action needed after upgrading

If you rely on masking for archived or skipped events: run the same ApplyEventDataMasking call again. Data that was archived or skipped when you last ran it is still in plain text until you do.

That call runs your rules again over everything the first pass reached. If a rule isn't safe to run twice, such as one that draws a new pseudonym, add x.IsArchived to an IncludeEvents filter that still names the same subject:

x.IncludeEvents(e => e.StreamId == streamId && e.IsArchived)

Never use x.IsArchived as the whole filter, because that masks every archived event in the store.

If you compact streams: the deleted events can't be rebuilt from Marten. To find affected streams, replace <schema> and run this, then restore those streams from a backup or from wherever an archiver copied them:

select stream_id, version, tenant_id
from <schema>.mt_events
where mt_dotnet_type like 'JasperFx.Events.Compacted%'
  and 'null'::jsonb in (data->'Snapshot', data->'snapshot');

An archiver closed over IDocumentSession was never called for past compactions, so that copy won't exist.

Behaviour changes

  • IncludeEvents now includes archived events. A masking filter that needs only live events should add !x.IsArchived.
  • An events archiver closed over anything other than IDocumentOperations or IDocumentSession now throws InvalidOperationException before anything is queued. It used to be skipped silently, with the events deleted anyway. An archiver closed over IDocumentSession is now called.
  • Weasel 9.48.0: ToParameterType now throws for an unmapped type where it used to return a character catch-all. An enum resolves through its underlying type, so a long-backed enum gives Bigint. Marten's own call sites are not affected.

What's Changed

Full Changelog: JasperFx/marten@v9.56.0...V9.57.0
... (truncated)

9.56.0

What's Changed

Full Changelog: JasperFx/marten@V9.55.0...v9.56.0

9.55.0

Read before upgrading

Apps running under a Turkish or Azerbaijani culture (tr-TR, az-AZ) with document types whose names contain an uppercase I. Document aliases (#​5778), DdlTemplate lookups and flat-table upsert function names (#​5783) are now lowered with the invariant culture. Before this release, those cultures turned I into a dotless ı, so a document type Invoice was stored in mt_doc_ınvoice. From 9.55.0 it maps to mt_doc_invoice, and Marten will create that table empty. Rename the existing tables (and their upsert functions) to the invariant name before upgrading, or the existing documents will appear to be missing. Apps on any other culture are unaffected: the names they generate are unchanged.

Behaviour change: StoredDocument.Version for projection documents (#​5773). For a mapping that uses UseVersionFromMatchingStream with revisions, the diagnostics version token is now <mt_version>:<mt_last_modified as epoch microseconds> (or an md5 of the document body when last-modified tracking is disabled). It used to be mt_version alone, which did not change when the daemon rewrote the document at the same stream version. Anything that parsed the token as an integer must be updated. Undeleting a projection document through the diagnostics writer also no longer bumps mt_version past the stream's version.

Fixes worth calling out

  • HiLo ids recover after an outage (#​5784). If the first id allocation on a fresh store hit a database outage, every later allocation on that store rethrew the same exception after the database came back. Thanks to @​kentcooper for the report and the reproduction the regression test is built from.
  • Subclass queries use nested duplicated-field columns (#​5777). A query on a subclass now uses the duplicated column for a nested member such as x.Inner.Value, instead of falling back to the JSONB path.
  • Verbose connection tracing (#​5772). With TrackConnections = TrackLevel.Verbose, a marten.append.event activity event is now emitted on every append route, including the Quick routes that are the V9 default. Expect more events per append than before.
  • Weasel 9.47.1 fixes index readback for a DatabaseSchemaName that is a reserved word or contains uppercase. Before, every schema apply after the first failed with 42P07 (weasel#​750, contributed by @​marc-RocketRez).
  • StreamPagedByCursor writes each page's bytes directly and disposes its pooled stream (#​5776, @​chrisbbe).

What's Changed

New Contributors

Full Changelog: JasperFx/marten@v9.54.2...V9.55.0

9.54.2

What's Changed

New Contributors

Full Changelog: JasperFx/marten@V9.54.1...v9.54.2

Commits viewable in compare view.

Updated WolverineFx from 6.54.0 to 6.60.0.

Release notes

Sourced from WolverineFx's releases.

6.60.0

What's Changed

Full Changelog: JasperFx/wolverine@V6.59.1...V6.60.0

6.59.1

This is a patch release with two fixes. Upgrading is a package bump only: there is no schema change and no API change.

SQL Server: the inbox and outbox seek on their indexes again

  • GH-5292 (#​5294): Several of the SQL Server message store's per-envelope statements were scanning the whole envelope table. That cost grows with the size of the inbox and outbox, and those statements run once per message. The cause was how two kinds of value were bound as parameters.
    • Envelope ids went out as sql_variant. The statements that mark envelopes as handled, reassign them, delete them and move them to the dead letter queue all filter on the envelope id. Weasel's generic command builder has no mapping for Guid, so it bound each id as DbType.Object, which SqlClient sends as sql_variant. SQL Server then had to compare CONVERT_IMPLICIT(sql_variant, [id]) on every row, which rules out a seek on the uniqueidentifier primary key. Ids are now bound as uniqueidentifier, so each statement is a primary key seek.
    • Envelope addresses went out as nvarchar. received_at on the inbox and destination on the outbox are varchar(250) columns, but statements that filter on them bound the address as nvarchar. Under a SQL collation such as SQL_Latin1_General_CP1_CI_AS, the default on Azure SQL, that converts the column and defeats the index. The statements affected are the per-envelope updates and deletes, inbox recovery's page load, outbox loads by destination, the scheduled message updates and the duplicate check. They now bind the address as varchar.
    • DateTime parameters kept only the date. The same generic mapping typed DateTime as DbType.Date. The message store now lets SqlClient type both values itself.
    • The new test checks SQL Server's plan cache after running each of these statements. It requires that no plan contains sql_variant and that no plan converts an indexed envelope column. The full SqlServerTests suite passes (721 tests, 2 skipped).
    • PostgreSQL, MySQL, SQLite and Oracle bind exactly as they did before.
    • The underlying Weasel mappings are tracked as JasperFx/weasel#​758 (Guid as sql_variant) and JasperFx/weasel#​759 (DateTime as date). Wolverine works around both on its own, so this release doesn't wait for a Weasel release.

The run command no longer blocks a thread pool thread

  • JasperFx 2.96.2 (JasperFx/jasperfx#​1093, fixes JasperFx/jasperfx#​1092): Wolverine now depends on JasperFx 2.96.2. Before this release, the run command waited for shutdown by blocking a thread pool thread for the whole life of the application. That matters when a container's CPU limit is below one core. ProcessorCount is then 1, so the thread pool's minimum is one thread, and the run command held it. After that, every burst of work had to wait for the pool to add a thread, about 500 ms each time. The reporter saw a 200 ms Task.Delay loop wake up as much as about 950 ms late on Azure Container Apps.
    • The run command now awaits shutdown instead of blocking. It still listens for the same three signals: ApplicationStopping, Ctrl+C, and the assembly load context unloading.
    • When the host is already started (the AutoStartHost / WebApplicationFactory path), RunJasperFxCommands() used to block the calling thread. It now returns a task that completes when the host shuts down.
    • This applies to every application started with RunJasperFxCommands() or RunWolverineCommands(), whatever its persistence or transport.

Full Changelog: JasperFx/wolverine@V6.59.0...V6.59.1

6.59.0

New

  • GH-5288 (#​5289): Scheduled message management now knows about sagas. ScheduledMessageSummary.SagaId reports the saga id carried by each scheduled envelope. The new ScheduledMessageQuery.SagaId limits QueryAsync and CancelAsync to one saga's scheduled messages, such as its pending timeouts.
    • There is no schema change. The filter reads every scheduled message that matches the rest of the query and pages the saga's messages in memory, so PageSize and TotalCount stay exact. On a large scheduled backlog, narrow the query with MessageType or an execution-time window as well.
    • A CancelAsync with a SagaId that matches nothing cancels nothing.
    • Supported by PostgreSQL, SQL Server, MySQL, SQLite, Oracle, RavenDB and CosmosDB. RavenDB and CosmosDB now treat PageSize <= 0 as "read every match", as the RDBMS stores already did.
  • #​5287: WolverineFx.AI's AddLlmCallouts() now works under TypeLoadMode.Static when the application's pre-generated code was written without it. A library can ship its own static codegen and a host can add LLM callouts on top. In Static mode, callouts run on a pre-built handler that needs no generated code. Every other mode is unchanged.
    • New LlmCalloutOptions.ConfigureChain(Action<HandlerChain>) customizes the callout chain in any mode. IHandlerPolicy doesn't reach the pre-built handler.
    • DeduplicateCallouts is refused at startup in Static mode, because deduplication is woven into generated code.

Fixes

  • GH-5286 (#​5290): A send that IHost.StopAsync() cancels mid-flight is no longer logged as a send failure. Azure Service Bus hands the runtime's cancellation token to the SDK, so an orderly shutdown used to produce two Error lines for a batch that was never lost. A durable agent now logs it at Information, because the envelopes stay in the outbox and are recovered on restart. A non-durable agent logs it at Warning, because those messages were not sent. A shutdown cancellation no longer counts toward the circuit breaker or the sending failure policies. A cancellation while the application is still running, or any other exception during shutdown, is still logged at Error.

6.58.0

New

  • GH-5279 (#​5280, #​5282): New opt-in Durability.UseTransactionScopedDurabilityPassLock for PostgreSQL. The serverless durability pass takes a transaction-scoped advisory lock (pg_try_advisory_xact_lock) instead of a session lock. This makes the pass lock safe behind a transaction-mode pooler such as PgBouncer or Supabase's pooler, where a session lock can leak onto a pooled connection or be held by two passes at once. #​5282 hardens it:

    • the lock connection stays out of an ambient TransactionScope
    • an idle_in_transaction_session_timeout can no longer drop the lock in the middle of a pass
    • a lock transaction that ends before the pass does is reported, and its pooled connection is discarded
    • a session unlock that fails is logged as a warning

    Wolverine also logs a one-time warning when the store doesn't support the setting, or when extension steps such as Marten's projection catch-up run under the open lock transaction. That open transaction can stall Marten's gap detection, which is tracked in JasperFx/marten#​5791. See the serverless guide.

Fixes

  • GH-5276 (#​5277, thanks @​3nth): The HTTP transport's batch endpoint now answers 503 when a durable local queue cannot write the batch to its inbox. Before, it answered 200 while the messages were dropped, so a durable outbox deleted messages that were never stored on either side. The sender now keeps the batch and retries it.
  • GH-5278 (#​5281): A durable TCP listener now answers ProcessingFailure instead of Received when its inbox could not store a batch. The sender keeps the batch and retries it, and a late duplicate is deduplicated by id. gRPC listeners can't be durable, so they aren't affected. A guard test now pins that.
  • #​5275 (thanks @​lahma): With Durability.EnableInboxPartitioning, PostgreSQL's durable inbox now refuses a redelivery whose identity was already handled. Before, the kept Handled row sat in a different partition and didn't collide, so the redelivery was handled a second time. This completes the stable-id deduplication from 6.57.0 for partitioned inboxes.

6.57.0

New

  • GH-5244 (#​5272): NServiceBus interop now supports XML. Many NServiceBus systems still use the NServiceBus XmlSerializer, and they no longer have to switch to JSON before a migration to Wolverine can start. Every NServiceBus interop endpoint (Rabbit MQ, Azure Service Bus, Amazon SQS and SNS, and the SQL Server and PostgreSQL NServiceBus transports) now reads both JSON and XML, choosing per message from the NServiceBus.ContentType header. To send XML, use the new NServiceBusXmlSerializer: .UseNServiceBusInterop().DefaultSerializer(new NServiceBusXmlSerializer()). Because one endpoint reads both formats, NServiceBus endpoints can also move from XML to JSON gradually. See XML Serialization with NServiceBus.
  • #​5268 (thanks @​lahma) and #​5273: A durable listener now gives a message from a non-Wolverine producer, which has no Wolverine id, a stable envelope id derived from the broker's own identity for that message. A redelivery is then deduplicated by the durable inbox instead of being handled twice. This covers Kafka (topic, partition and offset), NATS JetStream, Pulsar, Redis Streams, Amazon SQS and GCP Pub/Sub pull subscriptions. On SQS and Pub/Sub it applies in every endpoint mode. #​5273 also makes raw JSON work on durable SQS listeners. A duplicate the durable inbox refuses is now logged at Information instead of as an error.
  • GH-5260 (#​5261): New opt-in WolverineHttpOptions.RejectUnparseableHeaderValues answers 400 with ProblemDetails when a [FromHeader] value can't be parsed.

Fixes

  • GH-5244 (#​5272): NServiceBus replies to Wolverine over Rabbit MQ now go to the queue marked UseForReplies(). Wolverine used to give NServiceBus its own wolverine.response.{guid} system queue as the reply address, which NServiceBus can't reach, so every reply ended up in NServiceBus's error queue.
  • GH-5247 (#​5248): DurabilityAgent.StopAsync() now cancels its in-flight durability command and waits for it to finish. Before, a command still running at shutdown could outlive the host and fail against a disposed data source.
  • GH-5253 (#​5256, thanks @​thomhurst): A leadership lock acquisition cancelled by node shutdown is no longer logged as an error.
  • GH-5254 (#​5265): Shutdown now waits for handlers still running on a buffered local queue.
  • GH-5257 (#​5266): Stopping a listener now interrupts an inline retry cooldown instead of waiting it out, and the retry doesn't run after the stop.
  • GH-5262 (#​5263): Lightweight EF Core handlers now collect domain events before their save, so the events are published atomically with it.
  • #​5245 (thanks @​ahyousif): Managed EF Core tenancy combined with WithDbContextAbstraction now reuses the tenant DbContext, so repository writes, the save and outbox enrollment all use one context. This could previously fail code generation.
  • #​5250 (thanks @​johnkaram02): A request that repeats a [FromHeader] header binds the comma-joined values instead of answering 500.
  • #​5252 (thanks @​johnkaram02) and #​5259: Additional error actions such as AndPauseProcessing() chained after ScheduleRetryIndefinitely() / RequeueIndefinitely() now apply, including to the open-ended attempts after the listed delays.

Dependencies

  • JasperFx 2.96.1 and JasperFx.RuntimeCompiler 5.0.1 (#​5258)
  • Weasel 9.47.1 (#​5269)

Docs and build

  • The Best Practices guide is rewritten (#​5270).
  • New docs for stable envelope ids from non-Wolverine producers, and for deduplicating CloudEvents (#​5273).
  • ./build.sh LocalGate runs every CI suite on one machine (GH-5125, #​5246). The CI suites are rebalanced to stay under the 20 minute job limit (#​5267), and the scaffold tests now pass on Windows (GH-5255, #​5264).

6.56.0

New

  • GH-5238 (#​5242): opts.UseHttpTransport() registers the HTTP transport inside UseWolverine(). http/https URIs then resolve in ListenForMessagesFrom(), PublishMessage<T>().To(uri), and runtime EndpointFor() / ToDestination(). Before this, the transport was only registered by ToHttpEndpoint(), and any other http URI failed with Unknown Transport scheme 'http'. /_wolverine/invoke now answers 415 instead of 500 for a content type with no registered serializer.

Fixes

  • GH-5235 (#​5239): Host shutdown now stops the durability metrics sweeper and waits for any query it has in flight before stores are disposed. Removing a durability agent also waits for its in-flight query. A metrics query could previously outlive IHost.StopAsync() and throw ObjectDisposedException against a disposed NpgsqlDataSource.
  • GH-5236 (#​5240): A Kafka listener with a durable inbox no longer crashes the process with a stack overflow when the inbox database is unavailable. DeferAsync() used to call back into the receiver inline, so the failed inbox write and the defer recursed. A deferred Kafka envelope now goes back to the receiver on its own task after a short pause, and only while the listener is running. After a stop or inbox-recovery pause, its uncommitted offset brings it back. Because Kafka has no native requeue, a Requeue error policy on a Kafka endpoint now redelivers after about one second instead of immediately.
  • GH-5237 (#​5241): A CloudEvents HTTP endpoint now fails a single-envelope send that the receiver rejects. It used to count the send as delivered, so a durable endpoint aimed at /_wolverine/invoke could delete an outgoing envelope that was never received. HTTP transport responses are now disposed.

6.55.1

Fixes

  • GH-5230 (#​5232): A database operation batch cancelled by Wolverine's own shutdown is no longer wrapped in DatabaseBatchCommandException and logged as an Error. Genuine SQL/connection failures are still reported.
  • GH-5231 (#​5233): An HttpEndpoint aimed at /_wolverine/invoke in its default (buffered) mode now delivers by posting each envelope individually, instead of receiving a 415 for every batch and retrying forever. /batch/{queue} and .SendInline() endpoints are unchanged.

6.55.0

Highlights

WolverineFx.Bobcat is out of alpha, on Bobcat 1.0.0 (#​5222, #​5229). Bobcat 1.0.0 shipped tonight, and WolverineFx.Bobcat and WolverineFx.Bobcat.EventModel now publish as stable 6.55.0 instead of -alpha.1. WolverineFx.Bobcat.Http stays 6.55.0-alpha.1 until Alba 9 ships stable, because a stable package cannot depend on Alba 9.0.0-rc.2. A spec project that write-specs generates with no --wolverine-version pins the stable WolverineFx.Bobcat (#​5222, #​5223).

MessageCausedBy names your handler (#​5224, #​5225). IWolverineObserver.MessageCausedBy reported the generated handler class (Internal.Generated.WolverineHandlers.StartTripHandler939323516). It now reports the handler you wrote (TripService.StartTripHandler), the same string as the message.handler span tag, resolved at codegen time. Code generated by an earlier version keeps working through the old overload.

CosmosDB sagas start with a conditional create (#​5221, thanks @​thechucklingatom). A second start message for an existing saga id used to silently overwrite the running saga. It now fails with the SagaConcurrencyException that Marten, Azure Blob and S3 already raise, so one OnException<SagaConcurrencyException>() policy covers every provider.

Fixes

  • GH-5217: ListeningAgent.StartAsync is serialized, and deliveries are deferred to a drained BufferedReceiver (#​5228)
  • GH-5218: an unresolvable tenant is treated as tenant-scoped on the single-envelope inbox write (#​5227)
  • GH-5220: Azure Service Bus listeners join their receive loop before disposing the CancellationTokenSource (#​5226)
  • GH-5215: reserved-word schema names are quoted in the remaining RDBMS and PostgreSQL SQL (#​5216, thanks @​marc-RocketRez)
  • GH-5213: a later pause supersedes an earlier pause's restart (#​5214)
  • GH-5209: the dead letter history table round-trips with no schema drift (#​5212)

Dependencies

  • JasperFx 2.96.0 (jasperfx#​1083: an Observed vs Derived Origin no longer raises a SourceDisagreement)
  • Weasel 9.47.0 (#​5219)
  • Bobcat 1.0.0

Full Changelog: JasperFx/wolverine@V6.54.0...V6.55.0

Commits viewable in compare view.

Updated WolverineFx.Marten from 6.54.0 to 6.60.0.

Release notes

Sourced from WolverineFx.Marten's releases.

6.60.0

What's Changed

Full Changelog: JasperFx/wolverine@V6.59.1...V6.60.0

6.59.1

This is a patch release with two fixes. Upgrading is a package bump only: there is no schema change and no API change.

SQL Server: the inbox and outbox seek on their indexes again

  • GH-5292 (#​5294): Several of the SQL Server message store's per-envelope statements were scanning the whole envelope table. That cost grows with the size of the inbox and outbox, and those statements run once per message. The cause was how two kinds of value were bound as parameters.
    • Envelope ids went out as sql_variant. The statements that mark envelopes as handled, reassign them, delete them and move them to the dead letter queue all filter on the envelope id. Weasel's generic command builder has no mapping for Guid, so it bound each id as DbType.Object, which SqlClient sends as sql_variant. SQL Server then had to compare CONVERT_IMPLICIT(sql_variant, [id]) on every row, which rules out a seek on the uniqueidentifier primary key. Ids are now bound as uniqueidentifier, so each statement is a primary key seek.
    • Envelope addresses went out as nvarchar. received_at on the inbox and destination on the outbox are varchar(250) columns, but statements that filter on them bound the address as nvarchar. Under a SQL collation such as SQL_Latin1_General_CP1_CI_AS, the default on Azure SQL, that converts the column and defeats the index. The statements affected are the per-envelope updates and deletes, inbox recovery's page load, outbox loads by destination, the scheduled message updates and the duplicate check. They now bind the address as varchar.
    • DateTime parameters kept only the date. The same generic mapping typed DateTime as DbType.Date. The message store now lets SqlClient type both values itself.
    • The new test checks SQL Server's plan cache after running each of these statements. It requires that no plan contains sql_variant and that no plan converts an indexed envelope column. The full SqlServerTests suite passes (721 tests, 2 skipped).
    • PostgreSQL, MySQL, SQLite and Oracle bind exactly as they did before.
    • The underlying Weasel mappings are tracked as JasperFx/weasel#​758 (Guid as sql_variant) and JasperFx/weasel#​759 (DateTime as date). Wolverine works around both on its own, so this release doesn't wait for a Weasel release.

The run command no longer blocks a thread pool thread

  • JasperFx 2.96.2 (JasperFx/jasperfx#​1093, fixes JasperFx/jasperfx#​1092): Wolverine now depends on JasperFx 2.96.2. Before this release, the run command waited for shutdown by blocking a thread pool thread for the whole life of the application. That matters when a container's CPU limit is below one core. ProcessorCount is then 1, so the thread pool's minimum is one thread, and the run command held it. After that, every burst of work had to wait for the pool to add a thread, about 500 ms each time. The reporter saw a 200 ms Task.Delay loop wake up as much as about 950 ms late on Azure Container Apps.
    • The run command now awaits shutdown instead of blocking. It still listens for the same three signals: ApplicationStopping, Ctrl+C, and the assembly load context unloading.
    • When the host is already started (the AutoStartHost / WebApplicationFactory path), RunJasperFxCommands() used to block the calling thread. It now returns a task that completes when the host shuts down.
    • This applies to every application started with RunJasperFxCommands() or RunWolverineCommands(), whatever its persistence or transport.

Full Changelog: JasperFx/wolverine@V6.59.0...V6.59.1

6.59.0

New

  • GH-5288 (#​5289): Scheduled message management now knows about sagas. ScheduledMessageSummary.SagaId reports the saga id carried by each scheduled envelope. The new ScheduledMessageQuery.SagaId limits QueryAsync and CancelAsync to one saga's scheduled messages, such as its pending timeouts.
    • There is no schema change. The filter reads every scheduled message that matches the rest of the query and pages the saga's messages in memory, so PageSize and TotalCount stay exact. On a large scheduled backlog, narrow the query with MessageType or an execution-time window as well.
    • A CancelAsync with a SagaId that matches nothing cancels nothing.
    • Supported by PostgreSQL, SQL Server, MySQL, SQLite, Oracle, RavenDB and CosmosDB. RavenDB and CosmosDB now treat PageSize <= 0 as "read every match", as the RDBMS stores already did.
  • #​5287: WolverineFx.AI's AddLlmCallouts() now works under TypeLoadMode.Static when the application's pre-generated code was written without it. A library can ship its own static codegen and a host can add LLM callouts on top. In Static mode, callouts run on a pre-built handler that needs no generated code. Every other mode is unchanged.
    • New LlmCalloutOptions.ConfigureChain(Action<HandlerChain>) customizes the callout chain in any mode. IHandlerPolicy doesn't reach the pre-built handler.
    • DeduplicateCallouts is refused at startup in Static mode, because deduplication is woven into generated code.

Fixes

  • GH-5286 (#​5290): A send that IHost.StopAsync() cancels mid-flight is no longer logged as a send failure. Azure Service Bus hands the runtime's cancellation token to the SDK, so an orderly shutdown used to produce two Error lines for a batch that was never lost. A durable agent now logs it at Information, because the envelopes stay in the outbox and are recovered on restart. A non-durable agent logs it at Warning, because those messages were not sent. A shutdown cancellation no longer counts toward the circuit breaker or the sending failure policies. A cancellation while the application is still running, or any other exception during shutdown, is still logged at Error.

6.58.0

New

  • GH-5279 (#​5280, #​5282): New opt-in Durability.UseTransactionScopedDurabilityPassLock for PostgreSQL. The serverless durability pass takes a transaction-scoped advisory lock (pg_try_advisory_xact_lock) instead of a session lock. This makes the pass lock safe behind a transaction-mode pooler such as PgBouncer or Supabase's pooler, where a session lock can leak onto a pooled connection or be held by two passes at once. #​5282 hardens it:

    • the lock connection stays out of an ambient TransactionScope
    • an idle_in_transaction_session_timeout can no longer drop the lock in the middle of a pass
    • a lock transaction that ends before the pass does is reported, and its pooled connection is discarded
    • a session unlock that fails is logged as a warning

    Wolverine also logs a one-time warning when the store doesn't support the setting, or when extension steps such as Marten's projection catch-up run under the open lock transaction. That open transaction can stall Marten's gap detection, which is tracked in JasperFx/marten#​5791. See the serverless guide.

Fixes

  • GH-5276 (#​5277, thanks @​3nth): The HTTP transport's batch endpoint now answers 503 when a durable local queue cannot write the batch to its inbox. Before, it answered 200 while the messages were dropped, so a durable outbox deleted messages that were never stored on either side. The sender now keeps the batch and retries it.
  • GH-5278 (#​5281): A durable TCP listener now answers ProcessingFailure instead of Received when its inbox could not store a batch. The sender keeps the batch and retries it, and a late duplicate is deduplicated by id. gRPC listeners can't be durable, so they aren't affected. A guard test now pins that.
  • #​5275 (thanks @​lahma): With Durability.EnableInboxPartitioning, PostgreSQL's durable inbox now refuses a redelivery whose identity was already handled. Before, the kept Handled row sat in a different partition and didn't collide, so the redelivery was handled a second time. This completes the stable-id deduplication from 6.57.0 for partitioned inboxes.

6.57.0

New

  • GH-5244 (#​5272): NServiceBus interop now supports XML. Many NServiceBus systems still use the NServiceBus XmlSerializer, and they no longer have to switch to JSON before a migration to Wolverine can start. Every NServiceBus interop endpoint (Rabbit MQ, Azure Service Bus, Amazon SQS and SNS, and the SQL Server and PostgreSQL NServiceBus transports) now reads both JSON and XML, choosing per message from the NServiceBus.ContentType header. To send XML, use the new NServiceBusXmlSerializer: .UseNServiceBusInterop().DefaultSerializer(new NServiceBusXmlSerializer()). Because one endpoint reads both formats, NServiceBus endpoints can also move from XML to JSON gradually. See XML Serialization with NServiceBus.
  • #​5268 (thanks @​lahma) and #​5273: A durable listener now gives a message from a non-Wolverine producer, which has no Wolverine id, a stable envelope id derived from the broker's own identity for that message. A redelivery is then deduplicated by the durable inbox instead of being handled twice. This covers Kafka (topic, partition and offset), NATS JetStream, Pulsar, Redis Streams, Amazon SQS and GCP Pub/Sub pull subscriptions. On SQS and Pub/Sub it applies in every endpoint mode. #​5273 also makes raw JSON work on durable SQS listeners. A duplicate the durable inbox refuses is now logged at Information instead of as an error.
  • GH-5260 (#​5261): New opt-in WolverineHttpOptions.RejectUnparseableHeaderValues answers 400 with ProblemDetails when a [FromHeader] value can't be parsed.

Fixes

  • GH-5244 (#​5272): NServiceBus replies to Wolverine over Rabbit MQ now go to the queue marked UseForReplies(). Wolverine used to give NServiceBus its own wolverine.response.{guid} system queue as the reply address, which NServiceBus can't reach, so every reply ended up in NServiceBus's error queue.
  • GH-5247 (#​5248): DurabilityAgent.StopAsync() now cancels its in-flight durability command and waits for it to finish. Before, a command still running at shutdown could outlive the host and fail against a disposed data source.
  • GH-5253 (#​5256, thanks @​thomhurst): A leadership lock acquisition cancelled by node shutdown is no longer logged as an error.
  • GH-5254 (#​5265): Shutdown now waits for handlers still running on a buffered local queue.
  • GH-5257 (#​5266): Stopping a listener now interrupts an inline retry cooldown instead of waiting it out, and the retry doesn't run after the stop.
  • GH-5262 (#​5263): Lightweight EF Core handlers now collect domain events before their save, so the events are published atomically with it.
  • #​5245 (thanks @​ahyousif): Managed EF Core tenancy combined with WithDbContextAbstraction now reuses the tenant DbContext, so repository writes, the save and outbox enrollment all use one context. This could previously fail code generation.
  • #​5250 (thanks @​johnkaram02): A request that repeats a [FromHeader] header binds the comma-joined values instead of answering 500.
  • #​5252 (thanks @​johnkaram02) and #​5259: Additional error actions such as AndPauseProcessing() chained after ScheduleRetryIndefinitely() / RequeueIndefinitely() now apply, including to the open-ended attempts after the listed delays.

Dependencies

  • JasperFx 2.96.1 and JasperFx.RuntimeCompiler 5.0.1 (#​5258)
  • Weasel 9.47.1 (#​5269)

Docs and build

  • The Best Practices guide is rewritten (#​5270).
  • New docs for stable envelope ids from non-Wolverine producers, and for deduplicating CloudEvents (#​5273).
  • ./build.sh LocalGate runs every CI suite on one machine (GH-5125, #​5246). The CI suites are rebalanced to stay under the 20 minute job limit (#​5267), and the scaffold tests now pass on Windows (GH-5255, #​5264).

6.56.0

New

  • GH-5238 (#​5242): opts.UseHttpTransport() registers the HTTP transport inside UseWolverine(). http/https URIs then resolve in ListenForMessagesFrom(), PublishMessage<T>().To(uri), and runtime EndpointFor() / ToDestination(). Before this, the transport was only registered by ToHttpEndpoint(), and any other http URI failed with Unknown Transport scheme 'http'. /_wolverine/invoke now answers 415 instead of 500 for a content type with no registered serializer.

Fixes

  • GH-5235 (#​5239): Host shutdown now stops the durability metrics sweeper and waits for any query it has in flight before stores are disposed. Removing a durability agent also waits for its in-flight query. A metrics query could previously outlive IHost.StopAsync() and throw ObjectDisposedException against a disposed NpgsqlDataSource.
  • GH-5236 (#​5240): A Kafka listener with a durable inbox no longer crashes the process with a stack overflow when the inbox database is unavailable. DeferAsync() used to call back into the receiver inline, so the failed inbox write and the defer recursed. A deferred Kafka envelope now goes back to the receiver on its own task after a short pause, and only while the listener is running. After a stop or inbox-recovery pause, its uncommitted offset brings it back. Because Kafka has no native requeue, a Requeue error policy on a Kafka endpoint now redelivers after about one second instead of immediately.
  • GH-5237 (#​5241): A CloudEvents HTTP endpoint now fails a single-envelope send that the receiver rejects. It used to count the send as delivered, so a durable endpoint aimed at /_wolverine/invoke could delete an outgoing envelope that was never received. HTTP transport responses are now disposed.

6.55.1

Fixes

  • GH-5230 (#​5232): A database operation batch cancelled by Wolverine's own shutdown is no longer wrapped in DatabaseBatchCommandException and logged as an Error. Genuine SQL/connection failures are still reported.
  • GH-5231 (#​5233): An HttpEndpoint aimed at /_wolverine/invoke in its default (buffered) mode now delivers by posting each envelope individually, instead of receiving a 415 for every batch and retrying forever. /batch/{queue} and .SendInline() endpoints are unchanged.

6.55.0

Highlights

WolverineFx.Bobcat is out of alpha, on Bobcat 1.0.0 (#​5222, #​5229). Bobcat 1.0.0 shipped tonight, and WolverineFx.Bobcat and WolverineFx.Bobcat.EventModel now publish as stable 6.55.0 instead of -alpha.1. WolverineFx.Bobcat.Http stays 6.55.0-alpha.1 until Alba 9 ships stable, because a stable package cannot depend on Alba 9.0.0-rc.2. A spec project that write-specs generates with no --wolverine-version pins the stable WolverineFx.Bobcat (#​5222, #​5223).

MessageCausedBy names your handler (#​5224, #​5225). IWolverineObserver.MessageCausedBy reported the generated handler class (Internal.Generated.WolverineHandlers.StartTripHandler939323516). It now reports the handler you wrote (TripService.StartTripHandler), the same string as the message.handler span tag, resolved at codegen time. Code generated by an earlier version keeps working through the old overload.

CosmosDB sagas start with a conditional create (#​5221, thanks @​thechucklingatom). A second start message for an existing saga id used to silently overwrite the running saga. It now fails with the SagaConcurrencyException that Marten, Azure Blob and S3 already raise, so one OnException<SagaConcurrencyException>() policy covers every provider.

Fixes

  • GH-5217: ListeningAgent.StartAsync is serialized, and deliveries are deferred to a drained BufferedReceiver (#​5228)
  • GH-5218: an unresolvable tenant is treated as tenant-scoped on the single-envelope inbox write (#​5227)
  • GH-5220: Azure Service Bus listeners join their receive loop before disposing the CancellationTokenSource (#​5226)
  • GH-5215: reserved-word schema names are quoted in the remaining RDBMS and PostgreSQL SQL (#​5216, thanks @​marc-RocketRez)
  • GH-5213: a later pause supersedes an earlier pause's restart (#​5214)
  • GH-5209: the dead letter history table round-trips with no schema drift (#​5212)

Dependencies

  • JasperFx 2.96.0 (jasperfx#​1083: an Observed vs Derived Origin no longer raises a SourceDisagreement)
  • Weasel 9.47.0 (#​5219)
  • Bobcat 1.0.0

Full Changelog: JasperFx/wolverine@V6.54.0...V6.55.0

Commits viewable in compare view.

Updated WolverineFx.RabbitMQ from 6.54.0 to 6.60.0.

Release notes

Sourced from WolverineFx.RabbitMQ's releases.

6.60.0

What's Changed

Full Changelog: JasperFx/wolverine@V6.59.1...V6.60.0

6.59.1

This is a patch release with two fixes. Upgrading is a package bump only: there is no schema change and no API change.

SQL Server: the inbox and outbox seek on their indexes again

  • GH-5292 (#​5294): Several of the SQL Server message store's per-envelope statements were scanning the whole envelope table. That cost grows with the size of the inbox and outbox, and those statements run once per message. The cause was how two kinds of value were bound as parameters.
    • Envelope ids went out as sql_variant. The statements that mark envelopes as handled, reassign them, delete them and move them to the dead letter queue all filter on the envelope id. Weasel's generic command builder has no mapping for Guid, so it bound each id as DbType.Object, which SqlClient sends as sql_variant. SQL Server then had to compare CONVERT_IMPLICIT(sql_variant, [id]) on every row, which rules out a seek on the uniqueidentifier primary key. Ids are now bound as uniqueidentifier, so each statement is a primary key seek.
    • Envelope addresses went out as nvarchar. received_at on the inbox and destination on the outbox are varchar(250) columns, but statements that filter on them bound the address as nvarchar. Under a SQL collation such as SQL_Latin1_General_CP1_CI_AS, the default on Azure SQL, that converts the column and defeats the index. The statements affected are the per-envelope updates and deletes, inbox recovery's page load, outbox loads by destination, the scheduled message updates and the duplicate check. They now bind the address as varchar.
    • DateTime parameters kept only the date. The same generic mapping typed DateTime as DbType.Date. The message store now lets SqlClient type both values itself.
    • The new test checks SQL Server's plan cache after running each of these statements. It requires that no plan contains sql_variant and that no plan converts an indexed envelope column. The full SqlServerTests suite passes (721 tests, 2 skipped).
    • PostgreSQL, MySQL, SQLite and Oracle bind exactly as they did before.
    • The underlying Weasel mappings are tracked as JasperFx/weasel#​758 (Guid as sql_variant) and JasperFx/weasel#​759 (DateTime as date). Wolverine works around both on its own, so this release doesn't wait for a Weasel release.

The run command no longer blocks a thread pool thread

  • JasperFx 2.96.2 (JasperFx/jasperfx#​1093, fixes JasperFx/jasperfx#​1092): Wolverine now depends on JasperFx 2.96.2. Before this release, the run command waited for shutdown by blocking a thread pool thread for the whole life of the application. That matters when a container's CPU limit is below one core. ProcessorCount is then 1, so the thread pool's minimum is one thread, and the run command held it. After that, every burst of work had to wait for the pool to add a thread, about 500 ms each time. The reporter saw a 200 ms Task.Delay loop wake up as much as about 950 ms late on Azure Container Apps.
    • The run command now awaits shutdown instead of blocking. It still listens for the same three signals: ApplicationStopping, Ctrl+C, and the assembly load context unloading.
    • When the host is already started (the AutoStartHost / WebApplicationFactory path), RunJasperFxCommands() used to block the calling thread. It now returns a task that completes when the host shuts down.
    • This applies to every application started with RunJasperFxCommands() or RunWolverineCommands(), whatever its persistence or transport.

Full Changelog: JasperFx/wolverine@V6.59.0...V6.59.1

6.59.0

New

  • GH-5288 (#​5289): Scheduled message management now knows about sagas. ScheduledMessageSummary.SagaId reports the saga id carried by each scheduled envelope. The new ScheduledMessageQuery.SagaId limits QueryAsync and CancelAsync to one saga's scheduled messages, such as its pending timeouts.
    • There is no schema change. The filter reads every scheduled message that matches the rest of the query and pages the saga's messages in memory, so PageSize and TotalCount stay exact. On a large scheduled backlog, narrow the query with MessageType or an execution-time window as well.
    • A CancelAsync with a SagaId that matches nothing cancels nothing.
    • Supported by PostgreSQL, SQL Server, MySQL, SQLite, Oracle, RavenDB and CosmosDB. RavenDB and CosmosDB now treat PageSize <= 0 as "read every match", as the RDBMS stores already did.
  • #​5287: WolverineFx.AI's AddLlmCallouts() now works under TypeLoadMode.Static when the application's pre-generated code was written without it. A library can ship its own static codegen and a host can add LLM callouts on top. In Static mode, callouts run on a pre-built handler that needs no generated code. Every other mode is unchanged.
    • New LlmCalloutOptions.ConfigureChain(Action<HandlerChain>) customizes the callout chain in any mode. IHandlerPolicy doesn't reach the pre-built handler.
    • DeduplicateCallouts is refused at startup in Static mode, because deduplication is woven into generated code.

Fixes

  • GH-5286 (#​5290): A send that IHost.StopAsync() cancels mid-flight is no longer logged as a send failure. Azure Service Bus hands the runtime's cancellation token to the SDK, so an orderly shutdown used to produce two Error lines for a batch that was never lost. A durable agent now logs it at Information, because the envelopes stay in the outbox and are recovered on restart. A non-durable agent logs it at Warning, because those messages were not sent. A shutdown cancellation no longer counts toward the circuit breaker or the sending failure policies. A cancellation while the application is still running, or any other exception during shutdown, is still logged at Error.

6.58.0

New

  • GH-5279 (#​5280, #​5282): New opt-in Durability.UseTransactionScopedDurabilityPassLock for PostgreSQL. The serverless durability pass takes a transaction-scoped advisory lock (pg_try_advisory_xact_lock) instead of a session lock. This makes the pass lock safe behind a transaction-mode pooler such as PgBouncer or Supabase's pooler, where a session lock can leak onto a pooled connection or be held by two passes at once. #​5282 hardens it:

    • the lock connection stays out of an ambient TransactionScope
    • an idle_in_transaction_session_timeout can no longer drop the lock in the middle of a pass
    • a lock transaction that ends before the pass does is reported, and its pooled connection is discarded
    • a session unlock that fails is logged as a warning

    Wolverine also logs a one-time warning when the store doesn't support the setting, or when extension steps such as Marten's projection catch-up run under the open lock transaction. That open transaction can stall Marten's gap detection, which is tracked in JasperFx/marten#​5791. See the serverless guide.

Fixes

  • GH-5276 (#​5277, thanks @​3nth): The HTTP transport's batch endpoint now answers 503 when a durable local queue cannot write the batch to its inbox. Before, it answered 200 while the messages were dropped, so a durable outbox deleted messages that were never stored on either side. The sender now keeps the batch and retries it.
  • GH-5278 (#​5281): A durable TCP listener now answers ProcessingFailure instead of Received when its inbox could not store a batch. The sender keeps the batch and retries it, and a late duplicate is deduplicated by id. gRPC listeners can't be durable, so they aren't affected. A guard test now pins that.
  • #​5275 (thanks @​lahma): With Durability.EnableInboxPartitioning, PostgreSQL's durable inbox now refuses a redelivery whose identity was already handled. Before, the kept Handled row sat in a different partition and didn't collide, so the redelivery was handled a second time. This completes the stable-id deduplication from 6.57.0 for partitioned inboxes.

6.57.0

New

  • GH-5244 (#​5272): NServiceBus interop now supports XML. Many NServiceBus systems still use the NServiceBus XmlSerializer, and they no longer have to switch to JSON before a migration to Wolverine can start. Every NServiceBus interop endpoint (Rabbit MQ, Azure Service Bus, Amazon SQS and SNS, and the SQL Server and PostgreSQL NServiceBus transports) now reads both JSON and XML, choosing per message from the NServiceBus.ContentType header. To send XML, use the new NServiceBusXmlSerializer: .UseNServiceBusInterop().DefaultSerializer(new NServiceBusXmlSerializer()). Because one endpoint reads both formats, NServiceBus endpoints can also move from XML to JSON gradually. See XML Serialization with NServiceBus.
  • #​5268 (thanks @​lahma) and #​5273: A durable listener now gives a message from a non-Wolverine producer, which has no Wolverine id, a stable envelope id derived from the broker's own identity for that message. A redelivery is then deduplicated by the durable inbox instead of being handled twice. This covers Kafka (topic, partition and offset), NATS JetStream, Pulsar, Redis Streams, Amazon SQS and GCP Pub/Sub pull subscriptions. On SQS and Pub/Sub it applies in every endpoint mode. #​5273 also makes raw JSON work on durable SQS listeners. A duplicate the durable inbox refuses is now logged at Information instead of as an error.
  • GH-5260 (#​5261): New opt-in WolverineHttpOptions.RejectUnparseableHeaderValues answers 400 with ProblemDetails when a [FromHeader] value can't be parsed.

Fixes

  • GH-5244 (#​5272): NServiceBus replies to Wolverine over Rabbit MQ now go to the queue marked UseForReplies(). Wolverine used to give NServiceBus its own wolverine.response.{guid} system queue as the reply address, which NServiceBus can't reach, so every reply ended up in NServiceBus's error queue.
  • GH-5247 (#​5248): DurabilityAgent.StopAsync() now cancels its in-flight durability command and waits for it to finish. Before, a command still running at shutdown could outlive the host and fail against a disposed data source.
  • GH-5253 (#​5256, thanks @​thomhurst): A leadership lock acquisition cancelled by node shutdown is no longer logged as an error.
  • GH-5254 (#​5265): Shutdown now waits for handlers still running on a buffered local queue.
  • GH-5257 (#​5266): Stopping a listener now interrupts an inline retry cooldown instead of waiting it out, and the retry doesn't run after the stop.
  • GH-5262 (#​5263): Lightweight EF Core handlers now collect domain events before their save, so the events are published atomically with it.
  • #​5245 (thanks @​ahyousif): Managed EF Core tenancy combined with WithDbContextAbstraction now reuses the tenant DbContext, so repository writes, the save and outbox enrollment all use one context. This could previously fail code generation.
  • #​5250 (thanks @​johnkaram02): A request that repeats a [FromHeader] header binds the comma-joined values instead of answering 500.
  • #​5252 (thanks @​johnkaram02) and #​5259: Additional error actions such as AndPauseProcessing() chained after ScheduleRetryIndefinitely() / RequeueIndefinitely() now apply, including to the open-ended attempts after the listed delays.

Dependencies

  • JasperFx 2.96.1 and JasperFx.RuntimeCompiler 5.0.1 (#​5258)
  • Weasel 9.47.1 (#​5269)

Docs and build

  • The Best Practices guide is rewritten (#​5270).
  • New docs for stable envelope ids from non-Wolverine producers, and for deduplicating CloudEvents (#​5273).
  • ./build.sh LocalGate runs every CI suite on one machine (GH-5125, #​5246). The CI suites are rebalanced to stay under the 20 minute job limit (#​5267), and the scaffold tests now pass on Windows (GH-5255, #​5264).

6.56.0

New

  • GH-5238 (#​5242): opts.UseHttpTransport() registers the HTTP transport inside UseWolverine(). http/https URIs then resolve in ListenForMessagesFrom(), PublishMessage<T>().To(uri), and runtime EndpointFor() / ToDestination(). Before this, the transport was only registered by ToHttpEndpoint(), and any other http URI failed with Unknown Transport scheme 'http'. /_wolverine/invoke now answers 415 instead of 500 for a content type with no registered serializer.

Fixes

  • GH-5235 (#​5239): Host shutdown now stops the durability metrics sweeper and waits for any query it has in flight before stores are disposed. Removing a durability agent also waits for its in-flight query. A metrics query could previously outlive IHost.StopAsync() and throw ObjectDisposedException against a disposed NpgsqlDataSource.
  • GH-5236 (#​5240): A Kafka listener with a durable inbox no longer crashes the process with a stack overflow when the inbox database is unavailable. DeferAsync() used to call back into the receiver inline, so the failed inbox write and the defer recursed. A deferred Kafka envelope now goes back to the receiver on its own task after a short pause, and only while the listener is running. After a stop or inbox-recovery pause, its uncommitted offset brings it back. Because Kafka has no native requeue, a Requeue error policy on a Kafka endpoint now redelivers after about one second instead of immediately.
  • GH-5237 (#​5241): A CloudEvents HTTP endpoint now fails a single-envelope send that the receiver rejects. It used to count the send as delivered, so a durable endpoint aimed at /_wolverine/invoke could delete an outgoing envelope that was never received. HTTP transport responses are now disposed.

6.55.1

Fixes

  • GH-5230 (#​5232): A database operation batch cancelled by Wolverine's own shutdown is no longer wrapped in DatabaseBatchCommandException and logged as an Error. Genuine SQL/connection failures are still reported.
  • GH-5231 (#​5233): An HttpEndpoint aimed at /_wolverine/invoke in its default (buffered) mode now delivers by posting each envelope individually, instead of receiving a 415 for every batch and retrying forever. /batch/{queue} and .SendInline() endpoints are unchanged.

6.55.0

Highlights

WolverineFx.Bobcat is out of alpha, on Bobcat 1.0.0 (#​5222, #​5229). Bobcat 1.0.0 shipped tonight, and WolverineFx.Bobcat and WolverineFx.Bobcat.EventModel now publish as stable 6.55.0 instead of -alpha.1. WolverineFx.Bobcat.Http stays 6.55.0-alpha.1 until Alba 9 ships stable, because a stable package cannot depend on Alba 9.0.0-rc.2. A spec project that write-specs generates with no --wolverine-version pins the stable WolverineFx.Bobcat (#​5222, #​5223).

MessageCausedBy names your handler (#​5224, #​5225). IWolverineObserver.MessageCausedBy reported the generated handler class (Internal.Generated.WolverineHandlers.StartTripHandler939323516). It now reports the handler you wrote (TripService.StartTripHandler), the same string as the message.handler span tag, resolved at codegen time. Code generated by an earlier version keeps working through the old overload.

CosmosDB sagas start with a conditional create (#​5221, thanks @​thechucklingatom). A second start message for an existing saga id used to silently overwrite the running saga. It now fails with the SagaConcurrencyException that Marten, Azure Blob and S3 already raise, so one OnException<SagaConcurrencyException>() policy covers every provider.

Fixes

  • GH-5217: ListeningAgent.StartAsync is serialized, and deliveries are deferred to a drained BufferedReceiver (#​5228)
  • GH-5218: an unresolvable tenant is treated as tenant-scoped on the single-envelope inbox write (#​5227)
  • GH-5220: Azure Service Bus listeners join their receive loop before disposing the CancellationTokenSource (#​5226)
  • GH-5215: reserved-word schema names are quoted in the remaining RDBMS and PostgreSQL SQL (#​5216, thanks @​marc-RocketRez)
  • GH-5213: a later pause supersedes an earlier pause's restart (#​5214)
  • GH-5209: the dead letter history table round-trips with no schema drift (#​5212)

Dependencies

  • JasperFx 2.96.0 (jasperfx#​1083: an Observed vs Derived Origin no longer raises a SourceDisagreement)
  • Weasel 9.47.0 (#​5219)
  • Bobcat 1.0.0

Full Changelog: JasperFx/wolverine@V6.54.0...V6.55.0

Commits viewable in compare view.

Updated WolverineFx.RuntimeCompilation from 6.54.0 to 6.60.0.

Release notes

Sourced from WolverineFx.RuntimeCompilation's releases.

6.60.0

What's Changed

Full Changelog: JasperFx/wolverine@V6.59.1...V6.60.0

6.59.1

This is a patch release with two fixes. Upgrading is a package bump only: there is no schema change and no API change.

SQL Server: the inbox and outbox seek on their indexes again

  • GH-5292 (#​5294): Several of the SQL Server message store's per-envelope statements were scanning the whole envelope table. That cost grows with the size of the inbox and outbox, and those statements run once per message. The cause was how two kinds of value were bound as parameters.
    • Envelope ids went out as sql_variant. The statements that mark envelopes as handled, reassign them, delete them and move them to the dead letter queue all filter on the envelope id. Weasel's generic command builder has no mapping for Guid, so it bound each id as DbType.Object, which SqlClient sends as sql_variant. SQL Server then had to compare CONVERT_IMPLICIT(sql_variant, [id]) on every row, which rules out a seek on the uniqueidentifier primary key. Ids are now bound as uniqueidentifier, so each statement is a primary key seek.
    • Envelope addresses went out as nvarchar. received_at on the inbox and destination on the outbox are varchar(250) columns, but statements that filter on them bound the address as nvarchar. Under a SQL collation such as SQL_Latin1_General_CP1_CI_AS, the default on Azure SQL, that converts the column and defeats the in...

Description has been truncated

Bumps Marten from 9.54.1 to 9.57.0
Bumps WolverineFx from 6.54.0 to 6.60.0
Bumps WolverineFx.Marten from 6.54.0 to 6.60.0
Bumps WolverineFx.RabbitMQ from 6.54.0 to 6.60.0
Bumps WolverineFx.RuntimeCompilation from 6.54.0 to 6.60.0

---
updated-dependencies:
- dependency-name: Marten
  dependency-version: 9.57.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: wolverine
- dependency-name: WolverineFx
  dependency-version: 6.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: wolverine
- dependency-name: WolverineFx.Marten
  dependency-version: 6.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: wolverine
- dependency-name: WolverineFx.RabbitMQ
  dependency-version: 6.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: wolverine
- dependency-name: WolverineFx.RuntimeCompilation
  dependency-version: 6.60.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: wolverine
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Nov 2, 2026
@github-actions
github-actions Bot enabled auto-merge November 2, 2026 20:20
@github-actions
github-actions Bot merged commit 8eabab8 into main Nov 2, 2026
10 checks passed
@dependabot
dependabot Bot deleted the dependabot/nuget/wolverine-dc3462ba6a branch November 2, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants