Releases: JasperFx/marten
V9.7.3
Small release. Couple fixes for daemon resiliency and CritterWatch administration actions
What's Changed
- Fix #4720 — adaptive EventLoader timeout fallback was unreachable by @jeremydmiller in #4722
- Bump JasperFx.* packages to 2.9.8 by @jeremydmiller in #4724
- Bump JasperFx.* to 2.9.9 — composite rebuild deadlock fix (#4721) by @jeremydmiller in #4725
Full Changelog: V9.7.2...V9.7.3
V9.7.2
What's Changed
- Fix #4713 — idempotent re-apply of per-tenant LIST partitions (consume Weasel 9.1.5) by @jeremydmiller in #4716
- Bump shell-quote from 1.8.2 to 1.8.4 by @dependabot[bot] in #4715
- #4712 + #4717 — per-tenant partitioning daemon: safe-harbor high-water + per-tenant progression (JasperFx 2.9.4) by @jeremydmiller in #4714
- Bump JasperFx 2.9.5 → 2.9.6 by @jeremydmiller in #4719
Full Changelog: V9.7.1...V9.7.2
V9.7.1
What's Changed
- Re-worked the mechanics of IEventStreamInstrumentation by @jeremydmiller in #4703
- #4679 — composite catch-up guard + unskip fixture (root cause fixed in JasperFx.Events 2.9.0) by @jeremydmiller in #4704
- Fix #4705 — composite projection shards stall at seq 1 under per-tenant event partitioning by @jeremydmiller in #4707
- feat(events): populate ProjectionErrors / ProjectionRebuildErrors on TryCreateUsage by @jeremydmiller in #4708
- Fix #4706 — managed partitioned tables destructively rebuilt on sharded redeploy by @jeremydmiller in #4709
Full Changelog: V9.7.0...V9.7.1
V9.7.0
There's a few bug fixes, and the new functionality is really for CritterWatch.
What's Changed
- #4677 follow-up — object-projection aggregates + post-SelectMany Select/Where by @jeremydmiller in #4678
- Bump JasperFx.* 2.8.2 → 2.9.0 by @jeremydmiller in #4688
- Fix #4681 — centralize high-water progression-row identity in a Marten helper by @jeremydmiller in #4689
- Fix #4686 — implement IEventStoreInstrumentation on EventGraph by @jeremydmiller in #4690
- #4684 Phase E.1 — per-period throughput sampling + Npgsql round-trip counting by @jeremydmiller in #4691
- #4684 Phase E.2 — progression lock-wait sampler by @jeremydmiller in #4692
- Fix #4680 — upcaster shadowed when source type is typed-appended in same DocumentStore by @jeremydmiller in #4694
- Fix #4683 (fixes 1+2) — drop per-tenant sequence + progression rows on tenant removal by @jeremydmiller in #4695
- #4683 Fix 3 — dropcycle subcommand exercises drop-tenant cleanup end-to-end by @jeremydmiller in #4696
- #4685 PR 1 — ProjectionUpdateBatch insert-only flush-mode plumbing by @jeremydmiller in #4697
- #4679 — Skipped reproduction fixture for catchUpPerTenantAsync 23505 regression by @jeremydmiller in #4698
- Bump JasperFx packages to 2.9.1 by @jeremydmiller in #4702
- #4679 — sharded multi-tenant-per-shard catch-up regression guard by @jeremydmiller in #4701
Full Changelog: V9.6.0...V9.7.0
V9.6.0
There's a couple tenant aware APIs that are new, so this had to be a minor point bump. The majority of the work in this release was stress testing projection rebuilds and ensuring there was never any concurrent access of un-thread safe dictionaries inside of the async daemon that happened as a side effect of 9.0 changes.
What's Changed
- Bump version from 9.5.2 to 9.5.3 by @erdtsieck in #4662
- Bump Weasel.Postgresql + Weasel.EntityFrameworkCore 9.0.2 → 9.0.3 by @jeremydmiller in #4664
- #4667 Phase 1 — write-path *Projected variants bypass session-shared trackers by @jeremydmiller in #4669
- #4667 Phase 2 — read-path LoadProjectedAsync bypasses session-shared trackers by @jeremydmiller in #4670
- #4667 Phase 3 — ProjectionDocumentSession routes user-code LoadAsync through projection-safe path by @jeremydmiller in #4671
- #4666 Phase A — Marten.ScaleTesting CLI + event seeder by @jeremydmiller in #4672
- #4668 — tenant-aware RebuildSingleStreamAsync overloads on AdvancedOperations by @jeremydmiller in #4674
- #4665 — bump JasperFx 2.8.0 → 2.8.2 + CatchUpAsync per-tenant repro test by @jeremydmiller in #4673
- #4666 Phase B — TelehealthComposite 4+2+2 + rebuild subcommand by @jeremydmiller in #4675
- #4666 Phase C — validate + stress subcommands by @jeremydmiller in #4676
Full Changelog: V9.5.3...V9.6.0
V9.5.3
This is a little optimization to the new 9.* code that eliminated the runtime codegen, and a fix for the daemon being a little vulnerable to concurrency in its internals -- which is also an optimization here.
What's Changed
- Fix #4657: bypass session VersionTracker from projection StoreProjection (async daemon race) by @jeremydmiller in #4658
- #4659 Phase 1 — eliminate ConcurrencyMode runtime branches via type splits in closed-shape by @jeremydmiller in #4660
- #4659 Phase 2 — hierarchy selector split eliminates last per-row branch by @jeremydmiller in #4661
Full Changelog: 9.5.2...V9.5.3
9.5.2
Bug fixes
- #4619 (#4632) —
mt_archive_streamemits explicit column lists in its INSERT…SELECT, survivingALTER TABLE ADD COLUMNmigrations that reorder the physical column layout (previously failed with42804after a column was added tomt_events). - #4625 (#4633) —
BulkInsertEventsAsyncwritesmt_streams.typefrom theStreamAction'sAggregateType, restoringUseMandatoryStreamTypeDeclarationsupport on the bulk path. - #4641 (#4646) —
AddMartenManagedTenantsAsyncno longer leaves a half-installed schema underAutoCreate.None. The admin call eagerly applies the events feature via a per-featureCreateMigrationAsync+ scopedCreateOrUpdateapply, so the next append succeeds end-to-end on a virgin schema (previously failed with42P01/42883). - #4645 (#4647) — DCB non-HStore tag query JOIN now includes
e.tenant_id = t.tenant_id, eliminating own-event duplication under per-tenant sequences withUseTenantPartitionedEvents.
Test coverage
- #4617 closed — full
TenantPartitionedEventsTestsproject (~170 tests across 50 files) covering append / read / projections / admin / DCB / async daemon / regressions underUseTenantPartitionedEvents. - Three projection coverage gaps closed: #4650 (
FlatTableProjection), #4651 (DetermineActionAsync), #4652 (doc-tables-NOT-partitioned-by-default invariant). - #4649 investigated and pinned as documented intentional asymmetry —
AutoCreate.CreateOnlycontinues to work via the lazy schema-apply path, by design (no SUT change needed).
Known follow-up — NOT in this release
- #4648 —
AddGlobalProjection × UseTenantPartitionedEventsfailsMT002because the global event decorator writes to the*DEFAULT*tenant slot, which can't be a Postgres partition suffix. Test pin is in master asserting the throw; the underlying fix requires either routing global-aggregate events through a sibling non-partitioned table or reserving a default-tenant partition suffix. Marked as an enhancement, deferred to a later release.
🤖 Release notes assembled with Claude Code
V9.5.1
What's Changed
- Fix #4610 net10.0 follow-up: enum-aware Contains path for MemoryExtensions by @jeremydmiller in #4616
- Fix #4611: allow StartStream with mandatory stream types under per-tenant event partitioning by @erdtsieck in #4613
- Fix #4614: keep mt_version as integer for IRevisioned (V8) documents by @jeremydmiller in #4615
Full Changelog: V9.5.0...V9.5.1
V9.5.0
The minor point bump here is because of some CritterWatch related features, otherwise this is all bug fixes
What's Changed
- Fix #4599: EnumerableContains.Parse crash on programmatic receivers with custom ToString() by @jeremydmiller in #4600
- Fix #4602: Query() throws IndexOutOfRangeException on tenant-mapped projection documents by @RorySan in #4603
- Tests: broaden #4602 coverage across all four storage selectors by @jeremydmiller in #4604
- Fix #4598: provision per-tenant event partition + sequence under sharded tenancy by @jeremydmiller in #4605
- Closes #4607: Disable/Enable/AllDisabled lifecycle on ShardedTenancy by @jeremydmiller in #4608
- Closes #4606: fix 42P16 inherited-FK on eager-apply + sharded per-tenant events by @jeremydmiller in #4609
- Fix value.Contains(enumMember) execution failure on enum document members by @jeremydmiller in #4610
New Contributors
Full Changelog: V9.4.0...V9.5.0
V9.4.0
Marten 9.4.0
Per-tenant event partitioning and a tenant-aware async projection daemon (#4596 / CritterWatch#209). Built on JasperFx 2.5.0.
Highlights
- Per-tenant event partitioning — opt in with
opts.Events.UseTenantPartitionedEvents = true. On top of conjoined event tenancy, Marten partitionsmt_events/mt_streamsbytenant_id(native PostgreSQL LIST partitioning), gives each tenant its own event sequence (mt_events_sequence_{suffix}), and keysmt_event_progressionby(name, tenant_id). Removes the single shared event store as a scalability bottleneck across tenants. - Tenant-aware async daemon — vectorized per-tenant high-water detection (one query per database reports the high-water position for every active tenant), per-tenant projection rebuild isolation, and cross-tenant rebuild fan-out.
- Composite single-pass rebuild executor — read-once / fan-out rebuild for composite projections, with progression keyed on the composite's single
{Name}:Allshard.
Constraints for per-tenant partitioning
Validated at DocumentStore construction:
- Requires
Events.TenancyStyle = TenancyStyle.Conjoined. - Requires a quick append mode (
EventAppendMode.Quick/QuickWithServerTimestamps);EventAppendMode.Richis out of scope. - Cannot currently be combined with
Events.UseArchivedStreamPartitioning(sub-partitioning by bothtenant_idandis_archivedis a planned follow-up).
The flag defaults to false; existing stores keep the global append path byte-for-byte.
Dependencies
- Consumes the released JasperFx 2.5.0 packages (per-tenant partitioning surface, tenant-aware daemon abstractions, composite rebuild executor, and the
SubscriptionAgentoptimized-rebuild double-load fix).
Documentation
- New Per-Tenant Event Partitioning guide, cross-linked from Optimizing for Performance and Scalability.