Skip to content

Add a multi-node kill and restart qualification with results on four databases - #549

Merged
rmcdaniel merged 11 commits into
mainfrom
rust-325-multinode
Oct 20, 2026
Merged

rmcdaniel merged 11 commits into
mainfrom
rust-325-multinode

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

Part of #325: the multi-node kill and restart gate.

What this adds

A harness for the multi-node qualification:

  • three native nodes share one database (MySQL 8.4, MariaDB 10.11, PostgreSQL 17 or SQLite) behind HAProxy;
  • two published-SDK workers and an offered workload reach the nodes only through the balancer;
  • while work is offered, one node at a time is killed with SIGKILL every 15 s and restarted 4 s later;
  • every 90 s, a worker is frozen for its workflow task lease plus 10 s, so its late requests are stale.

Each workflow must complete exactly once, with its original output, an ordered history, and an activity completed by the last attempt that started. A database audit must then find no duplicate workflow completion, activity completion or history sequence.

  • scripts/perf/run-server-port-multinode.sh: the driver, chaos loops, per-run database secrets, balancer summary, audit and panic check.
  • scripts/perf/server-port-multinode.compose.yml and multinode-haproxy.cfg: the topology. The balancer retries only connection failures; a request a node accepted and then dropped fails back to its client. Workers restart on exit, and each restart is recorded.
  • scripts/perf/multinode-workload.php: the offered workload and its per-workflow verification. The server's expired-lease recovery (RepairRequested) is accepted and counted.
  • benchmarks/server-port/multinode/: the procedure, results and per-run summaries.

Results

results-2026-10-20.md: the full schedule passed on all four databases in every run.

Run Native SDK Workflows completed once Node kills Duplicate outcomes Worker exits
Qualification ce18934e1 2.0.10 1,080 of 1,080 104 0 10
Ownership guard #548 2.0.10 1,080 of 1,080 106 0 12
Current SDK #548 2.5.3 1,080 of 1,080 100 0 0

No native node panicked in any run. All binaries are unoptimized dev-profile builds; this checks correctness, not speed.

Worker exits. Before #548, native refused a paused worker's lost claims with only a reason. With #548, the remaining exits are SDK 2.0.10's own: it has no lost-claim handling, and it exits on a poll that gets a proxy's HTML 503. With SDK 2.5.3, no worker exited: the paused worker dropped 7 lost claims.

Found on the way.

🤖 Generated with Claude Code

durable-workflow-ops and others added 3 commits October 20, 2026 16:58
Three native nodes share one MySQL, PostgreSQL or SQLite database behind
HAProxy. Published-SDK workers and an offered one-activity workload reach
them only through the balancer while nodes are killed and restarted and a
worker is paused past its workflow task lease. Every workflow must complete
once with its original output and an ordered history, and a database audit
must find no duplicate committed outcome.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All 810 offered workflows completed exactly once while nodes were killed and
restarted and a worker was paused past its lease. The audits found no
duplicate outcome or history sequence and no node panicked. The paused worker
exited 7 times: 6 on native's lost-claim refusals, which lacked the fields
PHP's ownership guard returns, and once on SDK 2.0.10's poll handling of a
proxy 503.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
durable-workflow-ops and others added 6 commits October 20, 2026 18:21
The compose file no longer holds fixed database passwords: the driver
generates both secrets for each run. The workload throws a dedicated
verification exception, loads the capacity adapter once, and the driver's
case statements and helpers handle unexpected values and name their
arguments. MySQL and SQLite smoke runs passed after the change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shared fixtures qualify MariaDB 10.11 separately from MySQL, so the
multi-node harness runs on it too, with the same image digest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…stories

A current SDK worker that dies holding a workflow task lease leaves the task
to the server's expired-lease recovery, which records RepairRequested, as
published PHP's does. The workload accepted only the happy-path events and
flagged that recovered workflow. It now accepts RepairRequested and reports
the recoveries per workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The multi-node schedule also passed on MariaDB 10.11. A confirmation run
with the #548 binary shows every late request refused with PHP's ownership
guard body; SDK 2.0.10's remaining exits are its own lack of lost-claim
handling. With PHP SDK 2.5.3, all 1,080 workflows completed once on the four
databases and no worker exited. Summaries now record the SDK version, and
the record describes the concurrent bootstrap race found on the way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@rmcdaniel rmcdaniel changed the title Add a multi-node kill and restart qualification with results on three databases Add a multi-node kill and restart qualification with results on four databases Oct 20, 2026
@rmcdaniel
rmcdaniel enabled auto-merge October 20, 2026 21:35
@sonarqubecloud

Copy link
Copy Markdown

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.

2 participants