Skip to content

Adopt JasperFx 2.39.3 and release 9.22.4 - #5189

Merged
jeremydmiller merged 1 commit into
masterfrom
chore/jasperfx-2.39.3-release-9.22.4
Aug 4, 2026
Merged

Adopt JasperFx 2.39.3 and release 9.22.4#5189
jeremydmiller merged 1 commit into
masterfrom
chore/jasperfx-2.39.3-release-9.22.4

Conversation

@jeremydmiller

Copy link
Copy Markdown
Member

Adopts JasperFx 2.39.3 and bumps the Marten version to 9.22.4 for release.

What 2.39.3 brings

#631 — a status transition with no progression row to land on is written again. Every store's extended-progression write is update-only, so a transition published while the shard has no progression row simply lands nowhere. That is every fresh shard's Started: the agent starts before its first batch commits. With the periodic beat off by default since #622, there was no later write to correct it — so agent_status and 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, which is proof the row exists.

#630 follow-up — a duplicate ExtendedProgressionWriter says so. A second writer on one database used to announce itself as lock contention: two writers issuing multi-row UPDATEs over the same rows in plan-dependent order is a deadlock hazard. The one-row-per-transaction rewrite in #5186 made a duplicate harmless to correctness and therefore silent — while it still means more than one projection daemon has been started for that database. ShardStateTracker now logs a warning when a second one attaches. Reported and never refused: the duplicate writer is the symptom, not the bug, and swallowing the subscription would hide the lifecycle bug rather than surface it. Unsubscribing removes the listener, so an ordinary daemon restart does not trip it.

Together with #5186 (per-row progression writes) and #5176 (the beat off by default), this closes out the #5167 line of work.

Verification

Built and tested against the published 2.39.3 packages (all five).

  • DaemonTests — 301/301 green, net9.0

🤖 Generated with Claude Code

https://claude.ai/code/session_017CTtw2kVRSZKp1p5RTxgAy

#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 describes every fresh shard's Started: the agent starts before its first batch
commits. With the periodic beat off by default since #622 there was no later write
to correct it, so agent_status and heartbeat stayed NULL for the entire life of a healthy
agent. The shard is now remembered and written again on the first publication carrying a
committed sequence, which is proof the row exists.

The #630 follow-up: a duplicate ExtendedProgressionWriter on one database now logs
a warning. It used to announce itself as lock contention -- two writers issuing multi-row
UPDATEs over the same rows in plan-dependent order is a deadlock hazard. The
one-row-per-transaction rewrite in #5186 made a duplicate harmless to correctness and
therefore SILENT, while it still means two projection daemons are started for one
database. Reported and not refused: the duplicate writer is the symptom, not the bug.

Version bumped to 9.22.4 for the release.

DaemonTests 301/301 green on net9.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017CTtw2kVRSZKp1p5RTxgAy
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant