Skip to content

gc: two rooting gap tests crash on macOS under PERRY_NO_AUTO_OPTIMIZE=1 while Linux passes them (untriaged) #7606

Closed

Description

@proggeramlug

Found in passing during #7599's known-failures audit, on the shared dev Mac
(macOS arm64, perry-dev profile, current main of 2026-08-08):

test_gap_gc_rest_argument_rooting and
test_gap_gc_same_module_call_argument_rooting crash on macOS when compiled
with PERRY_NO_AUTO_OPTIMIZE=1
, while Linux (the gap_snapshot baseline
platform) records both as passing.

Not yet triaged — this issue exists so the observation is not lost. Three
things whoever picks it up should know:

  1. These are gc rooting acceptance tests (the gc(layer 3): from-space quarantine catches 55 stale dereferences across the gap suite — the instrument is in CI but aimed at one synthetic fixture #7341 family), so a platform-
    split crash is potentially a real macOS-only rooting hole, not a harness
    quirk — the auto-opt and no-auto-opt runtimes differ in feature set and
    link layout, and the no-auto-opt arm is the one ordinary perry compile
    users get when the auto-opt path is bypassed.
  2. test_gap_gc_same_module_call_argument_rooting has crashed spuriously
    before — during a disk-full window on 2026-08-07 it recorded a crash that
    re-ran 10/10 clean afterwards (fix(runtime): a Map/Set subclass in a base-typed binding was read as a raw header (#7570) #7573's report). First step is therefore
    reproduce N/N on a healthy machine before believing it; the test(parity): make known_failures.json a ratchet, not a suppression list (#7582) #7599 agent
    saw it in passing, not under controlled conditions.
  3. If it reproduces, the instruments are PERRY_GC_ZEAL=1 PERRY_GC_PROTECT_FROMSPACE=1 PERRY_GC_DIAG=1 — but note gc: zeal + compiled loop polls performs zero copying minors on compute-only benches — green instrument runs may be vacuous #7604: on
    compute-only shapes the zeal recipe can arm without ever firing, so check
    retired_set= lines actually appear before trusting a clean run.

Activity

  1. proggeramlug commented on Aug 10, 2026

    @proggeramlug
    ContributorAuthor

    Closing as not reproducible on current main (v0.5.1432), with the instrument proven live rather than merely quiet.

    Baseline, the issue's own configuration:

    test result
    test_gap_gc_rest_argument_rooting 10/10 clean under PERRY_NO_AUTO_OPTIMIZE=1
    test_gap_gc_same_module_call_argument_rooting 10/10 clean

    Under the full investigation pairing — PERRY_GC_ZEAL=1 PERRY_GC_PROTECT_FROMSPACE=1 PERRY_GC_PROTECT_FROMSPACE_DEPTH=800 (depth 800 because #7154's own reproducer needed it; the default of 4 is far too small for real code):

    rest_argument       exit 0   [gc-zeal] forced_collections=379 copying_minors=379 moved_objects=115536 loop_polls=9648
    same_module_call    exit 0   [gc-zeal] forced_collections=749 copying_minors=749 moved_objects=231012 loop_polls=19248
    

    Since #7604 that verdict line exits 70 if forced collections or copying minors are zero, so a clean exit here is a positive statement that the collector ran — 379 and 749 evacuating minors relocating 115,536 and 231,012 objects, under an mprotected from-space quarantine, with no fault.

    The disk-full precedent this issue cites (#7573) was also checked: free space stayed at 39 GB throughout, never close to full. Not a factor.

    One incidental result worth recording, since it validates #7729 in the field: those same two tests previously reported 9,653 and 19,253 forced collections. They now report 379 and 749 — with moved_objects essentially unchanged (115,536 vs 115,728; 231,012 vs 231,348). Same relocation work, ~1/25th the collections. That is exactly what allocation-paced zeal was supposed to do.

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

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions