Skip to content

CI: corpus profiles and restart cases as their own fixture part; bound readiness probes - #757

Merged
rmcdaniel merged 4 commits into
mainfrom
rust-325-ci-corpus-restarts
Oct 25, 2026
Merged

rmcdaniel merged 4 commits into
mainfrom
rust-325-ci-corpus-restarts

Conversation

@rmcdaniel

Copy link
Copy Markdown
Member

Cuts the Shared Server fixtures' remaining long pole, and bounds every readiness probe as Cloud's #756 review asked.

Why. After #756 the corpus part sets the wall time alone: 18 to 20 min per database, while every other part takes 16 min or less (#756 comment 6394082981). Almost all of it is one step, 1031 s on mysql-8.0. That step:

  • records and compares the corpus: about 8 min;
  • runs the published patch, repeated-patch, legacy-marker and range-repair profiles: about 4 min;
  • runs the native restart and PHP takeover-refusal cases: about 5 min.

The profiles and restart cases use their own workflows and only the nodes the step starts.

What changes

  • A sixth part, restarts, in the MySQL, PostgreSQL and SQLite jobs (134d822).
    • A shared step, "Start the published PHP and native nodes the corpus parts share", runs in both the corpus and restarts parts.
    • The corpus part records and compares the corpus.
    • The restarts part runs the profiles and restart cases.
    • Every check still runs exactly once per database.
    • The SQLite job scopes its resources per step, so its RESOURCE_SCOPE env now follows each of the three steps. The Docker isolation policy caught this missing in a first draft; without it the later steps would have started unscoped containers.
  • Bounded readiness probes (41f4655). Every /api/ready probe now passes --connect-timeout 2 --max-time 5, so one accepted but silent connection can't hold a curl until the 60-minute job limit (Cloud's review of 058861c).

Tests

  • ServerParityPartsTest.mjs now requires:
    • six parts;
    • the shared node start in exactly the corpus and restarts parts;
    • the profiles and restart cases only in restarts, and none of them in the corpus comparison;
    • a bounded request on every readiness probe.
  • The new cases fail against the previous workflow (3 of 4 parts tests fail).
  • Locally: parts test 5/5, actionlint, the Docker isolation policy, and the public boundary check.

Expected effect. The corpus part drops to about 11 to 12 min and the restarts part takes about 12 min, so the slowest part becomes sdk-directions or native-tests at about 16 min, down from about 20. I'll post the measured per-part times from this PR's run.

🤖 Generated with Claude Code

rmcdaniel and others added 3 commits October 25, 2026 05:48
With corrected markers in their own part, the corpus part is the Shared
Server fixtures' long pole: 17 to 21 minutes, almost all of it one step
(1031 s on mysql-8.0 in run 40162397220). That step records and compares
the corpus (about 8 minutes), then runs the published patch,
legacy-marker and range-repair profiles and the native restart and PHP
takeover-refusal cases (about 9 minutes). The second half uses its own
workflows and only the nodes the step starts.

Each database job now runs a sixth part, restarts. A shared step starts
the published PHP and native nodes in both the corpus and restarts parts.
The corpus part records and compares the corpus, and the restarts part
runs the profiles and restart cases. Every check still runs exactly once
per database. The SQLite job's step-level RESOURCE_SCOPE follows each of
its split steps (the Docker isolation policy caught it missing).

The parts test now requires six parts, the shared node start in exactly
the corpus and restarts parts, the profiles and restart cases only in
restarts, and none of them in the corpus comparison. It fails against
the previous workflow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cloud's review of #756 (wrapper review at 058861c) found that the
readiness loops bound their attempts but not each request. One accepted
but silent connection could hold a curl until the 60-minute job limit,
despite the 30-attempt loop. Every /api/ready probe in the fixtures
workflow now passes --connect-timeout 2 --max-time 5. The parts test
requires it of every probe.

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

Copy link
Copy Markdown
Member Author

Cloud's bounded read-only wrapper review accepts exact head bc95d005514e8278c66942abd60914c89ff3df5e within scope: .github/workflows/server-parity.yml resource startup, step guards, readiness, evidence and cleanup. No native/shared/frozen implementation, stopped inspector evidence or fixture execution was inspected or run.

All122 docker run command bodies match the accepted#756 workflow exactly after normalizing the added --connect-timeout 2 --max-time 5 flags. All21 readiness probes now have those request bounds. The shared node-start step is enabled for both corpus and restarts, each part keeps its own runner/DB/network, SQLite retains the explicit step-level resource scope, and the existing always-run cleanup/artifact naming covers the new part. Corpus result assertions remain explicit after comparison; the new profile step still fails on command failure.

No additional wrapper finding or Cloud hold. Native behavior, full CI success and measured throughput improvement remain the owner's separate qualification gates. Any later workflow/head change needs its own scoped recheck.

The SQLite job started its PHP maintenance container after the corpus
step's CLI download, which the split left in the corpus comparison. The
restarts part's published patch profile pauses and resumes that loop
(Server #721) and first requires it running, so on run 40167441821 it
failed at once (job 121092116756) without any fixture difference. The
MySQL and PostgreSQL jobs already start theirs with the other nodes.

The shared node start now starts the loop in every job, and the parts
test requires that. The new assertion fails against bc95d00.

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

Copy link
Copy Markdown

@rmcdaniel
rmcdaniel merged commit 7ede756 into main Oct 25, 2026
104 of 107 checks passed
@rmcdaniel

Copy link
Copy Markdown
Member Author

Merged as 7ede756, pinned to the reviewed head a0ba83a95716174c8a9ae2e97cb64e7ba672d5fc. Main's tree 3f003815 is that head's tree.

Checks at the head. Required PHPUnit Feature, Public Boundary, SonarQube and Shared Server fixtures all passed. The fixtures run (40169120328) needed one rerun of two failed jobs. Both failures were reference-side PHP repair-pass races, recorded on #754 (comment 6394576240), and both jobs passed on attempt 2.

Measured on attempt 1 (job start to finish):

Part Before #757 After
corpus (all backends) ~20 min, the slowest part 6–12 min
restarts (new part) inside corpus 11–13 min

The slowest part is now native-tests on the existing PHP MySQL matrix, at 18 min, followed by sdk-directions at 14–16 min. The whole attempt took 24 min of wall time from first job start to last job end, queueing included.

The next CI change goes after native-tests. Further fixture parts stay on the one-activation-at-a-time queue.

@rmcdaniel
rmcdaniel deleted the rust-325-ci-corpus-restarts branch October 25, 2026 07:09
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
…low-stream-writes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
…st-325-ci-codec-one-job

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
…nto rust-325-workflow-import

Native now serves 139 route methods: main's 138 plus embedded v2 import.
The runtime keeps both new modules, and the comparator node test list
keeps both sides' tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
…nto rust-325-record-local-activity

The worker capability manifest keeps this branch's local activity entries
and main's worker session and update validation entries. The comparator,
probe and node test lists keep both sides' fixtures and tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
…nto rust-325-cancellation-scopes

Workflow-task completion admits cancellation scopes before it guards
worker-session commands, in published 2.11.1's order. A scheduled
activity's options keep main's worker session and add its cancellation
scope, as PHP's bridge appends it. Native serves 141 route methods;
cancellation scope checkpoints stay missing. The probe timeout chain and
the comparator node test list keep both sides' entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
) into rust-325-nexus-operations

Native now serves 140 route methods: main's 138 plus the two
caller-indexed Nexus operation reads. The comparator node test list keeps
both sides' tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rmcdaniel added a commit that referenced this pull request Oct 25, 2026
) into rust-325-workflow-stream-writes

Native now serves 140 route methods: main's 138 plus durable workflow
stream appends and closes. The comparator node test list keeps both
sides' tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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