Skip to content

Add .MessagesImplementing<T>() to the docs about message routing - #594

Merged
jeremydmiller merged 1 commit into
JasperFx:mainfrom
Xzelsius:add-publish-all-of-type-docs
Oct 17, 2023
Merged

Add .MessagesImplementing<T>() to the docs about message routing#594
jeremydmiller merged 1 commit into
JasperFx:mainfrom
Xzelsius:add-publish-all-of-type-docs

Conversation

@Xzelsius

Copy link
Copy Markdown
Contributor

Updates the message routing sample with the missing .MessagesImplementing<T> option.

resolves #593

@jeremydmiller

Copy link
Copy Markdown
Member

Thanks Raphael!

@jeremydmiller
jeremydmiller merged commit 4f7e057 into JasperFx:main Oct 17, 2023
@jeremydmiller jeremydmiller added this to the 1.9.0 milestone Oct 17, 2023
jeremydmiller added a commit that referenced this pull request Jul 31, 2026
Picks up the blue/green side-effect gate fixes (#594): the
warm-up ceiling is now DaemonSettings.SideEffectGateTimeout rather than
a hardcoded 5 minutes, and a warm-up that exceeds it re-reads persisted
progression before being called a failure -- a shard whose replay had
actually reached the prior version's mark used to fail its start
repeatedly on the timeout alone.

Also carries the BatchingChannel trailing-batch double-delivery fix
(#595), which affects Wolverine's batched senders: a shutdown
with a partial batch pending could deliver those items twice.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
erdtsieck pushed a commit to erdtsieck/wolverine that referenced this pull request Aug 3, 2026
…xGH-3779)

Every defect in the JasperFxGH-3753 chain -- JasperFxGH-3748, JasperFxGH-3749, JasperFxGH-3750, JasperFx#594,
JasperFx#598 -- takes a SLOW AGENT START as its precondition, and
`FakeAgent.StartAsync` returned `Task.CompletedTask`, which is precisely the
assumption the whole chain violates.

SlowTests/Agents already reproduces this against real hosts and real delays, and
those three tests are the thorough version. They also run in NO CI workflow and
take minutes apiece, so nothing guards the leader's assignment logic on a normal
commit. This adds the fast tier underneath them.

Harness seams, as the issue asks for:

- `FakeAgent` takes a settable `StartDelay`/`StopDelay` and counts entries into
  `StartAsync`, so a start that is merely slow can be told apart from one the
  leader has re-driven.
- `FakeAgentFamily` takes an agent count (the twelve hard-coded `Names` are fine
  for asserting the shape of a distribution, not for the ~6,500-agent shape that
  actually breaks) and a `StartDelayPolicy`, so a long TAIL can be simulated
  rather than a uniform cost. It is the tail that does the damage: a uniformly
  slow family converges late but converges.

`slow_agent_start_convergence` then drives the real
`NodeAgentController.EvaluateAssignmentsAsync` round after round against a
simulated multi-node cluster and asserts the properties the field reported
losing: every agent converges, no agent is ever started on two nodes at once, no
node is starved while another holds everything, a first placement wave emits zero
stops and zero reassignments, a start slower than the ledger TTL is still held by
the outstanding-dispatch probe, and a partially-started chunk's remainder still
converges.

Two things worth naming about the simulation:

Time is measured in evaluation ROUNDS, not milliseconds. The field distribution
is p50 27s / p95 82s / a 215s tail against a ~5s health-check cadence, so a
wall-clock version would take hours and would trade a deterministic assertion for
a timing race. Everything is seeded; a failure reproduces.

An agent becomes RUNNING one round before it becomes VISIBLE to the leader. A
node persists its assignment row only after the agent is up and the leader reads
that row on a later snapshot, so there is a window in which an agent is genuinely
running and looks completely unplaced -- that window is what JasperFxGH-3750 is about,
and a simulation that closes it instantly cannot reproduce the field's falling
assigned-agent count.

Every assertion was checked against two mutations of the product code (the
pending-assignment ledger never projected onto the grid; the pending placement
set but not held) and each fails under at least one. The monotonic running-count
check is the exception -- no mutation makes it fail, because against a stable
node set it is strictly implied by the zero-churn assertion -- so it rides along
inside that test, documented as the operator-visible restatement, rather than
standing as a test that cannot fail.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0116vfBcKwcjWn8msM4ZjkuA
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.

Add a documentation sample for message subscription rules for sub types

2 participants