Skip to content

Release v19.20.0

Choose a tag to compare

@github-actions github-actions released this 28 Sep 16:36
9a6eee4

This PR consolidates five fixes into one release. Each fix was reviewed on its own, and the combined branch passed the full Release build and all spec projects.

Added

  • A kernel option Events.CausationPropertyRetention (events.causationPropertyRetention in chronicle.json, Cratis__Chronicle__Events__CausationPropertyRetention in the environment) with values Retain (default, unchanged behavior) and Omit.
    • Omit stores each causation entry's type and time but empties its property values, on single and batch appends, revisions, redaction and forwarding to other event stores.
    • It prevents new retention only; values stored earlier are not rewritten. #4238 stays open for the classification-based follow-up (#4238)
  • ReactorScenario accepts a per-run Defaults, so reactor specs can use event types generated for that run.
    • Each in-process test event store registers its own event types instead of the process-wide set (#4162)

Fixed

  • The kernel no longer fails to start when another socket briefly holds its port. On Linux, port 35000 lies in the ephemeral source-port range, so an outbound connection made during startup could briefly take it, and the kernel then failed with "address already in use".

    • The kernel now retries only that bind error, for up to 30 seconds (the new BindTimeout option; 00:00:00 turns it off). The retry stops as soon as shutdown is requested.
    • The diagnostics name the socket holding the port (#4174)
  • A projection replay is treated as finalized only when at least one silo actually finalizes it.

    • A failed replay setup (Establish) is reported instead of ignored.
    • Before this, a replay could be treated as complete and clear failed partitions even though the read-model swap never happened (#4243)
  • Failed partitions from the final MongoDB bulk flush of a catch-up or replay are now recorded as failed partitions. Previously they were discarded and the catch-up reported success (#4257)

Changed

  • Test fixtures wait for PostgreSQL's final server instead of the temporary initialization server. They pin SQL Server to 2022-CU20-ubuntu-22.04 with 3 GB of memory, retry a SQL Server container that exits during startup once, and reserve the kernel ports from the ephemeral range where the container runtime allows it. This removes CI flakes (#4174)

Fixed (CI regressions on SQL storage, found while releasing this batch)

  • Projection replays on SQL storage (SQLite, PostgreSQL, SQL Server) no longer fail. This covers replays after a projection definition change and every replay after the first. The replay context's generation column was missing, the replayed-read-model table was mapped under the wrong name (the table is now keyed by observer and replay start), and replayed tables kept their temporary primary-key names after the swap. #4243 exposed these long-standing SQL bugs by no longer ignoring replay start and finalization errors.
  • Primary-key names on PostgreSQL and SQL Server are now distinct within the identifier limits (a readable prefix plus a hash). Replay starts are stored at microsecond precision, and recording a replay twice is idempotent.

Known limitation, pre-existing and tracked in #4340: containers whose names reach PostgreSQL's 63-byte table-name limit once suffixed (about 49 bytes or more) can still collide on backup and shadow table names.