Skip to content

Add GHA coordinator for performance evaluation task scatter/gather#791

Merged
cjonas9 merged 120 commits into
mainfrom
gha-coordinator
Jul 10, 2026
Merged

Add GHA coordinator for performance evaluation task scatter/gather#791
cjonas9 merged 120 commits into
mainfrom
gha-coordinator

Conversation

@cjonas9

@cjonas9 cjonas9 commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

What

Adds a GitHub Actions coordinator (load-test-coordinator.yml) that, on a push to a release/** branch, launches the release performance-evaluation leg(s) as callable workflows and posts their consolidated results as a sticky comment on the release PR. The apply-load ingest load test (#741) is adapted into a callable leg that reports back (outputs + an S3 result object) instead of commenting itself:
image

Decomposes a great deal of the existing infrastructure into more modular components for future coordinator-driven load test. Of the diff, +870/-721 of it is purely refactoring existing code into a new harness package, so review of it does not necessarily have to be as thorough as coordinator-heavy sections. Here is the breakdown of that:

  • Generic code lifted out of runner/orchestrate.go and runner/instantiate.go into an importable harness package, mechanical changes only
    • package consists of gather.go, s3.go, exec.go, harness.go, and harness_test.go
  • Generic code lifted out of run-load-test.sh and placed into bootstrap-common.sh mostly as helper functions
    • run-load-test.sh is now extremely slim and only serves to actually run the ingestion load test
  • Generic code lifted out of load-test.yml and put in ec2-leg.yml, which handles the EC2 lifecycle with no test-specific hardcoding

Results of the load tests are commented on a sticky comment on the release PR. If >1 push is made/multiple runs are requested, previous run's results are folded into dropdown menus like this:


🧪 Performance Evaluation Test #N...
[recent results for run N]

Performance Evaluation Test #N-1 `[results for run N-1]`
Performance Evaluation Test #... `[results for run ...]`
Performance Evaluation Test # 1 `[results for run 1]`

Or, you can just look in the comments below to see how this looks!

The high-level flow of the coordinator is below:

flowchart TB
  trigger["push to release/** "] --> plan["perf-eval-coordinator.yml<br/>- plan<br/>- resolve ref + PR"]
  plan --> lt["load-test.yml<br/>runs synthetic ledger ingestion test"]
  plan -.-> future["future legs"]
  lt --> report["report<br/>aggregate → sticky PR comment"]
  future -.-> report
Loading

Why

This is so that the remaining perf-eval tests slot in cleanly: each new test becomes another callable leg the coordinator launches and folds into the same report, with no per-leg reporting or permissions plumbing to duplicate.

Known limitations

N/A. Remaining work for the epic this task is a part of mainly includes finishing off the other perf eval tasks (only the ingest load test is complete at this point).

cjonas9 added 30 commits May 8, 2026 21:32

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0d93c0080f

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread .github/workflows/e2e.yml Outdated
Comment thread .github/workflows/ec2-leg.yml Outdated
Comment thread .github/workflows/load-test-coordinator.yml Outdated
Shaptic
Shaptic previously approved these changes Jul 9, 2026

@Shaptic Shaptic left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome! Final result is way more concise and easier to read, glad we iterated on this 👍

@Shaptic Shaptic dismissed their stale review July 9, 2026 21:09

Gonna neg my approval until things pass 😄 since it'll imply more changes, but LGTM otherwise! I can just review the follow-up commits.

Comment thread .github/workflows/ec2-leg.yml
Comment thread .github/workflows/ec2-leg.yml Outdated
Comment thread .github/workflows/ec2-leg.yml
@cjonas9 cjonas9 merged commit 04968c0 into main Jul 10, 2026
17 checks passed
@cjonas9 cjonas9 deleted the gha-coordinator branch July 10, 2026 18:30
marwen-abid added a commit to marwen-abid/stellar-rpc that referenced this pull request Jul 12, 2026
…ison (stellar#775)

Add an advisory "Full History Benchmarks" workflow that runs the
bench-ingest/bench-query commands on every pull request against a
defined dataset and flags statistically significant slowdowns before
they land. Per the team's benchmarking research, the PR lane pairs
rather than pins: the PR base and head builds are benchmarked
interleaved on the same runner, so machine noise hits both sides
equally, and no stored wall-time baseline is ever trusted across
machines. Wall-time trend tracking (pinned box, GCS series,
change-point detection) stays a follow-up; this lane is deliberately
secret-free and runner-agnostic.

- `bench-ingest fixture` generates the defined dataset: a synthetic
  chunk pack whose event-ledger transactions derive their source
  accounts from (seed, seq) — same seed, byte-identical pack. The test
  helper writeSourcePack now delegates to it, so the whole existing
  bench test suite validates the generator.
- `bench-compare` judges repeated CSV runs of two builds per gated
  metric on three axes: an exact permutation test on the per-run means
  at the Bonferroni-corrected level alpha/m — fork calibration showed
  that without the correction a ~20-metric gate false-positives on
  most runs, exactly MongoDB's published experience — a --min-effect
  floor (default 5%) below which significant deltas are still too
  small to matter, and a --max-noise class (default 10% within-side
  spread, extremes trimmed) that reports a benchmark as unstable
  instead of gating on it. Regressions exit non-zero naming the
  metric; a Markdown table lands in the job summary.
- scripts/bench-ci/run.sh owns the workload (fixture generation, cold
  + hot ingest, cold + hot query sweeps, one --out per run, sides
  alternating per run, 6 runs per side so the corrected significance
  level stays reachable) and runs locally with no network;
  scripts/bench-ci/metrics.csv lists the gated metrics — CPU-bound
  rows only, fsync-bound hot commit and source-wait rows excluded by
  design.
- The workflow reuses .github/actions/setup-go (cached zstd/RocksDB)
  and rust-cache, self-compares when there is no PR base (a noise-floor
  check for manual/nightly runs), skips comparison when the base build
  predates the bench commands, and uploads all CSVs as artifacts. Its
  name stays outside the required_status_check.yml gate prefixes, so
  it is advisory, not merge-blocking.

The EC2 perf-eval coordinator on main (stellar#791) is complementary: it
drives load tests on ephemeral cloud boxes with AWS credentials; this
lane needs no secrets and gates library-level regressions per PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
marwen-abid added a commit to marwen-abid/stellar-rpc that referenced this pull request Jul 12, 2026
…ison (stellar#775)

Add an advisory "Full History Benchmarks" workflow that runs the
bench-ingest/bench-query commands on every pull request against a
defined dataset and flags statistically significant slowdowns before
they land. Per the team's benchmarking research, the PR lane pairs
rather than pins: the PR base and head builds are benchmarked
interleaved on the same runner, so machine noise hits both sides
equally, and no stored wall-time baseline is ever trusted across
machines. Wall-time trend tracking (pinned box, GCS series,
change-point detection) stays a follow-up; this lane is deliberately
secret-free and runner-agnostic.

- `bench-ingest fixture` generates the defined dataset: a synthetic
  chunk pack whose event-ledger transactions derive their source
  accounts from (seed, seq) — same seed, byte-identical pack. The test
  helper writeSourcePack now delegates to it, so the whole existing
  bench test suite validates the generator.
- `bench-compare` judges repeated CSV runs of two builds per gated
  metric on three axes: an exact permutation test on the per-run means
  at the Bonferroni-corrected level alpha/m — fork calibration showed
  that without the correction a ~20-metric gate false-positives on
  most runs, exactly MongoDB's published experience — a --min-effect
  floor (default 5%) below which significant deltas are still too
  small to matter, and a --max-noise class (default 10% within-side
  spread, extremes trimmed) that reports a benchmark as unstable
  instead of gating on it. Regressions exit non-zero naming the
  metric; a Markdown table lands in the job summary.
- scripts/bench-ci/run.sh owns the workload (fixture generation, cold
  + hot ingest, cold + hot query sweeps, one --out per run, sides
  alternating per run, 6 runs per side so the corrected significance
  level stays reachable) and runs locally with no network;
  scripts/bench-ci/metrics.csv lists the gated metrics — CPU-bound
  rows only, fsync-bound hot commit and source-wait rows excluded by
  design.
- The workflow reuses .github/actions/setup-go (cached zstd/RocksDB)
  and rust-cache, self-compares when there is no PR base (a noise-floor
  check for manual/nightly runs), skips comparison when the base build
  predates the bench commands, and uploads all CSVs as artifacts. Its
  name stays outside the required_status_check.yml gate prefixes, so
  it is advisory, not merge-blocking.

The EC2 perf-eval coordinator on main (stellar#791) is complementary: it
drives load tests on ephemeral cloud boxes with AWS credentials; this
lane needs no secrets and gates library-level regressions per PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
marwen-abid added a commit to marwen-abid/stellar-rpc that referenced this pull request Jul 14, 2026
…ison (stellar#775)

Add an advisory "Full History Benchmarks" workflow that runs the
bench-ingest/bench-query commands on every pull request against a
defined dataset and flags statistically significant slowdowns before
they land. Per the team's benchmarking research, the PR lane pairs
rather than pins: the PR base and head builds are benchmarked
interleaved on the same runner, so machine noise hits both sides
equally, and no stored wall-time baseline is ever trusted across
machines. Wall-time trend tracking (pinned box, GCS series,
change-point detection) stays a follow-up; this lane is deliberately
secret-free and runner-agnostic.

- `bench-ingest fixture` generates the defined dataset: a synthetic
  chunk pack whose event-ledger transactions derive their source
  accounts from (seed, seq) — same seed, byte-identical pack. The test
  helper writeSourcePack now delegates to it, so the whole existing
  bench test suite validates the generator.
- `bench-compare` judges repeated CSV runs of two builds per gated
  metric on three axes: an exact permutation test on the per-run means
  at the Bonferroni-corrected level alpha/m — fork calibration showed
  that without the correction a ~20-metric gate false-positives on
  most runs, exactly MongoDB's published experience — a --min-effect
  floor (default 5%) below which significant deltas are still too
  small to matter, and a --max-noise class (default 10% within-side
  spread, extremes trimmed) that reports a benchmark as unstable
  instead of gating on it. Regressions exit non-zero naming the
  metric; a Markdown table lands in the job summary.
- scripts/bench-ci/run.sh owns the workload (fixture generation, cold
  + hot ingest, cold + hot query sweeps, one --out per run, sides
  alternating per run, 6 runs per side so the corrected significance
  level stays reachable) and runs locally with no network;
  scripts/bench-ci/metrics.csv lists the gated metrics — CPU-bound
  rows only, fsync-bound hot commit and source-wait rows excluded by
  design.
- The workflow reuses .github/actions/setup-go (cached zstd/RocksDB)
  and rust-cache, self-compares when there is no PR base (a noise-floor
  check for manual/nightly runs), skips comparison when the base build
  predates the bench commands, and uploads all CSVs as artifacts. Its
  name stays outside the required_status_check.yml gate prefixes, so
  it is advisory, not merge-blocking.

The EC2 perf-eval coordinator on main (stellar#791) is complementary: it
drives load tests on ephemeral cloud boxes with AWS credentials; this
lane needs no secrets and gates library-level regressions per PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
marwen-abid added a commit to marwen-abid/stellar-rpc that referenced this pull request Jul 15, 2026
…ison (stellar#775)

Add an advisory "Full History Benchmarks" workflow that runs the
bench-ingest/bench-query commands on every pull request against a
defined dataset and flags statistically significant slowdowns before
they land. Per the team's benchmarking research, the PR lane pairs
rather than pins: the PR base and head builds are benchmarked
interleaved on the same runner, so machine noise hits both sides
equally, and no stored wall-time baseline is ever trusted across
machines. Wall-time trend tracking (pinned box, GCS series,
change-point detection) stays a follow-up; this lane is deliberately
secret-free and runner-agnostic.

- `bench-ingest fixture` generates the defined dataset: a synthetic
  chunk pack whose event-ledger transactions derive their source
  accounts from (seed, seq) — same seed, byte-identical pack. The test
  helper writeSourcePack now delegates to it, so the whole existing
  bench test suite validates the generator.
- `bench-compare` judges repeated CSV runs of two builds per gated
  metric on three axes: an exact permutation test on the per-run means
  at the Bonferroni-corrected level alpha/m — fork calibration showed
  that without the correction a ~20-metric gate false-positives on
  most runs, exactly MongoDB's published experience — a --min-effect
  floor (default 5%) below which significant deltas are still too
  small to matter, and a --max-noise class (default 10% within-side
  spread, extremes trimmed) that reports a benchmark as unstable
  instead of gating on it. Regressions exit non-zero naming the
  metric; a Markdown table lands in the job summary.
- scripts/bench-ci/run.sh owns the workload (fixture generation, cold
  + hot ingest, cold + hot query sweeps, one --out per run, sides
  alternating per run, 6 runs per side so the corrected significance
  level stays reachable) and runs locally with no network;
  scripts/bench-ci/metrics.csv lists the gated metrics — CPU-bound
  rows only, fsync-bound hot commit and source-wait rows excluded by
  design.
- The workflow reuses .github/actions/setup-go (cached zstd/RocksDB)
  and rust-cache, self-compares when there is no PR base (a noise-floor
  check for manual/nightly runs), skips comparison when the base build
  predates the bench commands, and uploads all CSVs as artifacts. Its
  name stays outside the required_status_check.yml gate prefixes, so
  it is advisory, not merge-blocking.

The EC2 perf-eval coordinator on main (stellar#791) is complementary: it
drives load tests on ephemeral cloud boxes with AWS credentials; this
lane needs no secrets and gates library-level regressions per PR.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Release Eval: Add the coordinator GitHub Action

4 participants