Skip to content

Make Go ABI offset generation atomic #3234

Description

@MrAlias

Problem

#3221 adds generated Go runtime ABI facts alongside the existing generated offsets.json. The files are separate because go-offsets-tracker discovers only struct-field offsets and replaces its complete output, while the ABI generator also needs type sizes and constants.

The current workflow is safe for #3221: make update-offsets runs both generators, the scheduled workflow only commits after both succeed, and runtime decoding rejects an ungenerated future Go minor. However, maintaining two versioned artifacts for the same moduledata decoder creates a longer-term consistency risk. Their Go version coverage could drift, and an interrupted local update can temporarily leave only one artifact refreshed.

Goal

Make Go field-offset and runtime-ABI generation atomic, or enforce an equivalent invariant that prevents mismatched Go version coverage from being published or consumed.

Possible approaches

  • extend go-offsets-tracker to support type sizes and constants, allowing one generated artifact;
  • add one orchestration command that collects both result sets and invokes the tracker writer once;
  • retain separate artifacts but stage updates atomically and add explicit cross-artifact version validation.

The implementation should avoid duplicating the tracker's version discovery, caching, and third-party module behavior unless the benefits justify owning that logic.

Acceptance criteria

  • a mismatch between moduledata offset coverage and runtime ABI coverage fails generation or validation;
  • adding a stable Go minor updates all required metadata together;
  • existing standard-library and third-party offset tracking and caching remain intact;
  • an ungenerated future Go minor cannot silently use stale runtime ABI metadata;
  • make update-offsets and the scheduled update workflow use the resulting atomic or validated path.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions