From a249c6bf359bacfa2056621a92874764bac5db1f Mon Sep 17 00:00:00 2001 From: Patrick O'Reilly
Date: Thu, 17 Sep 2026 01:57:05 -0700 Subject: [PATCH] ci: make the arm orlyc repro dispatch-only, and say what it is for (#556) The workflow carried `push: branches: [feat/548-multiarch-image]` because `workflow_dispatch` only works once a workflow exists on the default branch, and the diagnostic had to run before anything merged. That branch merged in #552 and has been deleted, so the trigger now names nothing; the file's own comment said to drop it once the arm question was answered, and #554 answered it. Rewrite the header too. It was written as a one-shot "why does orlyc hang", which is now history rather than instructions. What matters to whoever reads it next is why it is kept: it is the only thing in CI that runs orlyc on arm, and it has to be a RELEASE build, because #554 was an optimiser hoist that -O0 does not reproduce -- 15 pre-fix debug runs were clean while release wedged on the first attempt, 3 out of 3. Still not a gate. #556 tracks whether it should become one. --- .github/workflows/orlyc-arm-repro.yml | 41 +++++++++++++-------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/.github/workflows/orlyc-arm-repro.yml b/.github/workflows/orlyc-arm-repro.yml index 51ad7d9c..d565ef74 100644 --- a/.github/workflows/orlyc-arm-repro.yml +++ b/.github/workflows/orlyc-arm-repro.yml @@ -1,33 +1,32 @@ -# One-shot diagnostic for #554: why does `orlyc` hang on aarch64? +# Compiles one package with a RELEASE `orlyc` on each arch, with a deadline and +# a stack dump on expiry. Written to answer #554 -- why `orlyc` hung on aarch64 -- +# and kept because it is the only thing in CI that exercises that path on arm. # -# The profiling round answered #548's original question and produced a better -# one. `jhm -c release` is FINE on arm -- 482s inside docker, 8m06s on the bare -# runner, both faster than the amd64 leg's 11m05s. What hangs is the NEXT docker -# step: compiling the example packages with the freshly built orlyc, which -# emitted its header line and then nothing for 37 minutes. +# What it covers that nothing else does. `make debug` and `make test` never run +# `orlyc`'s embedded mem-sim server, and `lang_test.py` is not in the arm job -- +# which is why #550 could report 1753 clean build jobs and 203 passing test +# binaries on aarch64 while this was broken. # -# Per the Dockerfile's own comment, "each orlyc run stands up and tears down its -# embedded mem-sim server" -- so the suspicion is that server never completes its -# handshake or teardown on aarch64. +# Why RELEASE specifically. #554 was the optimiser hoisting a thread-pointer read +# out of a loop, so a fiber that had migrated OS threads switched back onto +# another thread's scheduler stack. `-O0` does not hoist: 15 pre-fix debug runs +# were clean while release wedged on the first attempt, 3 out of 3. A debug-build +# guard would have caught nothing, and the same is true of the next defect of this +# shape. See #556 for whether this should become a gate. # -# `make test` does not exercise the orlyc shell-out path and lang_test.py is not -# in the arm job, which is why #550 could be green while this was broken. -# -# This reproduces it in ~9 minutes instead of a 45-minute docker build, and if it -# hangs, says WHERE: thread backtraces, kernel wait channel, and process state. -# amd64 runs as the control -- orlyc demonstrably works there. +# Cost is ~9 minutes because it builds the `orly/orlyc` target alone rather than +# the whole tree, so it never pays for the full-tree LTO link. amd64 runs as the +# control. # # Deliberately not a gate. name: orlyc-arm-repro on: + # Dispatch-only. It carried a temporary branch-scoped `push:` trigger while it + # lived on a feature branch, because `workflow_dispatch` only works once a + # workflow exists on the default branch; that constraint is gone now the file + # is on master, and the branch it named no longer exists. workflow_dispatch: - # TEMPORARY, and the reason is a GitHub constraint rather than a preference: - # `workflow_dispatch` is only dispatchable once the workflow exists on the - # DEFAULT branch, and this diagnostic needs to run before anything merges. - # Drop this trigger (or the whole file) once #548's arm question is answered. - push: - branches: [feat/548-multiarch-image] jobs: repro: