Bump the nuget-minor-patch group with 15 updates - #246
Open
dependabot[bot] wants to merge 1 commit into
Open
dependabot[bot] wants to merge 1 commit into
dependabot[bot] wants to merge 1 commit into
Conversation
Bumps AndreGoepel.Marten.Configuration from 1.2.3 to 1.2.4 Bumps AndreGoepel.Marten.Identity.Blazor from 2.0.2 to 2.1.0 Bumps AndreGoepel.Marten.Testing from 1.2.2 to 1.2.3 Bumps AndreGoepel.Testing.Bunit from 1.3.1 to 1.3.2 Bumps AndreGoepel.Testing.E2E from 1.3.1 to 1.3.2 Bumps Aspire.Hosting.Docker from 13.5.3 to 13.5.4 Bumps Aspire.Hosting.PostgreSQL from 13.5.3 to 13.5.4 Bumps Aspire.Hosting.Testing from 13.5.3 to 13.5.4 Bumps bunit from 2.10.3 to 2.11.3 Bumps Marten from 9.33.0 to 9.37.0 Bumps Microsoft.NET.Test.Sdk from 18.10.0 to 18.10.1 Bumps Quartz.Extensions.Hosting from 3.21.0 to 3.22.0 Bumps Radzen.Blazor from 11.3.2 to 11.4.1 Bumps WolverineFx.Marten from 6.36.0 to 6.39.0 Bumps xunit.v3 from 4.0.0 to 4.0.1 --- updated-dependencies: - dependency-name: AndreGoepel.Marten.Configuration dependency-version: 1.2.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: AndreGoepel.Marten.Identity.Blazor dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: AndreGoepel.Marten.Testing dependency-version: 1.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: AndreGoepel.Testing.Bunit dependency-version: 1.3.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: AndreGoepel.Testing.E2E dependency-version: 1.3.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Aspire.Hosting.Docker dependency-version: 13.5.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Aspire.Hosting.PostgreSQL dependency-version: 13.5.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Aspire.Hosting.Testing dependency-version: 13.5.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: bunit dependency-version: 2.11.3 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Marten dependency-version: 9.37.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Microsoft.NET.Test.Sdk dependency-version: 18.10.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch - dependency-name: Quartz.Extensions.Hosting dependency-version: 3.22.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: Radzen.Blazor dependency-version: 11.4.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: WolverineFx.Marten dependency-version: 6.39.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: nuget-minor-patch - dependency-name: xunit.v3 dependency-version: 4.0.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: nuget-minor-patch ... Signed-off-by: dependabot[bot] <support@github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updated AndreGoepel.Marten.Configuration from 1.2.3 to 1.2.4.
Release notes
Sourced from AndreGoepel.Marten.Configuration's releases.
1.2.4
What's Changed
Full Changelog: andregoepel/marten-configuration@v1.2.3...v1.2.4
Commits viewable in compare view.
Updated AndreGoepel.Marten.Identity.Blazor from 2.0.2 to 2.1.0.
Release notes
Sourced from AndreGoepel.Marten.Identity.Blazor's releases.
2.1.0
What's Changed
Full Changelog: andregoepel/marten-identity@v2.0.2...v2.1.0
Commits viewable in compare view.
Updated AndreGoepel.Marten.Testing from 1.2.2 to 1.2.3.
Release notes
Sourced from AndreGoepel.Marten.Testing's releases.
1.2.3
What's Changed
Full Changelog: andregoepel/marten-testing@v1.2.2...v1.2.3
Commits viewable in compare view.
Updated AndreGoepel.Testing.Bunit from 1.3.1 to 1.3.2.
Release notes
Sourced from AndreGoepel.Testing.Bunit's releases.
1.3.2
What's Changed
Full Changelog: andregoepel/testing@v1.3.1...v1.3.2
Commits viewable in compare view.
Updated AndreGoepel.Testing.E2E from 1.3.1 to 1.3.2.
Release notes
Sourced from AndreGoepel.Testing.E2E's releases.
1.3.2
What's Changed
Full Changelog: andregoepel/testing@v1.3.1...v1.3.2
Commits viewable in compare view.
Updated Aspire.Hosting.Docker from 13.5.3 to 13.5.4.
Release notes
Sourced from Aspire.Hosting.Docker's releases.
13.5.4
What's New in Aspire 13.5.4
Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates.
🐛 Fixes
📨 Kafka health checks leaked producers and polling threads — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes #20091. (#20094, backport of #20092, @davidfowl)
🌐 DevTunnels could fail when the region was selected automatically — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes #18790. (#19853, backport of #19230, @Vladipz)
☁️ Emulator-only AppHosts showed an unused Azure environment — The dashboard now hides the
azure-environmentresource when no Azure resources require cloud provisioning, instead of leaving it visible in Not started. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes #19617. (#19998, backport of #19843, @eerhardt)🧩 Starter app generation could alter unrelated JavaScript values — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to
localhost:URLs, preserving the original library files while still configuring the requested ports. Fixes #20030. (#20110, backport of #20031, @bart-vmware, @JamesNK)🍎 Updated the Aspire Homebrew cask for Homebrew 6.x — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. (#20119, backport of #19965, @askpt, @joperezr)
🧪 Radius cloud-provider callback interfaces now carry the experimental diagnostic —
IAwsRadiusProviderBuilderandIAzureRadiusProviderBuilderare now marked withASPIRERADIUS003, matching the existingWithAwsProviderandWithAzureProvidermethods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. (#19874, @sebastienros)Full Changelog: v13.5.3...v13.5.4
Full commit: 9c1b401dd67746739044f68959cbf4d3d7af93a6
Commits viewable in compare view.
Updated Aspire.Hosting.PostgreSQL from 13.5.3 to 13.5.4.
Release notes
Sourced from Aspire.Hosting.PostgreSQL's releases.
13.5.4
What's New in Aspire 13.5.4
Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates.
🐛 Fixes
📨 Kafka health checks leaked producers and polling threads — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes #20091. (#20094, backport of #20092, @davidfowl)
🌐 DevTunnels could fail when the region was selected automatically — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes #18790. (#19853, backport of #19230, @Vladipz)
☁️ Emulator-only AppHosts showed an unused Azure environment — The dashboard now hides the
azure-environmentresource when no Azure resources require cloud provisioning, instead of leaving it visible in Not started. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes #19617. (#19998, backport of #19843, @eerhardt)🧩 Starter app generation could alter unrelated JavaScript values — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to
localhost:URLs, preserving the original library files while still configuring the requested ports. Fixes #20030. (#20110, backport of #20031, @bart-vmware, @JamesNK)🍎 Updated the Aspire Homebrew cask for Homebrew 6.x — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. (#20119, backport of #19965, @askpt, @joperezr)
🧪 Radius cloud-provider callback interfaces now carry the experimental diagnostic —
IAwsRadiusProviderBuilderandIAzureRadiusProviderBuilderare now marked withASPIRERADIUS003, matching the existingWithAwsProviderandWithAzureProvidermethods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. (#19874, @sebastienros)Full Changelog: v13.5.3...v13.5.4
Full commit: 9c1b401dd67746739044f68959cbf4d3d7af93a6
Commits viewable in compare view.
Updated Aspire.Hosting.Testing from 13.5.3 to 13.5.4.
Release notes
Sourced from Aspire.Hosting.Testing's releases.
13.5.4
What's New in Aspire 13.5.4
Patch release for Aspire 13.5 that fixes Kafka health-check resource leaks, DevTunnel errors with automatically selected regions, misleading Azure emulator dashboard entries, and unintended changes to generated starter apps, plus Homebrew compatibility and Radius API diagnostic updates.
🐛 Fixes
📨 Kafka health checks leaked producers and polling threads — Each AppHost health-check execution created a new Kafka producer without disposing it, accumulating background threads over time. Health checks now reuse a producer per Kafka resource and dispose it with the AppHost, while keeping multiple Kafka resources independently configured. Fixes #20091. (#20094, backport of #20092, @davidfowl)
🌐 DevTunnels could fail when the region was selected automatically — Tunnel setup and health checks now use the cluster-qualified tunnel ID returned by the DevTunnel CLI for port operations and access queries. This fixes failures when a bare tunnel ID cannot be resolved for those operations. Regression introduced in 13.3. Fixes #18790. (#19853, backport of #19230, @Vladipz)
☁️ Emulator-only AppHosts showed an unused Azure environment — The dashboard now hides the
azure-environmentresource when no Azure resources require cloud provisioning, instead of leaving it visible in Not started. It remains visible for apps that combine local emulators with resources requiring Azure provisioning. No AppHost changes are needed. Fixes #19617. (#19998, backport of #19843, @eerhardt)🧩 Starter app generation could alter unrelated JavaScript values — Dynamic port replacement could also replace matching numeric literals in bundled JavaScript, including Bootstrap timing values. Port substitutions are now restricted to
localhost:URLs, preserving the original library files while still configuring the requested ports. Fixes #20030. (#20110, backport of #20031, @bart-vmware, @JamesNK)🍎 Updated the Aspire Homebrew cask for Homebrew 6.x — Replaced deprecated cask URL and post-install syntax with the supported equivalents, resolving compatibility issues with current Homebrew while preserving install-channel metadata. (#20119, backport of #19965, @askpt, @joperezr)
🧪 Radius cloud-provider callback interfaces now carry the experimental diagnostic —
IAwsRadiusProviderBuilderandIAzureRadiusProviderBuilderare now marked withASPIRERADIUS003, matching the existingWithAwsProviderandWithAzureProvidermethods. Code referencing these interfaces directly must now acknowledge the same experimental API diagnostic. (#19874, @sebastienros)Full Changelog: v13.5.3...v13.5.4
Full commit: 9c1b401dd67746739044f68959cbf4d3d7af93a6
Commits viewable in compare view.
Updated bunit from 2.10.3 to 2.11.3.
Release notes
Sourced from bunit's releases.
2.11.3
Fixed
InvokeOnSpacerBeforeVisiblenow uses 4 parameters on .NET 11.0. Reported by @vnbaaij in #1915. Fixed by @vnbaaij in #1919.InvalidOperationException: Nullable object must have a value. Reported by @calebcwells in #1920. Fixed by @linkdotnet.Commits viewable in compare view.
Updated Marten from 9.33.0 to 9.37.0.
Release notes
Sourced from Marten's releases.
9.37.0
Eighteen commits, and almost all of them are
Marten.PgVectorcorrectness — found by auditing the search surface 9.36.0 had just shipped. Every one of these was silent: a plausible answer, in a plausible order, that was wrong.Vector and hybrid search returned the wrong rows
Cosinerather than the metric the index declared, so anL2index was searched by cosine and silently fell back to a sequential scanhnsw.ef_search(default 40) — so it under-returned however large thelimitT, never the concrete subtypeto_tsvectorwhen no index matched theregConfigVectorProjectionwrote the wrong rowsid, so the later tenant's write replaced the earlier one'sForTenant(...)appends landed in the wrong tenantGuid.Emptyon string-identified streamsSearches now run through the session (#5421, #5423)
The session's connection, transaction, command timeout, resilience pipeline and
IMartenSessionLogger. A search on a session inside a caller-managed transaction now sees that session's uncommitted writes, the wayQuery<T>()does.SET LOCALstill cannot leak onto a pooled connection.VectorSearchAsync,VectorSearchWithScoresAsyncandVectorProjectionSearchAsyncgainCancellationTokenoverloads. Overloads rather than defaulted parameters: an optional argument is compiled into the caller, so widening a shipped signature breaks every assembly that has not been rebuilt.ColumnWeightsis refused, not ignored (#5446)HybridSearchOptionsgained per-column weights for the text leg (jasperfx#854, JasperFx 2.72.0). Marten weights at index time throughWeightedFullTextIndex, so there is nothing a per-call weight could apply to — and it is refused by name rather than ignored, because a caller who weights a title column and silently gets an unweighted ranking has no way to find out.Timestamps and the explorer
#5379 —⚠️ Only patching was affected — an ordinary
mt_last_modifiedno longer jumps by the server's UTC offset when a document is patched.now() at time zone 'utc'strips the offset, and the naive result is re-read in the session'sTimeZone: on a UTC+2 database the stored instant was two hours in the past.Store/SaveChangestakes the column default, which was always correct.#5430 (thanks @erikshafer) covers the event half of the same defect, reached through stream compaction, which #5445 fixed and left untested — and its assertions run over two time zones in both directions, where a one-sided bound passes against a negative offset.
#5383 — database-scoped explorer reads, honest store-global reads, and two tenant-scoping defects.
On JasperFx 2.72.0.
9.36.0
Takes
Marten.PgVectorfrom a vector search that could not be indexed and could not be called portably, to one that shares theJasperFx.Events.Vectorscontracts with Fisher and Polecat, can be served by an HNSW index, returns scores, and fuses with full text.VectorIndex— declare an HNSW index for a vector searchts_rankleg and the vector leg#5413 deleted that package's own
IEmbeddingProviderandDistanceFunctionin favour of the shared ones, and removed the deadVectorOn/PgVectorOptionsregistry, which had no references anywhere including the tests. ThePgvector.Vectoroverload ofVectorSearchAsyncwas kept and forwards, so the common call site is source-compatible.Minor rather than major because the whole package family shares one version and Marten itself has no break in this range — a major bump would move every other package for an extension package's API.
The search surface shipped here was audited immediately afterwards, and ten silent defects came out of it — searches that skipped Marten's default filters and returned soft-deleted rows, a distance metric that defaulted to
Cosinerather than the one the index declared, an indexed search capped at 40 rows byhnsw.ef_search, aVectorProjectionthat ignored conjoined tenancy, and more. Every one of them returned a plausible answer in a plausible order.All of them are fixed in 9.37.0. If you are picking up
Marten.PgVectorfor the first time, start there rather than here.On the tag. This points at
daeb27b5, not at the "Release 9.36.0" commitbaf1fc3f. The publish dispatch from the release commit was cancelled, and the run that actually pushed the packages went fromdaeb27b5— one commit later, carrying #5417. The tag names what shipped.9.35.0
Marten 9.35.0 — Event Model naming, store identity, and idempotent archiving.
Three, all deliberate. None require a code change to adopt, but each changes what an existing application observes.
1. A store's derived Event Model is now named after your service, not
"EventModel"(#5408).The store-derived Event Model source fell back to the literal
"EventModel"— the one default guaranteed to be wrong for every host. Wolverine names its derived model afterJasperFxOptions.ServiceName, and so does Bobcat's spec assembly, so the common case (Wolverine + one Marten store) assembled two models out of the box and had to restate a name it had already declared.The fallback is now the service name. An explicit name still wins:
If you were relying on the model being called
EventModel, setopts.EventModelName = "EventModel"explicitly.2. The primary store's
Subjectnow followsStoreName(#5409).Subjectwas a literalmarten://mainthat ignoredStoreOptions.StoreName, whileIdentityhad always been built from it — so naming a primary store moved one and left the other behind, andSubjectis the one consumers key on. Both are now built fromStoreName. Tooling that keys onstore.Subject(CritterWatch's explorer reads and shard progression ids among them) will seemarten://{storename}for a named store where it previously sawmarten://main.A store name is user-supplied text and a uri host is not, so names are sanitized:
My Storewould otherwise throwUriFormatExceptionanda/bwould silently parse its tail as a path. Ordinary names are unchanged.3. Archiving an already-archived stream is a no-op instead of an error (#5403).
Under
UseArchivedStreamPartitioning, a second archive of the same stream raised23505onmt_streams_archived_pkey. This also stalled async single-stream projections withIncludeArchivedEvents = truewhen they processed anArchivedmarker after an inline snapshot had already archived the stream. Repeated archiving now succeeds and does nothing.A genuine collision is still reported: a different active stream reusing an archived stream id still fails, rather than being silently swallowed and losing its metadata.
Fixes and improvements
StoreOptions.EventModelName. A host that calledAddEventModel("Something", …)assembled two models: its own, and one the store contributed under the default name. The name is configured onStoreOptionsand read lazily when the model is assembled, soAddEventModelmay be called before or afterAddMarten.BuildStoreOptionsassignedStoreNameboth before and after theIConfigureMarten<T>chain, so a contribution that named the store was silently reverted to the marker type's name.is_archivedis the list partition key on bothmt_streamsandmt_events, the archive function's new predicates also let PostgreSQL prune to the active partition, where the previous statements had to consider both.ImHashMapkeyed byFrame, which does not overrideGetHashCode, meant statement order followed identity hash codes and varied per process. Every Event Model slice also now carries the store it came from, so two stores projecting a document of the same simple name leave a recorded disagreement rather than one silently winning (jasperfx#836).Compatibility
Binary compatible with 9.34.0. The public
AddMarten/AddMartenStore<T>surface is unchanged — verified by diffing the extracted signature list against the 9.34.0 tag. New configuration is additive onStoreOptions.9.34.0
Native AOT support for event-sourced applications, and a round of integrity fixes to the diagnostics and monitoring surface — including one deliberate behaviour change worth reading before upgrading.
Native AOT
Event-sourced applications now run under Native AOT.
Utf8JsonWriterinstead of round-tripping through the consumer's serializer, removing a reflection-dependent path from AOT reads.Diagnostics and monitoring
Three fixes to the event store explorer and projection-status APIs. All three are cases where a monitoring read returned something misleading, or changed the system it was observing.
#5400 — Behaviour change. The four explorer read APIs no longer provision anything. They resolved their database through
ITenancy.FindOrCreateDatabase, and two tenancy models take the "or create" half literally:ShardedTenancyassigned an unknown tenant to a shard and ran partition + per-tenant sequence DDL for it, andSingleServerMultiTenancyissuedCREATE DATABASEfor a database named after the id. A console polling a retired or mistyped tenant id therefore brought that tenant — or a whole database — into existence.An unrecognized tenant id now throws
UnknownTenantIdException, which is whatStaticMultiTenancyandMasterTableTenancyalready did, so the explorer answers the same way across every tenancy model. Adds the publicITenancy.TryFindDatabase, a read-only counterpart toFindOrCreateDatabase; it is a default interface member, so customITenancyimplementations keep working unchanged.FindOrCreateDatabaseitself is untouched — create-on-demand remains its documented job for real tenant traffic.If you call
GetRecentStreamsAsync,ReadStreamAsync,QueryByTagsAsyncorGetProjectionStatusesAsyncwith a tenant id that may not exist, it now throws where it previously succeeded.#5382 —
GetProjectionStatusesAsync(ct)threwNotSupportedExceptionon a database-per-tenant store, because a tenant-less call has no default tenant to open a session against. It now answers from the projection registry, so "is this projection still registered?" — the only store-agnostic way to ask, and what orphan detection is built on — works on the store shape that most needs it.Note the original issue reported that both overloads threw. Only the tenant-less one did; passing a tenant id or a database identifier from
AllDatabases()has always worked and reads real per-database progression.#5396 —
ShardStatus.Statereports the state of a reachable daemon instead of always answeringUnknown.Unknownnow means what it is documented to mean: there is no daemon here to ask.Correctness
IVersionedmarker interface. Thanks to @JurJean for the report and the original fix.[JsonStringEnumMemberName]/[EnumMember]names are honored in LINQ translation rather than the CLR member name being assumed.byte[], and its limits are documented. Thanks to @erdtsieck.Event modeling
ProjectionEventModelSourceis registered fromAddMartenandAddMartenStore<T>, so Event Model views resolve from a Marten store without manual wiring.pgvector
Docs and internals
PrefixSearchand the session-level full-text search shortcuts.GuidOptimisticConcurrencyCompliancein the shared compliance suite.Dependencies
... (truncated)
Commits viewable in compare view.
Updated Microsoft.NET.Test.Sdk from 18.10.0 to 18.10.1.
Release notes
Sourced from Microsoft.NET.Test.Sdk's releases.
18.10.1
What's Changed
Full Changelog: microsoft/vstest@v18.10.0...v18.10.1
Commits viewable in compare view.
Updated Quartz.Extensions.Hosting from 3.21.0 to 3.22.0.
Release notes
Sourced from Quartz.Extensions.Hosting's releases.
3.22.0
Quartz.NET 3.22.0 carries three fixes to the persistent store's recovery and clustering paths, each found on the 4.0 line and ported here. One of them adds a setting the store never had — a timeout on the statements it issues — which is the public-surface addition that makes this a minor rather than a patch. The schema is 3.20's. Two of the changes alter behaviour, each marked Behavior change worth noting below.
What changed
AddJob/AddTriggerand the store already holds them. The declared trigger was applied as a reschedule, which went throughReplaceTriggerand deleted every fired-trigger row of the key — beforeStart(), so by the time the first cluster check-in or the non-clustered sweep looked for the interrupted execution, its row was gone. A replacement is not a removal:ReplaceTriggernow deletes the trigger row only, and unscheduling still takes the fired rows with it. The replacement of a trigger whose job disallows concurrent execution is storedBLOCKEDbehind an execution still in flight, as any trigger of that job is, where it used to be storedWAITINGand could fire alongside. A fast restart under a stable instance id had a second defect: on its first check-in a node handed its own state row to recovery, and the deferral grace period judged that row by its old timestamp, so theEXECUTINGrow of a serial job was preserved for a second detection that never came — the node's own record is never deferred now. (#3759, port of e60bd26eeb)BLOCKEDwhile an execution is in flight.quartz.jobStore.commandTimeoutbounds every statement the store issues, the lock statement included. A row lock belongs to the database session that took it, so a node that loses its network without the server noticing keepsTRIGGER_ACCESSlocked, and every other node's next lock statement queues behind that dead session — and nothing on this branch bounded the wait: the statement never failed, so the lock handler's retries,DbRetryIntervalback-off and theSchedulerErrornotification never ran, and the cluster stopped firing without logging anything (#3763). The setting is a millisecond count like every other duration on the store;0means the provider's own default (30 seconds for most), a negative value is refused where it is configured, and a value past what ADO.NET can hold in whole seconds is refused for the same reason. It is rounded up to whole seconds, because rounding down would turn a sub-second value into "wait forever". It reaches the driver delegate throughDelegateInitializationArgsand the lock handler throughDBSemaphore.CommandTimeout, which the store writes once its handler is known — so a handler named byquartz.jobStore.lockHandler.typeis bounded too. An unconfigured store imposes nothing.SchedulerBuilder's persistent-store options set it fluently. The troubleshooting page gains the dead-session case: how to tell it apart in each database, why killing a process does not reproduce it, and the server-side settings that are the only thing that frees the lock. 4.x has the same setting asJobStore:CommandTimeout. (#3764, #3765)DbRetryInterval, also 15 s, so a check-in that failed at 7.5 s was next attempted after the peers had already recovered the node: its fired-trigger rows deleted, its recovering jobs fired again,[DisallowConcurrentExecution]no longer holding. Java Quartz sleeps the same way, so this is inherited rather than a regression. While the window is still open a failed check-in is now retried inside it — half of what is left each time, never later thanDbRetryInterval, never sooner than the loop's pause — and only once it has closed does the ordinary back-off apply. The manager times the window from its own record of the last check-in that reached the database, not from the store'sLastCheckin, which a failed read also stamps. Defaults and the 15-second failover latency are unchanged, andthreshold >= DbRetryIntervalis no longer a relation an operator has to know about. The configuration reference'sclusterCheckinIntervaldefault (7500, not 15000) and the missingclusterCheckinMisfireThresholdrow were fixed on the way. (port of a5b2197e5d)DbRetryIntervalwhile the peers' window is still open.Public API — additive only
JobStoreSupport.CommandTimeout,DBSemaphore.CommandTimeout,AdoUtil.CommandTimeout,DelegateInitializationArgs.CommandTimeout,SchedulerBuilder.PersistentStoreOptions.CommandTimeout— the one setting, wherever a statement is prepared.Upgrading
dotnet add package Quartz --version 3.22.0. Nothing to migrate; the schema is unchanged. The 4.x line is the current major and carries all three fixes as well; the 4.x migration guide is the way there.Full changelog: quartznet/quartznet@v3.21.0...v3.22.0
Commits viewable in compare view.
Updated Radzen.Blazor from 11.3.2 to 11.4.1.
Release notes
Sourced from Radzen.Blazor's releases.
11.4.1
11.4.1 - 2026-09-17
Improvements
Fixes
11.4.0
11.4.0 - 2026-09-14
Improvements
Fixes
Commits viewable in compare view.
Updated WolverineFx.Marten from 6.36.0 to 6.39.0.
Release notes
Sourced from WolverineFx.Marten's releases.
6.39.0
Two themes in this release: multi-tenancy correctness and modular monolith ergonomics, plus a health-signal fix that will quiet a lot of false alerts.
Declare a module's ancillary store once
Modular monoliths on ancillary stores had to repeat
[Storage(typeof(IOrdersStore))]on every handler, endpoint and service in a module -- restating on each type a fact that belongs to the module, where missing one meant quietly committing to the wrong database.That covers message handlers, HTTP endpoints and gRPC services in that assembly, for Marten, Polecat and Fisher alike. An explicit
[Storage]on a type still wins, so one handler can opt out of its module's default.For gRPC this is not an ergonomic win but the only thing that works: the gRPC chains never apply chain-modifying attributes, so
[Storage]on a gRPC service compiles, looks right, and does nothing. (#4477)The stuck-poller health check was mostly crying wolf
This was for CritterWatch
The scheduled-job "poller is stuck" signal counted every scheduled envelope, whether or not it was due yet. A queue holding messages that are not due is a queue doing its job -- so any deliberate delay longer than the check window reported the poller as stuck, and stayed that way. Ordinary retry scheduling has the same shape, which means the signal grew with correct usage.
Measured on a production fleet of 512 sharded message databases: 254 of 271 active alerts -- 94% -- were this one check, across 265 databases. 114 of those were "degraded" over a single envelope scheduled 15 minutes out by an application deliberately waiting for a quiet period.
PersistedCounts.ScheduledDuenow counts only envelopes already past their execution time, and the health signal reads that instead. It is anint?, and null means not measured rather than zero: a store that does not report it makes the signal stand down rather than falling back to the undifferentiated count, because falling back is the defect. PostgreSQL implements it as aFILTERon the existing scan, so the due count costs no extra query; the other providers report null and are simply silent here for now. (#4476)Tenant message stores were sharing an identity
IMessageStore.Nameis a tenant routing cache key, so two tenant stores answering to the same name send one tenant's messages to the other tenant's database.If you run multi-tenanted durable messaging on any of these three, this release is worth taking.
RabbitMQ virtual-host tenants never got publisher confirms
ConfigureChannelCreation(...)reached only the parent transport's channels. Every virtual-host tenant created its channels withPublisherConfirmationsEnabledandPublisherConfirmationTrackingEnabledfalse regardless, with no public way to set them per tenant.That matters more than a missing option: without confirmation tracking,
BasicPublishAsyncreturns before the broker can refuse the publish, so the sending agent counts it successful and deletes the envelope from the durable outbox. A refused publish -- anACCESS_REFUSEDafter a vhost user loses write permission, say -- silently drops a message whose enrolling transaction has already committed.Behaviour change worth knowing about: if you call
ConfigureChannelCreationand have tenants configured, your tenant channels now get confirms andConsumerDispatchConcurrencywhere they previously got neither. Publishing to tenant vhosts gets slower, correctly so.Thanks to @outofrange-consulting for a report that arrived with a measurement table and the fix already located. (#4473)
Ancillary-only hosts picked the wrong persistence strategy
A host registering only an ancillary store through
IntegrateWithWolverine<T>registered no codegen extension, so[Entity]and storage-action code silently read an empty in-memory dictionary. Fixed for Marten (#4464), Polecat (#4465) and Fisher (#4466).Scheduled messages promoted from RavenDb and CosmosDb lost their store
... (truncated)
6.38.0
Eight issues, no breaking changes.
This is a correctness and operability release. Most of it is one shape of bug — something resolved against the wrong scope, which looked right only because two defaults usually coincide — plus the two remaining halves of recurring-schedule operability.
Multi-store and multi-tenancy
The multi-tenanted message store no longer swallows batch failures (#4435). A durable batch spanning several tenants was split across stores, but
RetryBlocknever rethrows — so a store that refused its share failed silently while the receiver acknowledged the whole batch. Messages no store had accepted were acked and lost. The batch is now split by the resolved store and a failure propagates.Natural keys resolve through the store the chain is routed to (#4439).
Identity types resolve through the store the chain is routed to (#4441).
These two are a matched pair: a saga's natural key and its identity type are facts about the store, not about the application. A modular monolith with an ancillary store per module resolved both against the main store, so a saga in module B was looked up with module A's rules.
A Wolverine service name reaches JasperFx, so the Event Model canvas stays whole (#4448).
WolverineOptions.ServiceNameandJasperFxOptions.ServiceNameboth name the one running service, but the value only ever travelled one way — so the documented way to name a Wolverine service left the JasperFx side on its default, the entry assembly name. The visible damage was an Event Model canvas splitting in two: Wolverine's source named its model one thing, a store's source named it another, and neither canvas held both halves. It only ever looked correct when a host's assembly name and service name happened to coincide, which is exactly why no test caught it.Recurring schedules
The remaining core operability gaps from #4437, which is closed by these two. (Durable last-run state, #4447, stays closed as not-planned: run state lives in OpenTelemetry, and the operability view belongs in CritterWatch.)
Non-UTC recurring schedules now record their tracking row (#4436). Cronos returns each occurrence carrying the schedule's offset, and Npgsql's
timestamptzbinder refuses any non-zero offset — so every tick of every zoned schedule threw on the bookkeeping write. Delivery was never affected; only the tracking row was missing. Normalizing inRecurringMessageRecord'sinitaccessors fixes it in one place for all four relational providers.Occurrences carry their schedule and their firing instant (#4445). The schedule name already reached the handler span. The occurrence instant did not:
ScheduledTimeis cleared by the scheduled machinery at fire time, so a handler could only learn which firing it was serving by string-parsing the deduplication id. Occurrences now carry arecurring-occurrenceheader, surfaced as thewolverine.schedule.occurrencetrace tag.Metrics also gained a
schedule.nametag, so the success, failure and effective-time counters can finally be sliced per cron job. It is read off the envelope header rather than set locally, because the metric tag list is never serialized — an occurrence published on one node and handled on another would otherwise reach the counters with no attribution at all. The occurrence instant is deliberately trace-only: one distinct value per firing would make those series unbounded in cardinality.IRecurringScheduleControl.TriggerAsyncruns a schedule once, on demand (#4446). Previously an operator's only option was hand-publishing the message type out of band, which bypasses the occurrence and deduplication machinery entirely. The request is recorded on the schedule's durable tracking row and the agent publishes one occurrence for it on its next pass, so it works from any node — the same reason pause already goes through the store.A manual run carries its own deduplication id, so a "run now" issued in the same instant as a scheduled firing is never silently collapsed into it. Triggering a paused schedule is refused: pausing says the schedule must not fire. A trigger is extra rather than a replacement — it leaves the cron cadence and the pending occurrence untouched, and it fires even for a fixed-date schedule whose occurrences have run out.
gRPC
[WolverineGrpcService]on the interface (#4396). A contract you do not own — or one carrying only[ServiceContract]— could not be registered at all.AddWolverineGrpc(grpc => grpc.IncludeCodeFirstContract<IMyService>())now registers it explicitly. Thanks to @erikshafer for the PR.6.37.0
Eight issues, one of them breaking.
ServiceCapabilities.EventModelis now anEventModelSetDescriptorrather than a singleEventModelDescriptor(#4424). A host can legitimately assemble several Event Models — each store names its own throughStoreOptions.EventModelName, and a modular monolith registers an ancillary store per module — and the export used to fold them all into one named for the service, losing a model's name outright and reporting nothing.This is a compile break for anything reading that property, and the capabilities wire shape changes with it. A consumer that can only render one model asks
.Sole, or folds explicitly with.Collapse()and gets aModelCollapsehotspot recording what it lost. CritterWatch consumes this shape and has the equivalent fold still to follow.Everything else in the public surface is additive.
Event Modeling
FinishModelcarried a private copy of the cross-slice join; it is re-based onEventModelDescriptor.Links, so the pattern Wolverine derives and the arrow a viewer draws cannot disagree. A slice triggered by another slice's event throughTriggerType— not onlyCommandType— is now classified too.ReadsFromis split out ofReadModelTypes(#4419).[ReadModel]and[Entity]parameters are things a slice reads;IStorageAction<T>returns are what it produces. They shared one list, which meant the Automation input edge — Event → Read Model → ⚙ Command — could not be drawn at all.Origin(#4425). Wolverine registers two sources on theDerivedrung, so a disagreement between them used to render asDerived claims X; Derived claims Y, naming neither file. It now readsevent-model://wolverineagainstevent-model://wolverine-http.Native AOT
codegen writeemits its own[DynamicDependency]rooting (#4426). Every Native AOT application had to hand-write a rooting block covering the generated registry, every generated handler, every handler class, every message type, andMessageRouter<T>/EmptyMessageRouter<T>closed over each one. Codegen now emits anAotRootscompanion anchored by[ModuleInitializer]— an unconditional ILC root — so there is no app-side code at all. Verified by a realPublishAotbinary booting and dispatching with the hand-written roots deleted.Bug fixes
Envelope.Storedoes not survive persistence, so the acknowledgement fell back to the main store — the ancillary row survived, and the message was recovered, sent and handled again on every restart. Thanks to @raypet-visma for the diagnosis and the fix sketch._consumer.Close()is a synchronous P/Invoke that can block forever against a degraded broker, soIHost.StopAsyncnever completed — observed wedged 20+ minutes, past bothDrainTimeoutandShutdownTimeout. It now runs under the drain budget on a dedicated thread, and an abandoned teardown suppresses the consumerDisposerather than destroying a handle another thread still owns.OnExceptionreturningOutgoingMessagescompiles again (#4416). It failed code generation with "Frame chain is being re-arranged" while the same method on a middleware class worked. Thanks to @uniquelau for the report and for locating the exact divergence. The error-handling docs gained an example of using the hook to publish messages when the original message fails.Build & dependencies
codegen writeoutput is regenerated and aCICodegenDriftgate now guards it — meaningful only now that the emitted statement order is deterministic. Regenerating surfaced real staleness rather than the expected reordering: six orphaned handler files and four missing registry files.Commits viewable in compare view.
Updated xunit.v3 from 4.0.0 to 4.0.1.
Release notes
Sourced from xunit.v3's releases.
No release notes found for this version range.
Commits viewable in compare view.
Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting
@dependabot rebase.Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR:
@dependabot rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore <dependency name> major versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)@dependabot ignore <dependency name> minor versionwill close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)@dependabot ignore <dependency name>will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)@dependabot unignore <dependency name>will remove all of the ignore conditions of the specified dependency@dependabot unignore <dependency name> <ignore condition>will remove the ignore condition of the specified dependency and ignore conditions