Skip to content

Moving-GC witness gates misparse current copying-minor diagnostics as zero relocation #8049

Description

@proggeramlug

Failure

Two independent scheduled gates reach the moving-GC workload and match Node behavior, but their required relocation witness is zero in every arm:

The arms use PERRY_GC_INCREMENTAL=0, PERRY_CONSERVATIVE_STACK_SCAN=off, and PERRY_GC_FORCE_EVACUATE=1; the moving-witness workflow additionally enables PERRY_GC_MOVING_LOOP_POLLS=1. Thus this is not a silent no-GC run: collection and reclaim counters are live, but the relocation mechanism the assertions exist to cover is not.

Required investigation

  • Determine whether the selected cohorts are no longer copy-minor eligible, whether the force-evacuate knob no longer reaches the active collector path, or whether witness accounting stopped observing real moves.
  • Identify the first source change that explains both gate signatures, or prove they have distinct causes.
  • Preserve requires=move and the nonzero relocation assertions. A behavioral match with zero relocations is UNVERIFIED, not a pass.

Acceptance

  • Every requires-move arm demonstrates the intended relocation mechanism, not only collection/reclamation.
  • Oracle output remains byte-exact against Node.
  • A negative sabotage (or equivalent direct mechanism test) proves the witness can detect a stale pre-move root.

Refs #7966.

Activity

  1. changed the title [-]Moving-GC witness gates collect and reclaim but relocate zero objects[/-] [+]Moving-GC witness gates misparse current copying-minor diagnostics as zero relocation[/+] on Aug 13, 2026
  2. proggeramlug commented on Aug 13, 2026

    @proggeramlug
    ContributorAuthor

    Source attribution changes the diagnosis: the collector's reported zero is a harness parse result, not evidence that current copying minors truly moved zero objects.

    #7744 (b2aef5055) changed the diagnostic from the legacy shape

    [gc-copy-minor] ran copied_objects=...
    

    to the current key/value record

    [gc-copy-minor] ran in_place=... untraced=... ... copied_objects=... promoted_objects=...
    

    but scripts/gc_repsel_matrix.sh still uses this exact-prefix regex:

    grep -oE '\[gc-copy-minor\] ran copied_objects=[0-9]+'

    That expression cannot match any current-format ran line, whatever its object counts, so scavenged is forced to zero and every requires-move arm becomes UNVER. This exactly brackets the transition: the last successful main run was dc6721c7f before #7744; the first complete post-batch run was red.

    The correct liveness quantity is not copied_objects alone. gc/instruments.rs::note_copying_minor_moved already documents and implements copied + promoted, because object-by-object promotion relocates too (#7657). The parser must nevertheless exclude in_place=true, whose whole-block promotion moves nothing.

    The pending fix parses the record by field name, sums copied+promoted only for non-in-place cycles, and includes sabotage/self-tests for legacy format, current field ordering, ordinary promotion, and in-place promotion. The liveness requirement remains nonzero relocation; it is not weakened.

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