Skip to content

CI: lift the adaptive job's quarantine of TestRampH1Sync and TestRampH1Async once #674 is on main (>= 6 green GitHub-hosted runs) #708

Description

@FumingPower3925

What is quarantined

The adaptive job's race step ("Adaptive — race tests (memlock raised, up-switch required)" in .github/workflows/ci.yml) runs go test -race ... -skip '^(TestRampH1Sync|TestRampH1Async)$' ./adaptive/.... These two tests are the only CI coverage at the scale celeris#662 is about: 2048 connections promoted and reverted on a GitHub-hosted runner.

The workflow rule is that every quarantine has an open issue and is removed when that issue closes. The entry was there for celeris#657 and celeris#662. #657 was closed by #681 and #687. #662 closes when PR #674 merges. After that, this issue is the one tracking the entry.

What failed before

What #674 shows locally

  • r6 gate (2026-09-20, 53b52f1): both tests passed in 6 of 6 containers, with 0 errors in 13,260,792 requests. The outgoing epoll held 0 of 2048 in every high phase.
  • r6/fix re-gate (2026-09-26, 1d90b5d, under the load described above): both tests passed in 4 of 4 containers. There were 2 dial: reset errors in 3,612,871 requests: handshakes still in flight when a listener closed, which closing a listen socket cannot avoid.
  • Review round 4 (2026-09-27, c12d1b8, the same product code and ./adaptive tests as the head 7aeb2ec): 1 full ./adaptive container with other containers beside it. Both tests passed, with 0 errors in 1,455,255 requests.

None of this has run on a GitHub-hosted runner yet. That runner is the shape in which celeris#686's resets were seen, which is why the quarantine stays in place until the lift rule is met.

What it takes to lift

The lift rule is at least 6 GitHub-hosted runs of identical bytes, all green:

  1. Once fix(engine): keep serving on a paused listener for 1.5 s with TCP_DEFER_ACCEPT cleared, so a switch or PauseAccept no longer resets clients that had not yet sent a request (celeris#662, #675) #674 is on main, run the adaptive job's race step with the -skip removed. Raise memlock and set CELERIS_REQUIRE_UPSWITCH=1, as the step already does. Do this 6 times on GitHub-hosted runners, for example on a draft PR that changes only that line, re-run 5 times.
  2. Every run must pass both tests. Record each ramp phase's epoll= / io_uring= placement, the err= census, and each ramp's ramp complete: ok= throughput from the log.
  3. Delete the -skip, and add both names to the step's tally: exactly one top-level RUN and one PASS each, and no SKIP line. That keeps them from going quiet again.

If a run fails, classify the failure before re-quarantining: placement (#657's class), a dial-time reset at a listener close (inherent), or something new. Classify it against the r6 gate, not the re-gate. In the r6 gate main passed every ramp run, so "main fails this too" is not a known baseline. Put the ramp's throughput beside each failure, because each of main's local failures came with throughput well below the gate's. Keep this issue open until the tally is in place.

Evidence (local, under evidence/celeris-662/):

  • r6/round4/r43/RAMP-BASELINE.txt (python3 r6/round4/r43/tools/ramp-baseline.py): every container above, per arm, with the two runs kept apart and each ramp's throughput.
  • r6/ship/RAMP-RESET-CENSUS.txt: the per-arm error census of both runs. Its r6-gate header says 2026-09-26, but that gate ran on 2026-09-20 (r6/round4/30-CORRECTIONS.md §3).
  • r6/fix/G5-TALLY.txt
  • r6/gate/02-G5-TALLY.txt

Edited 2026-09-27 (PR #674, review round 4.3). Main's baseline used to be one pooled figure ("failed in 3 of 4 containers ... 2 of 4 ... 6,615 read: reset"). That figure came from the loaded re-gate alone and included P7's main arm, which #674 marks contaminated. It left out the r6 gate, where main passed every ramp run. The two runs are now shown separately.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/ciCI/CD pipelinetestingTesting infrastructure and helpers

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions