Skip to content

compile-cache-e2e dead-peers 'never-accepting' timing ceiling overruns on Windows release runners #1739

Closed

Description

@christianparpart

compile-cache-e2e's "dead peers" case fails intermittently on the Windows release legs. Its never-accepting timing ceiling is exceeded by 0.6 to 1.1 s:

Run Branch Leg Reported Ceiling
39862992304 (job 120118169777) master Windows-cl-release, clang-cl 8132 ms 7000 ms
40753758521 (job 123047155713) feature/1728-fleet-compile-queue (#1737) Windows-cl-release, cl 7602 ms 7000 ms

The ceiling is (2N - 1/2) x deadline for N=2 exchanges (scripts/compile-cache-e2e.sh ~line 900–950). A rerun passed both times. The PR run had passed on that branch's two previous heads, which do not touch the cache dial.

Measured: two overruns, both on Windows GitHub runners, both on the never-accepting peer. Each reported 2 traced exchanges over 2 connections.

Inferred, not measured: a slow runner charges the time to the exchange deadline. In the master run, ran out of budget on the manifest fetch suggests that the per-exchange total, not the connect, is what stretches. Whether that is timer granularity, scheduler delay or a real overrun in the budget accounting is undetermined.

To decide:

  • Does the launcher overrun its own configured deadline, which would be a defect?
  • Or is the ceiling too tight for a loaded Windows runner? Per the testing rules, the fix is then to judge against something a slow host cannot fake, not to raise the number.

Per testing.md, run scripts/flake-rate.sh before deciding.

Activity

  1. christianparpart commented on Oct 28, 2026

    @christianparpart
    MemberAuthor

    Analysis against scripts/compile-cache-e2e.sh §8b, the comment above dead_connect_ms:

    • The ceiling is (2N - 1/2) x TOTAL = 7000 ms. It tolerates a host stall of up to 3000 ms past the floor of N x TOTAL = 4000 ms.
    • 7602 ms is a stall of about 3600 ms. That matches the round-9 note, "3616 ms for two 1000 ms dials" on a starved runner. A host stall is the plausible reading.
    • 8132 ms is past 2N x TOTAL = 8000 ms, which is the figure a launcher that doubled its deadline reports (measured 8006–8017). Time alone cannot separate "the exchange doubled" from "the host stalled 4.1 s".

    So this is the case the rules describe: a time bound that measures the HOST, as rounds 8 and 9 already found on the other legs. The other legs moved from time to a COUNT for this reason.

    Raising the 7000 is not the fix. It would stop catching a doubled TOTAL. Candidate directions, each still needs a decision:

    1. Have the launcher trace each exchange's own deadline expiry (armed at, fired at, on its monotonic clock). Judge "did it honour TOTAL" per exchange from that trace, not from the summed direct-ms + cache-ms. A stall between exchanges would then not count against either one.
    2. Keep the summed ceiling, but record a scheduling witness alongside it, such as a sibling process's tick drift over the same window. When the witness shows the host starved, report INCONCLUSIVE, which is a third outcome, not a pass.

    Not a regression from #1737: it fails on master (run 39862992304), and #1737 does not touch the cache dial.

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

    status/needs-triageNot yet typed or assigned an areatype/bugBehaves incorrectly against its stated contract

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions