Skip to content

Tracker: Faster, More Targeted Test Fixture Releases #2736

@danceratopz

Description

@danceratopz

This issue encompasses 2 goals for test fixture releases:

  1. Higher mainnet release cadence, i.e., more regular releases of test cases for stable forks.
  2. Faster release builds, in particular, for development releases. i.e., we can quickly generate releases that target specific development work (e.g., bal-devnet-3 or benchmark).

Goal 2. could also help unlock more finely grained releases, e.g., for every individual EIP, e.g., eips/amsterdam/eip-2780, but we should verify with client teams whether this would be beneficial - our releases should match client teams branches as close as possible.

Important

Implication: If we only fill for the development fork in dev releases, clients need to consume two artifacts from two separate releases for full coverage and no regressions:

  1. fixtures_mainnet.tar.gz.
  2. fixtures_<dev_feature_name>.tar.gz.

Subtasks

Higher Mainnet Release Cadence

#2592 mainly solved 1., but requires team agreement/alignment and some follow-up work (only docs?). Essentially, as of now, we can readily create fixtures_mainnet (~1hr30). More info below, but TLDR: fixtures_mainnet replaces fixtures_stable and fixtures_develop has been removed.

Faster Release Builds

This issue proposes that we achieve faster development release builds by:

  1. Only filling the development fork in development releases — e.g., for devnet releases like bal-devnet-4, --until=Amsterdam (previously used for client-team convenience) would change to --fork=Amsterdam.
  2. Improving the parallelization strategy in multi-runner release generation from a naive per-fork split to use pytest-split (or other strategy) that load balances the run across multiple runners.

Target: Difficult to judge upfront, but >2x speedup vs. current development release build time via fork split.

We have two bottlenecks in fixture generation: Compute and Memory. #2592 parallelized compute by splitting test fixture generation over multiple runners by fork (facilitated by #2134). But this approach has the following drawbacks:

  1. Single-fork releases, e.g., benchmark, can not be parallelized.
  2. It's inefficient as runners are not well-balanced.
  3. Doesn't scale with new forks.

Btw, regarding memory, @fselmo has currently hit this hard and the situation should greatly improve. This issue only targets compute, currently.

Status Quo (pre-#2592): EEST Release Types

Up to and including Osaka, until #2592, we had two types of releases:

  1. "Full releases" which consist of two fixture artifacts:
    • fixtures_stable: fixtures for deployed forks.
    • fixtures_develop: superset of fixtures_stable plus fixtures for the current development fork.
  2. "Feature releases" of development forks which contain one artifact:
    • fixtures.

These release types originated in ethereum/execution-spec-tests and predate The Weld. In execution-spec-tests, multiple development forks resided alongside each other in the default branch (main). This is no longer the case in execution-specs where a branch only ever contains code targeting one development fork.

#2592 shook things up a little and removed "full" releases due to the following reasons:

  1. The develop artifact contained stable as a subset (redundancy).
  2. They're expensive to produce. The "full" release even generated stable and develop independently, i.e., all test cases filled for stable forks were filled twice!
  3. These releases were generated from the default branch, which doesn't reflect the current status of the development fork. Post-Weld, fixtures_develop gets quickly out-of-date with the current development focus.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-testsArea: Consensus tests.C-trackerCategory: Tracker—Meta-issues that collect many issues for progress monitoring

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions