Skip to content

Release v19.22.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 17:32
b13db27

Added

  • IJsonSchemaGenerator.GenerateForReadModel generates the JSON schema for a read model. Its default implementation returns Generate, so existing custom generators keep working. (#4330)

Fixed

  • A unique constraint with IgnoreCasing now rejects a value that differs only in casing. The .NET client did not send IgnoreCasing when it registered the constraint, so the kernel stored every unique constraint as case-sensitive. (#4368)
  • A reactor that loses its connection to the kernel (gRPC Unavailable) now logs a Warning and reconnects, instead of the Error "observation stream errored out". A cancelled stream logs at Debug and does not reconnect, and any other stream error is still an Error. An error thrown by your reactor handler is still an Error, even a gRPC Cancelled or Unavailable from your own calls. It is logged at Debug only when the reactor itself is stopping, such as during host shutdown. If the kernel stays away, the connection watchdog still logs each failed reconnect attempt at Error. (#4373)
  • A read-model property whose type is a concept, and whose record constructor parameter has a default (for example OwnerSubject? Owner = null), now gets its type, format and compliance metadata in the read-model schema. Before, it was untyped: the value was dropped when the read model was read, and a [PII] value was stored unencrypted. Event-type schemas are generated exactly as before, so event types that are already registered keep registering. Event types are tracked in #4376. (#4330)

Rollout for existing read models: when the client registers the corrected schema, the kernel replaces the stored read-model definition. A schema change alone does not start a replay or create a replay recommendation. New writes use the corrected schema, but documents already stored under the old schema are not rewritten, including any [PII] value stored unencrypted. They are repaired only by replaying the projection or reducer that builds the read model, and you have to start that replay yourself.