-
-
Notifications
You must be signed in to change notification settings - Fork 556
Expand file tree
/
Copy pathDirectory.Packages.props
More file actions
546 lines (545 loc) · 47.1 KB
/
Copy pathDirectory.Packages.props
File metadata and controls
546 lines (545 loc) · 47.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="Alba" Version="8.2.0" />
<PackageVersion Include="Aspire.Hosting.AppHost" Version="8.2.0" />
<PackageVersion Include="BenchmarkDotNet" Version="0.13.10" />
<!-- Bobcat's out-of-process test supervisor, used only by the Nuke build (#5096).
It drives each test project's Microsoft.Testing.Platform host as a worker,
so a failure can be retried in a FRESH process and a pass-on-retry is
reported as flaky rather than laundered into a clean pass. See
build/SupervisedTests.cs. Bobcat.Supervisor pulls in Bobcat (the
Bobcat.Resilience types) transitively. -->
<PackageVersion Include="Bobcat.Supervisor" Version="0.6.1" />
<PackageVersion Include="Bogus" Version="35.6.5" />
<PackageVersion Include="Confluent.Kafka" Version="2.3.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
<PackageVersion Include="DotNet.ReproducibleBuilds" Version="1.2.39" />
<PackageVersion Include="FSharp.Core" Version="9.0.100" />
<PackageVersion Include="FSharp.SystemTextJson" Version="1.3.13" />
<!-- JasperFx 2.5.0: per-tenant event partitioning + tenant-aware async daemon
surface (jasperfx#407 / CritterWatch#209). Released to nuget.org; this
consumes the published packages rather than the local-feed pt209 prereleases.
JasperFx 2.8.0: dynamic-tenancy surface (jasperfx#413) — IDynamicTenantSource<T>
gains an `AddTenantAsync(tenantId, ct) → string` auto-assign provisioning
overload. ShardedTenancy implements it so store-agnostic provisioning works
under the sharded multi-tenancy model.
JasperFx 2.8.1: fix for marten#4663 — EventPage.CalculateCeiling guards the
Last() access for the all-events-skipped batch case so projection rebuilds
no longer crash with "Sequence contains no elements" (jasperfx#416).
JasperFx 2.8.2: fix for marten#4665 (jasperfx#418) —
JasperFxAsyncDaemon.CatchUpAsync(CancellationToken) now dispatches on
_tenantHighWater when the database implements ICrossTenantRebuildSource, so
ForceAllMartenDaemonActivityToCatchUpAsync actually advances async projections
under UseTenantPartitionedEvents (previously: the store-global high-water
path was used, but the global mt_events_sequence is never advanced under
partitioning, so catch-up stayed pinned at zero). Per-tenant fan-out mirrors
rebuildProjectionForTenant's ceiling-lookup pattern. Single-tenant / non-
partitioned stores keep the byte-for-byte global path.
JasperFx 2.9.0: jasperfx#419 (ShardName.Compose is now the only path used
for shard name construction), #420 (cap concurrent projection rebuilds per
database, default 4), #422 (MultiStreamProjection.Options.CacheLimitPerTenant
now defaults to 1000 instead of 0 — projections that relied on the unbounded
default still work but per-tenant slice caches now bound by default), and
#424 (new storage-agnostic IEventStoreInstrumentation hook for telemetry).
JasperFx 2.9.1: jasperfx#429 — source generator dedupes overridden required
members in evolver construction (codegen-only fix; no runtime/daemon change).
JasperFx 2.9.2: jasperfx#431 — ProjectionErrorHandlingDescriptor on EventStoreUsage
so monitoring tools (CritterWatch) can read the daemon error-handling policy off
the wire instead of presuming skip-and-DLQ behaviour. See JasperFx/ProductSupport#3.
JasperFx 2.9.9: jasperfx#443 (marten#4721) — the continuous-startup composite
"optimized rebuild" now runs on a task separate from the SubscriptionAgent's
single-consumer command loop. It previously ran inline inside that loop while the
replay posted RangeCompleted commands back into the same bounded (10k) command
channel, so the only reader was blocked awaiting its own posts — the shard silently
wedged at a batch boundary under UseTenantPartitionedEvents once the channel filled.
JasperFx 2.9.10: jasperfx#444 (marten#4730) — the in-memory aggregate cache is OFF by
default again (CacheLimitPerTenant 1000 → 0) and, when enabled, only populates after the
owning batch commits. Previously the cache was written during batch build before commit,
so a failed/retried batch (e.g. an out-of-order Update-before-Create stream throwing)
re-applied events on top of the already-mutated cached aggregate, double-applying to
unrelated, correctly-ordered streams in the same page.
JasperFx 2.9.13: marten#4729 (two parts) — the optimized composite rebuild now propagates
the composite's ShardExecutionMode down to its member executions (jasperfx#447). Member
executions defaulted to ShardExecutionMode.Continuous (CompositeReplayExecutor only set the
parent's Mode), so during a composite rebuild the stage members fired their RaiseSideEffects
(PublishMessage/AppendEvent) — unlike the classic single-stream rebuild, which is pinned by
side_effects_do_not_happen_in_rebuilds. Members now inherit CatchUp/Rebuild and suppress
side effects during a rebuild. The follow-up (jasperfx#448) decouples slice.Snapshot
assignment from side-effect publishing in AggregationRunner so multi-stage composites still
fan the upstream Updated<TDoc> events to downstream stages during a rebuild (previously the
snapshot was only set on the Continuous path, so post-#447 a rebuild produced no upstream
snapshot and downstream stages threw NREs). 2.9.12 shipped only #447 and is incomplete. -->
<!-- JasperFx 2.12.0: dead-letter row drill-in (IEventDatabase.QueryDeadLetterEventsAsync) +
DeadLetterEvent.TenantId + tenant-aware daemon PauseShardAsync/rebuild fan-out (jasperfx#453).
Marten implements QueryDeadLetterEventsAsync + per-tenant FetchDeadLetterCountsAsync below. -->
<!-- JasperFx 2.13.2: jasperfx#464 — SubscriptionDescriptor carries ImplementationType +
AggregateType (TypeDescriptor), populated in the shared
SubscriptionDescriptor(ISubscriptionSource, IEventStore) ctor that Marten's projections
funnel through via ProjectionGraph.Describe. See marten#4772. -->
<!-- JasperFx 2.20.0: jasperfx#487 — IEventStore.DistributesAgentsPerTenant (default false) for
node-distributed daemon hosts (Wolverine) to fan out one agent per (shard, tenant), plus the
hardened per-tenant StartAgentAsync: tenant ceilings primed before start (SubscribeFromPresent
no longer rewinds to 0), exact-identity precedence, loud failure on non-partitioned stores. -->
<!-- JasperFx 2.21.0: jasperfx#491 (epic jasperfx#486) — distributor-level per-tenant shard
expansion for the NATIVE daemon: the Solo / SingleTenant / MultiTenanted distributor
concretes grow a distributesAgentsPerTenant ctor overload that expands store-global shard
names into per-tenant ShardNames (PerTenantShardExpansion, re-evaluated every
BuildDistributionAsync so tenant add/remove converges on the leadership polling cycle),
and the coordinator reconciles running agents against the freshly built distribution
(stops agents whose identity disappeared). Marten threads
IEventStore.DistributesAgentsPerTenant into BuildDistributor (ProjectionCoordinator).
Also DaemonMode.ExternallyManaged (jasperfx#490, wolverine#3290 — external hosts run
projections; the store hosts no coordination and must not warn).
JasperFx 2.24.1: jasperfx#499/#500 (marten#4874 case B) — ProjectionCoordinatorBase.executeAsync
terminates the leadership loop on a disposed data source / wrapped cancellation instead of
re-polling, so a cold HotCold node's advisory-lock poll no longer spins OpenAsync against a
data source being disposed during shutdown. Pairs with Weasel 9.16.2 (weasel#349).
JasperFx 2.25.0: jasperfx#501 (CritterWatch#678) — every published ShardState is stamped with
its owning database identifier.
JasperFx 2.26.0: jasperfx#4913 (marten#4913) — under UseTenantPartitionedEvents the store-global
HighWaterAgent no longer runs its recurring max(seq_id)-over-mt_events scan (which fanned out
across every tenant partition each tick); tenant high water is driven per-tenant by the
coordinator + the jasperfx#492 timer, so the global mark is only seeded once at startup.
JasperFx 2.27.0: jasperfx#506/#507 — Block<T> fault semantics + daemon OnError wiring (block
failures are loud, dead consumers throw from Post), and teardown catch clauses classify via
CancellationExceptions.IsCancellationLike instead of discarding every exception type while a
shard CTS is cancelled; jasperfx#505 — source-gen evolver two-statement fix for the
GetUninitializedObject cast (rides in the bundled JasperFx.Events.SourceGenerator analyzer).
JasperFx 2.28.1: jasperfx#528 (marten#4966) — natural-key discovery now builds an event
mapping for a two-arg static evolve method (static TDoc Apply(TEvent e, TDoc current)), so a
natural key that CHANGES via an update event is written to mt_natural_key_X on live append and
rebuild; previously only the create event's key was ever recorded.
JasperFx 2.29.0: jasperfx#529 (marten#4975) — exact ReadProjectionProgressAsync(ShardName) overload
on IEventDatabase (no version/shard collapsing), adopted by MartenDatabase here.
JasperFx 2.29.1: jasperfx#530 (marten#4953) — HighWaterAgent.CheckNowAsync catches up to the
COMMITTED ceiling via the new IHighWaterDetector.FetchCommittedHighWaterCeilingAsync DIM
(overridden here with max(seq_id)) instead of looping DetectInSafeZone to the reserved
last_value, and the loop is time-bounded — rebuild/catch-up during concurrent appends now
waits for in-flight events instead of pressuring detection to skip them.
JasperFx 2.30.0: jasperfx#531 (marten#4978) — shared ITenanted marker promoted into
JasperFx.MultiTenancy; Marten.Metadata.ITenanted now derives from it.
JasperFx 2.32.0: jasperfx#539 — HighWaterAgent liveness heartbeat, staleness surface, and
local restart seam (IProjectionDaemon.HighWaterLastPolledAt / IsHighWaterStale /
RestartHighWaterAgentAsync; DaemonSettings.HighWaterStalenessThreshold; ShardAction.Faulted/
Restarted). Also carries the jasperfx#540 faulted-start teardown that first shipped in 2.32.0.
Foundation for the Phase 2 high-water health check (marten#4986).
JasperFx 2.33.0: jasperfx#543 (GH-3521) — JasperFxOptions.ApplicationAssemblyReuseWarning
surfaces divergent process-pinned application-assembly reuse across multi-host test processes;
Marten buffers and logs it at startup (marten#4996). Also ships the step-instrumented
aggregation fold + MultiAggregateProjectionResult (jasperfx#547) and the serializable
EventTagQuery DCB source (jasperfx#548).
JasperFx 2.33.1: jasperfx#550/#551 (marten#5001) — ShardStateTracker.AssignedNodeNumber is
stamped onto every published ShardState, so a distribution layer (Wolverine-managed
subscription distribution) can drive the extended-progression running_on_node column. Marten's
WriteExtendedProgressionAsync already persists it; this bump makes the tracker seam available.
JasperFx 2.35.0: jasperfx#561 — new backwards-compatible virtual overload on the aggregation
projection base, RaiseSideEffects(TOperations operations, TId id, IEventSlice<TDoc> slice).
AggregationRunner now always invokes the 3-arg overload with slice.Id, so a projection can
recover the slice identity even when slice.Snapshot is null (e.g. a deleted MultiStreamProjection
slice) to emit a follow-on event or publish a message. The old 2-arg override still works; the
default 3-arg implementation delegates to it.
JasperFx 2.36.0: three daemon/projection changes Marten consumes directly.
jasperfx#564 (marten#5047) — DaemonSettings.StopAndDrainTimeout bounds how long a single
shard's graceful stop-and-drain may take before it is cancelled; the default of 5 seconds is
what was hardcoded before, so nothing changes unless configured.
jasperfx#565/#567 (marten#5048) — ShardFailure/ShardFailureCategory/EventFailureDetails and the
IEventFailureContext seam an exception implements to declare its own failure category and name
the event it broke on. ShardState.Failure rides along on the paused/stopped states, and
IEventDatabase.WriteExtendedProgressionAsync documents persisting (and clearing) it.
jasperfx#569/#571 (marten#5052) — NaturalKeyEventMapping.Extractor widens from
Func<object, object?> to Func<IEvent, object?> so an IEvent<T> [NaturalKeySource] handler is
bindable, and an unbindable one now fails loudly from AssembleAndAssertValidity().
JasperFx 2.36.1: jasperfx#572/#573 (found here) — ShardStateTracker now takes one lock across
recording a published state and capturing the listener list, and ShardStatusWatcher subscribes
and reads the current-state snapshot through it as a single atomic step. 2.36.0's #568 narrowed
the lost-wakeup window between those two paths but left it open, so a watcher could fall between
them and see the state on NEITHER — and once a high water agent reaches the head it has nothing
left to publish, so the wait could only end in a timeout no matter how generous. That surfaced
as HighWaterAgentTests.skips_multiple_gaps_and_keeps_advancing failing ~8 of 10 runs.
JasperFx 2.36.2: jasperfx#574/#575 (marten#5055/#5056) — the daemon stop path is now safe to
run after disposal: JasperFxAsyncDaemon.Dispose() is idempotent and StopAllAsync() no-ops on a
disposed daemon, ProjectionCoordinatorBase.PauseAsync logs ObjectDisposedException at Debug
instead of Error, and ProjectionCoordinatorBase.StopAsync calls the new abstract
ClearResolvedDaemons() seam after disposing daemons so subclass caches drop the disposed
instances (implemented here on ProjectionCoordinator + ExplicitProjectionCoordinator).
JasperFx 2.36.3: jasperfx#592/#593 (marten#5090) — ProjectionCoordinatorBase.StartAsync now
cancels AND drains any existing leadership loop instead of disposing the old
CancellationTokenSource without cancelling it. Disposing a CTS does not cancel it and _runner
was overwritten, so a ResumeAsync not preceded by PauseAsync orphaned a live executeAsync for
the rest of the process — one that re-attained the leadership lock right after StopAsync
released it, and that won an advisory-lock handle after the lock had been disposed. Pairs
with Weasel 9.20.1 (weasel#396), which is what makes that stranded handle impossible.
JasperFx 2.37.0: jasperfx#590 — OptionsDescription no longer loses an entire diagnostic
description to one throwing property getter; set-only properties and indexers are skipped, and
a getter that throws is recorded as OptionsValue.Unreadable (exception TYPE only, never the
message, since descriptions ship to monitoring consoles). Also carries the jasperfx#594 patch
half (a timed-out blue/green side-effect gate re-reads progression and succeeds when the replay
had already reached the mark, plus a configurable DaemonSettings.SideEffectGateTimeout),
jasperfx#595 (BatchingChannel could deliver its trailing batch twice on shutdown) and #597.
JasperFx 2.37.2: compliance wave 2 (marten#5118) — four more shared suites plus the seam
members they need. Nothing outside JasperFx.Events.ComplianceTests changed; the other
packages move only because the line versions together.
JasperFx 2.37.3: jasperfx#611 — JasperFx.Events.SourceGenerator now discovers an
EventProjection's published document types SEMANTICALLY. Discovery used to match only
GenericNameSyntax, so an explicit ApplyAsync override writing `ops.Store<Doc>(x)` registered
Doc while the equally valid `ops.Store(x)` registered nothing at all, silently (storage is
still provisioned on demand, so only schema-ahead-of-time, AllKnownDocumentTypes and rebuild
teardown came up short). Binding the invocation gives the same answer for both spellings.
Also stops `Store<object>(...)` registering `object` itself as a document type: registrability
is now a SpecialType/TypeKind question, because object/string render through ToDisplayString()
as C# keywords and slipped past the old name-prefix check. New JFXEVT005 (Info) flags a call
that binds to the projection's session but whose document type cannot be named.
JasperFx 2.38.0: two changes Marten consumes directly.
jasperfx#616 (marten#5127) — the ProjectionScenario test harness is lifted into a new
JasperFx.Events.TestSupport namespace so Marten and Polecat share one implementation
instead of maintaining parallel ports.
jasperfx#617 (marten#5095) — a projection registered through AddProjectionWithServices with
a Scoped/Transient lifetime is now reachable from AggregatorFor, so live aggregation and
single stream rebuilds run the actual projection instead of silently falling through to
conventional aggregation off the aggregate type; and the projection a scoped wrapper wraps
is validated rather than only the wrapper, so an invalid configuration fails at startup for
every lifetime instead of only Singleton.
JasperFx 2.39.2: jasperfx#630 (marten#5167) — the IEventDatabase batched extended-progression
contract now REQUIRES one row per transaction, and ExtendedProgressionWriter flushes each
batch ordered by shard name. A batch amortizes the CONNECTION, never the transaction: a
multi-row statement holds a row lock on every shard in the batch until it commits, so one
slow projection batch on one row stalled every other shard's telemetry on that database
(Marten's side of this is #5186, which does not depend on this bump). The ordering closes
the cross-writer deadlock hazard — the tracker is per-database and shared, and
BuildProjectionDaemonAsync is not cached, so two writers can race over the same rows.
JasperFx 2.39.3: two extended-progression fixes Marten consumes directly.
jasperfx#631 — a status transition published while the shard has NO progression row to
decorate landed nowhere, because every store's extended-progression write is update-only.
That is every fresh shard's Started: the agent starts before its first batch commits. With
the periodic beat off by default (jasperfx#622) there was no later write to correct it, so
agent_status/heartbeat stayed NULL for the entire life of a healthy agent. Such a shard is
now remembered and written again on the first publication carrying a committed sequence.
jasperfx#630 follow-up — a duplicate ExtendedProgressionWriter on one database now logs a
warning. It used to announce itself as lock contention; one-row-per-transaction writes made
it harmless to correctness and therefore silent, while still meaning two daemons are
started for one database. Reported, never refused: the duplicate is the symptom.
JasperFx 2.43.0: jasperfx#639 — compliance wave 6 (#5153, #5154). The library gains
StreamCompactingCompliance and EventDataMaskingCompliance, taking it to 24 suites / 199
tests, plus the seam those needed (EventStoreComplianceFixture.ApplyEventDataMaskingAsync
and the two ComplianceStoreConfig.AddMaskingRule overloads). Compliance sources only —
nothing outside JasperFx.Events.ComplianceTests changed, so this bump is behaviourally
inert for the shipping libraries and only affects the test projects that enrol the
suites.
JasperFx 2.44.0: jasperfx#641 — compliance wave 7 (#5149, #5150), the last two event
sourcing suites in the backlog. RebuildAndCatchUpCompliance and DeadLetterCompliance take
the library to 26 suites / 216 tests. Neither needed a seam addition: IProjectionDaemon
already declared the whole rebuild surface, and the error policy
(IEventStore<,>.ContinuousErrors) plus dead-letter reads (IEventStore.AllDatabases() ->
IEventDatabase.QueryDeadLetterEventsAsync) were already shared and already overridden here.
Compliance sources only, so again behaviourally inert for the shipping libraries.
JasperFx 2.45.0: jasperfx#642 — compliance wave 8 (#5148, #5151), the last two suites in
the event sourcing backlog. ConjoinedEventTenancyCompliance and SubscriptionCompliance take
the library to 28 suites / 230 tests, and with them the ES compliance backlog is empty.
Two additive seam members: ComplianceStoreConfig.ConjoinedEventTenancy and
IComplianceStoreRegistrar.Subscribe(ComplianceSubscription), the latter paired with a
per-consumer partial completing ComplianceSubscription against Marten's own ISubscription
(IChangeListener is per-product, so that signature cannot be written once upstream).
#5148 needed no tenant-scoped session seam after all — OpenSession(IEventDatabase,
tenantId) was already on the shared generic IEventStore<,> and TenancyStyle was already a
shared JasperFx.MultiTenancy enum. Compliance sources only; behaviourally inert for the
shipping libraries.
JasperFx 2.48.0: jasperfx#664 (#663) stamps stream identity on string-keyed appends, plus a
batch of source generator projection-dispatch fixes (jasperfx#652-#656): ShouldDelete now
composes with Create/Apply for the same event type, a genuine override of the dispatch
virtuals is told apart from a `new` hiding member, the evolver is handed the registered
projection instead of a shadow instance, `partial` is only required where the dispatcher
actually lives, and unregistered published types are reported rather than skipped in
silence. The dead opt-out for the removed lambda registration APIs is gone.
JasperFx 2.49.0: jasperfx#665/#666 (marten#5241) — IDocumentReadOperations gains
LoadAsync<T>(object id), so store-agnostic code can load a document keyed by a strong-typed
identifier. Marten needs NO product change for it: IQuerySession already declares the
overload (IQuerySession.cs) and QuerySession implements it publicly, dispatching on
id.GetType() — Marten is in fact the store the member was modeled on. It ships with a
default implementation (unbox a Guid or string and forward, else NotSupportedException) so
Polecat and Fisher can take the bump before adopting it, which means the enforcement lives
in DocumentLoadAndStoreCompliance rather than the compiler. What Marten does owe is the
fixture line below: DocumentComplianceConfig gained ValueTypes/RegisterValueType<T>() and a
fixture that does not replay it fails the two strong-typed facts at runtime.
JasperFx 2.50.0: jasperfx#669/#671 — two additive changes. (1) The document session
contracts gain an Events accessor: IDocumentReadOperations.Events (IQueryEventStore) and
IDocumentSessionOperations.Events (IEventStoreOperations), both with throwing defaults.
⚠️ Marten did NOT satisfy either implicitly, on BOTH tiers: its sessions declare Events as
Marten.Events.IQueryEventStore / Marten.Events.IEventStoreOperations — Marten's own
subtypes — and C# interface implementation is not return-type covariant, so both members
bound to the throwing defaults with no compile error anywhere. QuerySession and
DocumentSessionBase now carry one explicit interface implementation each, pinned by
DocumentSessionEventsCompliance. (2) IEventBinarySerializer and BinaryEventAttribute are
promoted out of Marten.Events into JasperFx.Events; Marten's interface now derives from the
core one, its attribute is checked alongside the core one (which is sealed, so no
inheritance), and the registration surface is widened to the core interface.
JasperFx 2.51.0: three additive changes, each with its own Marten adoption issue. All are
purely additive — nothing here is a compile break, so this bump lands on its own and the
adoptions follow separately.
(1) jasperfx#672/#677 (marten#5248, marten#5249) — DocumentComplianceConfig gains a nullable
StreamIdentity so a document suite can declare the stream identity style it needs instead of
leaving each fixture to guess it (DocumentSessionEventsCompliance appends by stream key and
failed three facts on every store's Guid default), and JasperFx.Events.BinaryEventAttribute
is unsealed so Marten can derive its own back-compat attribute from it and collapse
EventGraph.ResolveBinarySerializerFor back to one lookup.
(2) jasperfx#673/#675 (marten#5250) — IDocumentSessionOperations.PendingStreams
(IReadOnlyList<StreamAction>), so store-agnostic code can read the stream actions a session
has queued but not committed. ⚠️ Same non-covariance trap as 2.50.0's Events accessor:
Marten's PendingChanges.Streams() returns IList<StreamAction>, which does NOT satisfy an
IReadOnlyList<StreamAction> member, so this binds to the throwing default until Marten
writes the forward. Pinned by PendingStreamActionsCompliance.
(3) jasperfx#674/#676 (marten#5251) — IAggregateWriteCache, AggregateCacheKey,
NulloAggregateWriteCache, RecentlyUsedAggregateWriteCache and AggregateWriteCacheOptions move
into JasperFx.Events.Fetching, with AggregateWriteCaching/CacheAggregatesForWriting<T>() on
EventRegistry so all three stores inherit the registration surface. Grade 1 semantics only:
the cached snapshot is a baseline, version and delta are always re-read, OCC is untouched.
The default cache is backed by JasperFx.Core's RecentlyUsedCache, deliberately NOT
Microsoft.Extensions.Caching.Memory — the prototype's IMemoryCache dependency would have been
pushed onto every consumer of JasperFx.Events rather than one store.
JasperFx 2.52.0: jasperfx#679/#680 (marten#5258) — IDocumentCommitListener, the
store-agnostic post-commit SESSION hook, plus IDocumentChangeSet and IDocumentDeletion in
JasperFx.Events.Documents, and DocumentComplianceConfig.CommitListeners/AddCommitListener so
a compliance suite can register one before the store is built. Purely additive.
⚠️ NOT the same trap as 2.50.0's Events accessor or 2.51.0's PendingStreams, and the
difference is worth stating because it changes where the risk lives: no member of this
contract has a default implementation, so a near-miss is CS0535 at build time rather than a
silent bind to a throwing default. What the compiler still cannot see is the WIRING — a
store that declares the interfaces perfectly and never invokes the listener compiles clean
and passes every other suite in the library.
Marten adopts it as an ADAPTER rather than by widening its own types, and that is forced
rather than stylistic. IChangeSet.Inserted/Updated are IEnumerable<object> against the
contract's IReadOnlyList<object>; IChangeSet.Deleted is
IEnumerable<Weasel.Storage.IDeletion> against IReadOnlyList<IDocumentDeletion>; and
DocumentSessionListenerBase.AfterCommitAsync differs from the contract's signature in three
of its four positions. Putting IDocumentChangeSet on IChangeSet would therefore be a
breaking change to every existing Marten listener, and putting it on ISessionWorkTracker
would additionally rope in ProjectionUpdateBatch, whose Inserted/Updated/Deleted all throw
NotSupportedException. See DocumentCommitListenerAdapter/MartenDocumentChangeSet and
StoreOptions.AddCommitListener, pinned by DocumentCommitListenerCompliance. -->
<PackageVersion Include="JasperFx" Version="2.53.0" />
<PackageVersion Include="JasperFx.Events" Version="2.53.0" />
<!--
The shared cross-store event sourcing compliance suites (#5116). Source-only package: the
suites compile inside EventSourcingTests so JasperFx's aggregate source generator can bind
Marten's own session types. Marten.Testing needs it too because MartenComplianceFixture,
which closes the seam, lives beside the rest of the harness.
-->
<PackageVersion Include="JasperFx.Events.ComplianceTests" Version="2.53.0" />
<!--
Deliberately AHEAD of the rest of the JasperFx line, which stays at 2.41.0 until Marten adopts
the strong-typed identity compliance suite that landed in 2.42.0. This package is analyzer-only,
declares no dependencies, and Marten bundles its dll into Marten.nupkg (see
_BundleEventsSourceGeneratorAnalyzer in Marten.csproj, marten#4557), so its version is
independent of the runtime family's.
2.42.1: jasperfx#637 (marten#5192) — the generator used to register an EventProjection's
discovered published document types by emitting a parameterless constructor into the user's
partial class. That is illegal on a type declaring a primary constructor, so
`partial class MyProjection(ILogger logger) : EventProjection` failed to build with CS8862; and
for a projection registered through AddProjectionWithServices the container calls the
dependency-taking constructor, so the generated one never ran and the published types went
silently unregistered. Registration now rides an override of ProjectionBase.PublishedTypes(),
which does not care how the instance was constructed. The generator is otherwise byte-identical
from 2.38.0 through 2.42.0, so this is an isolated swap of that one fix.
-->
<PackageVersion Include="JasperFx.Events.SourceGenerator" Version="2.53.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageVersion>
<PackageVersion Include="JasperFx.SourceGenerator" Version="2.53.0" />
<PackageVersion Include="Jil" Version="3.0.0-alpha2" />
<PackageVersion Include="Lamar" Version="7.1.1" />
<PackageVersion Include="Lamar.Microsoft.DependencyInjection" Version="15.0.0" />
<PackageVersion Include="Marten" Version="8.2.1" />
<PackageVersion Include="MemoryPack" Version="1.21.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
<PackageVersion Include="Meziantou.Analyzer" Version="2.0.257" />
<PackageVersion Include="Microsoft.AspNetCore.OData" Version="8.2.5" />
<PackageVersion Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="8.3.0" />
<PackageVersion Include="Microsoft.FeatureManagement" Version="3.2.0" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Microsoft.VisualStudio.Threading.Analyzers" Version="17.14.15" />
<!-- Neovolve ships xunit v3 support under a distinct package id, not a major bump. -->
<PackageVersion Include="Neovolve.Logging.Xunit.v3" Version="7.2.0" />
<PackageVersion Include="NetTopologySuite" Version="2.5.0" />
<PackageVersion Include="NetTopologySuite.IO.GeoJSON" Version="4.0.0" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="NodaTime.Serialization.JsonNet" Version="3.1.0" />
<PackageVersion Include="NodaTime.Serialization.SystemTextJson" Version="1.1.2" />
<PackageVersion Include="Npgsql" Version="9.0.4" />
<PackageVersion Include="Npgsql.DependencyInjection" Version="9.0.2" />
<PackageVersion Include="Npgsql.Json.NET" Version="9.0.4" />
<PackageVersion Include="Npgsql.NetTopologySuite" Version="9.0.4" />
<PackageVersion Include="Npgsql.NodaTime" Version="9.0.2" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Nuke.Common" Version="10.1.0" />
<PackageVersion Include="OpenTelemetry" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Exporter.Prometheus.AspNetCore" Version="1.8.0-rc.1" />
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.8.1" />
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.8.0" />
<PackageVersion Include="Pgvector" Version="0.3.2" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="Spectre.Console" Version="0.53.0" />
<PackageVersion Include="StronglyTypedId" Version="1.0.0-beta08" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageVersion Include="System.IO.Hashing" Version="10.0.3" />
<PackageVersion Include="Vogen" Version="7.0.0" />
<!-- 9.16.2: the hold at 9.2.1 (were newer builds actually being published?) is resolved —
Weasel.EntityFrameworkCore is on nuget.org, so it tracks the rest of the Weasel line. -->
<PackageVersion Include="Weasel.EntityFrameworkCore" Version="9.25.1" />
<!-- Weasel.Postgresql 9.1.x: managed LIST partitions under multi-database (sharded) apply.
9.1.2 (marten#4706): managed-partition tables are no longer destructively rebuilt — the
out-of-band AddPartitionToAllTables path creates partitions while the generic schema diff
leaves managed tables alone (Marten sets IgnorePartitionsInMigration on them; see DocumentTable).
9.1.5 (marten#4713): the additive reconcile now SAVES/RESTORES IgnorePartitionsInMigration
instead of permanently clearing it on the shared DocumentTable singleton, so a re-apply after
tenant provisioning stays idempotent (no 42P07 / no rebuild). -->
<!-- 9.3.0 (marten#4779 / weasel#318): RANGE partition bound round-trip fix so date-keyed (and
quoted/integer) partitions no longer drift into a destructive rebuild on every migration. -->
<!-- 9.4.0 (marten#4811 / weasel#321 + #322): lifts the closed-shape IIdentification identity
family into Weasel.Core.Identity (with the ISequenceSource sequence seam) so Marten and
Polecat share it; Weasel.Core 9.4.0 flows in transitively. -->
<!-- 9.5.0 (weasel#323): adds a shared Weasel.Core.ISerializer base for the Critter Stack
dedupe. Weasel.Core 9.5.0 flows in transitively. -->
<!-- 9.6.0 (weasel#324): adds DbParameter[]-returning AppendWithDbParameters to the non-generic
ICommandBuilder, unblocking the closed-shape operation param path (#4821/#4828). Weasel.Core
9.6.0 flows in transitively. -->
<!-- 9.7.0 (weasel#327): shared Weasel.Core SQL-gen contract (neutral ICommandBuilder +
ISqlFragment) that the Postgres/SqlServer ones derive from. Marten disambiguates the new
simple-name collision via a GlobalUsings alias to the Weasel.Postgresql types (API-preserving). -->
<!-- 9.8.0 (marten#4830 / weasel#329): new Weasel.Storage package holds the 5 neutral closed-shape
storage contracts (IStorageDialect, StorageColumnType, BulkColumnValue, IStorageSerializer,
IVersionTracker) lifted out of Marten so Marten and Polecat share them. -->
<!-- 9.14.0 (weasel#339): dialect-neutral grouped-parameter seam (Weasel.Core.IGroupedParameterBuilder
+ ICommandBuilder.CreateGroupedParameterBuilder/AppendParameter(object)) + StorageColumnType.Binary,
so the closed-shape EVENT binders + per-event ops drop their direct Npgsql reference (#4821 event E1). -->
<!-- 9.15.0 (weasel#341): closed-shape EVENT descriptor core moved into Weasel.Storage — the 3
descriptors, IEventMetadataBinder + 5 metadata binders, IEventStoreSqlDialect — so Marten and
Polecat share them (#4821 event E2). -->
<!-- 9.16.0 (weasel#343): closed-shape EVENT storage hierarchy + operations + new neutral op
bases moved into Weasel.Storage — EventStorage<TId>, the 3 storages, EventStorageBuilder,
and the per-event/insert/update/assert ops — so Marten and Polecat share them (#4821 event E3). -->
<!-- 9.16.1: latest Weasel patch consumed for the 9.13.0-alpha.3 Marten alpha. Also carries
weasel#345/#346: PostgresqlDatabase.DisposeAsync() honors an OwnsDataSource flag so a
caller-owned NpgsqlDataSource is not disposed on the async teardown path — the Weasel
sibling of marten#4874 (the sync path was guarded Marten-side by #4903).
9.16.2 (weasel#349/#350, marten#4874 case B): AdvisoryLock guards against a disposed
NpgsqlDataSource during shutdown — a disposing flag short-circuits TryAttainLockAsync and
disposed-pool ObjectDisposedException is swallowed to a non-acquire, so the HotCold cold-node
leadership poll no longer aborts OpenAsync against a data source being disposed. Pairs with
JasperFx 2.24.1 (jasperfx#499).
9.16.3 (weasel#354, marten#4915): the ObjectDisposedException catch in AdvisoryLock.TryAttainLockAsync
now latches the disposed flag AND rethrows instead of swallowing to a non-acquire. 9.16.2's swallow
made jasperfx#500's terminate-on-ODE catch in ProjectionCoordinatorBase unreachable, so the HotCold
cold-node leadership loop re-polled a dead pool forever; rethrowing lets the coordinator terminate.
9.16.4 (weasel#356/#359): db-apply bounds its connection usage over many databases and extends the
pool-release/retry to SqlServer, MySql and Oracle.
9.17.0 (weasel#360): archive/tombstone/progression seams added to Weasel.Storage.Events. Additive for
Marten — bumped to stay current on the Weasel line (compile-verified).
9.20.1 (weasel#396/#397, marten#5090): AdvisoryLock can no longer strand a handle acquired after
DisposeAsync drained. TryAttainLockAsync checked _disposed only at method entry and then stored the
winning handle unconditionally, so an acquire in flight during disposal put its handle where nothing
would ever dispose it — with the default transaction-scoped leadership lock that is a backend left
'idle in transaction' on pg_try_advisory_xact_lock until the process exits, which the #4953 gap
detection then reads as a live pre-gap reserver and never advances past. The store now happens under
the same lock the drain latches under, a displaced handle (lock lost in monitored mode, re-attained)
is disposed rather than overwritten, and HasLock/ReleaseLockAsync move under that lock too.
9.20.2 (weasel#399/#400, found here): REQUIRED to move off 9.17.0. Weasel 9.18.0's computed-column
delta detection (weasel#373) routed every column through TableColumn.MatchesForDelta, where a bare
Equals(actual) binds to the protected NON-virtual Equals(TableColumn) overload and silently bypasses
subclass overrides of Equals(object). That override is exactly how RevisionColumn declares an
existing bigint mt_version acceptable for an integer-desired column instead of emitting a lossy
narrowing cast (#4614/#4742), so on 9.18.0–9.20.1 the column landed in Columns.Different, the table
was classified Update, and AssertDatabaseMatchesConfigurationAsync threw with an EMPTY change set —
Bug_4614_revision_column_int_for_IRevisioned's assert-check test fails on every version in that
range. 9.18/9.19/9.20 are otherwise additive for Marten and ride along (compile-verified).
9.21.0 (weasel#401, marten#5093): ManagedRangePartitions — the RANGE analogue of
ManagedListPartitions. A RollingWindowPolicy (period size, periods ahead, periods retained)
attached through RangePartitioning.UsePartitionManager makes the partition set a pure function
of the clock, so RangePartitioning.CreateDelta turns purely ADDITIVE instead of resolving a
rolled-forward window to PartitionDelta.Rebuild. That is what lets Marten own a time-series
document table's partitions end to end (PartitioningExpression.ByRollingRange) rather than
pushing users onto ByExternallyManagedRangePartitions, which also opts them out of Weasel's
ordering and dependency management (see JasperFx/CritterWatch#886).
9.21.1 (weasel#416): partition bound VALUES are now escaped. FormatSqlValue doubles an embedded
single quote, and no longer returns an already-quote-wrapped string verbatim — that short-circuit
existed for idempotency but meant a quote-wrapped value skipped escaping entirely. Marten reaches
this with a raw tenant id as the partition value on every provisioning path
(ShardedTenancy.createPartitionsForTenant, AddMartenManagedTenantsAsync), and Marten's own
DatabaseScopedTenantPartitions.Partitions() override only covered the schema-apply delta, not the
runtime resolveBuckets path. REQUIRED alongside the tenant-id identifier escaping in this commit.
9.22.0: carries the JasperFx 2.37.0 floor (weasel#417) so this matrix stays coherent rather
than resolving transitively.
9.23.0 (weasel#416): AssertValidIdentifier now rejects a quote or semicolon outright. This is
the belt to 9.21.1's braces — 9.21.1 made partition bound VALUES escape correctly, and this
closes the identifier side of the same surface.
9.23.1 (weasel#420/#422): the same weasel#416 identifier validation extended to the other
provider migrators (SQL Server previously validated nothing at all; Oracle, MySQL and Sqlite
each missed their own quoting characters), with the PostgreSQL check folded onto the shared
Weasel.Core helper so the providers cannot drift apart again.
9.23.2 (weasel#424/#425): Sqlite and MySql implement the non-generic
Weasel.Core.ICommandBuilder (weasel#423), and the JasperFx line moves to 2.38.0 so this
matrix stays coherent with the JasperFx pins above rather than resolving transitively.
9.25.0: "the identifier release" (see weasel docs/release-9-25.md). Most of it lands on the
other providers — SQL Server bracketing, MySQL identifier normalization, the SQLite rebuild
fix — but two things reach Marten. weasel#462 makes PostgreSQL quote for SHAPE as well as for
case and keywords, and weasel#458 stops TableColumn silently rewriting a space in a column
name to an underscore. Both are no-ops for conventional lowercase schemas, which is every
name Marten generates itself; a user-supplied duplicated-field column containing a space
would now be emitted quoted rather than folded. weasel#468 also widens identifier validation
to every identifier a table writes rather than only the ones naming objects, which is the
same surface as the 9.21.1/9.23.x hardening and matters most to the per-tenant partition
names. Verified against the schema-heavy suites rather than assumed — see the bump commit.
9.25.1 (weasel#485/#487, found here): REQUIRED to move off 9.24.0 — do not pin 9.25.0. That
weasel#468 widening ran local identifiers through AssertValidIdentifier, which also enforces
the 63-character limit, so a long primary key CONSTRAINT name was refused where PostgreSQL
had always just truncated it. Weasel's own TableDelta compares those names through
TruncatedNameIdentifier precisely so a truncated one matches, so the two halves disagreed.
9.25.1 adds Migrator.AssertValidLocalIdentifier: same safety rules, no length limit.
It cost two Marten failures on 9.25.0, and the second is the one to remember — the same
rejection aborted a projection's schema application and surfaced as a 23505 on
pk_mt_event_progression during per-tenant catch-up, an error naming a table with nothing to
do with identifiers. A validation failure on this path does not only throw where you can
see it.
Requires JasperFx.Events >= 2.46.0; this matrix is already at 2.47.0. -->
<PackageVersion Include="Weasel.Postgresql" Version="9.25.1" />
<PackageVersion Include="Weasel.Storage" Version="9.25.1" />
<PackageVersion Include="WolverineFx.Marten" Version="4.2.0" />
<!-- The whole test suite is on xunit v3. VSTest stays the execution mode, so the
Nuke targets and the GitHub workflows are unaffected. -->
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
</ItemGroup>
<!-- EF Core packages - requires net9.0+ due to Npgsql 9.x compatibility -->
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="9.0.2" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.2" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.3" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="10.0.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.0" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0" />
</ItemGroup>
<!-- Framework-specific package versions -->
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="9.0.2" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.0" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net10.0'">
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0" />
</ItemGroup>
</Project>