Skip to content

Release v19.68.0

Choose a tag to compare

@github-actions github-actions released this 15 Oct 03:29
7c3462f

Summary

The .NET client can now protect the reads a decision depends on: inside a read-protected unit of work, every read is either guarded against changes made before the unit commits or explicitly marked advisory, and anything that cannot be guarded is refused with a clear reason.

Added

  • Read protection for units of work: an enforcing unit owned by one invocation, protected decision reads that enrol before they return (IDecisionReads.GetFor), guards on every public read and append entry point, owner-only completion, read allowances for advisory reads, and the append conditions a commit sends (GetAppendConditions) (#4888)
  • Protected decision reads of reducers and self-reducing read models, folding with the handler's declared event generation; filtered reducers and reducers with constructor dependencies are refused (#4888)
  • CHR0062 reports an event source definition or stream whose concurrency leaves out EventSourceId, with a code fix (#4888)
  • CHR0063 reports an explicit concurrency scope for one stream passed to an append routed to another stream of the same event source (#4899)
  • A documentation page on read protection, and decision read documentation for reducers, pinned delivery and detached reads under read protection (#4888)

Changed

  • An explicit concurrency scope whose tail was unavailable now guards an empty stream instead of being skipped; ConcurrencyOptions.SkipIncompleteExplicitScopes restores the old behaviour (#4898)
  • An explicit concurrency scope built for one stream of an event source is refused when passed to a single-route append to another stream of it; ConcurrencyOptions.AllowRouteScopeStreamMismatch restores the old behaviour (#4899)
  • The concurrency and Dynamic Consistency Boundary documentation states that revising or redacting an event is not detected by append conditions (part of #4900)

Fixed

  • Events revised on SQL storage now report their revised generation to clients, so a client reading over gRPC can tell the content was revised instead of using the stale stored generation (#4888)