Skip to content

ci(xtest): run benchmarks through the local preparation path - #660

Draft
dmihalcik-virtru wants to merge 1 commit into
DSPX-4372-s5-basefrom
DSPX-4372-s5-ci
Draft

dmihalcik-virtru wants to merge 1 commit into
DSPX-4372-s5-basefrom
DSPX-4372-s5-ci

Conversation

@dmihalcik-virtru

Copy link
Copy Markdown
Member

Stage 5 of the six-stage plan.

Base: DSPX-4372-s5-base, an intermediate merge of #659 (stages 3–4), #622 (1 GiB payloads plus the bench-payloads/bench-budget-seconds inputs), and #647/#641 (otdf-local root-key and golden-key configuration, which CI needs once otdf-local starts the platform). It contains only those PRs plus conflict resolution. As they merge, this PR can be retargeted until it sits on main.

What it does

The bench job now runs the documented local sequence instead of its own installation and startup:

  1. resolve-versions: python -m perf.ci, the only adapter between dispatch inputs and the harness. It validates bench-refs (or each SDK's *-ref with the release as reference), payload sizes and budget using the same rules as a local run, then emits the matrix, the arm-scaled budget and a job timeout. It runs before any runner starts, and only when benchmarks are requested. A *-ref naming one build is now refused up front, rather than measuring nothing 45 minutes later.
  2. Each bench runner:
    • otdf-sdk-mgr install benchmark <sdk> <refs…> --platform <main sha> --otdfctl main
    • otdf-local up --services docker,platform
    • otdf-local env
    • pytest --bench with no arm options: the manifest names the arms.
  3. Neutral preparation (all refs at one commit): service startup is skipped and the run still reports NEUTRAL.
  4. Every exit path: results, the manifest and service logs are uploaded, and services are stopped.

One new input, bench-refs. The bench-baseline-ref/bench-candidate-ref inputs #621 proposed are not added. This job no longer uses the fixed-slot setup-cli-tool action; other jobs keep it.

Compatibility

  • Nightly defaults are unchanged: latest vs main per SDK, 1500 s, and a timeout derived from the budget.
  • A dispatch that relied on a single *-ref for benchmarks now fails in resolve-versions with an explanation.

Validation

  • 325 passed, including 21 for perf.ci. ruff, ruff format and pyright are clean. actionlint reports no new findings (14 SC2086 infos already exist on main).
  • Ran perf.ci and otdf-sdk-mgr install benchmark --help locally.
  • Not yet run, and required by the plan before this leaves draft:
    • dispatch smoke runs at 2, 3 and 4 arms;
    • the nightly default for go, java and js;
    • forced install, startup and benchmark failures, to exercise cleanup.
    • Two specific risks to check in those runs:
      • java source builds through otdf-sdk-mgr (the old job wrote a PLATFORM_BRANCH env file);
      • actions/setup-go with stable + GOTOOLCHAIN=auto replacing the platform action's Go setup.

Stage 5 of the DSPX-4372-t1 plan. The bench job now runs the documented local
sequence instead of its own installation and startup.

- perf/ci.py (new): the workflow's only input adapter. Validates bench-refs,
  the per-SDK *-ref fallbacks, payload sizes and budget with the harness's
  own rules, and emits the matrix, the arm-scaled budget and a job timeout.
  It runs in resolve-versions, before any runner starts, and only when
  benchmarks are requested.
- xtest.yml: one new bench-refs input (no bench-baseline-ref/candidate-ref).
  Each runner runs 'otdf-sdk-mgr install benchmark' (arms, platform at
  main's SHA, provisioning otdfctl at main), 'otdf-local up --services
  docker,platform', 'otdf-local env', then pytest with no arm options. A
  neutral preparation skips service startup and still reports. Results,
  the manifest and service logs are uploaded and services are stopped on
  every exit path. The fixed-slot setup-cli-tool action is no longer used
  by this job.
- test_benchmarks fixtures are lazy (stage 3), so the neutral path needs no
  platform.

Not yet verified: dispatch runs with two, three and four arms, and the
nightly default for go, java and js.

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.com>
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
C Security Rating on New Code (required ≥ A)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@coderabbitai

coderabbitai Bot commented Oct 19, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

dmihalcik-virtru added a commit that referenced this pull request Oct 23, 2026
…pted js installs (#667)

Part 2a of the [DSPX-4372-t1
plan](#657), split out of #626:
fixes the benchmark needs, which every `otdf-sdk-mgr` install benefits
from. **Based on `main`.**

### What it does
- **Bare repos refresh their branches.** `git clone --bare` records no
fetch refspec, so the `fetch --all --tags` before every checkout
refreshed tags only. Every branch stayed where the first clone found it,
and `install tip main` or `--platform main` built that stale commit.
`checkout.BARE_REFRESH` now fetches origin's branches into
`refs/remotes/origin/*` with `--prune`, for the SDK and platform bare
repos alike, and `checkout.upstream_ref` maps a branch name onto them.
Fetching into the bare repo's own `refs/heads/*` instead would move
branches that other worktrees have checked out, leaving their HEAD ahead
of their files, and would fail for good once upstream replaced a branch
`foo` with `foo/bar`.
- **Worktrees are detached** and reset to the refreshed ref. A branch
origin no longer has is refused rather than built from the clone's stale
copy, and `HEAD` means origin's default branch as of the clone; a
platform `HEAD` worktree used to reset to itself.
- **Go source rebuilds work a second time.** `checkout_go_from_platform`
reset an existing worktree to a `FETCH_HEAD` fetched into the bare repo,
which no worktree can see, so every rebuild after the first failed with
`pathspec 'FETCH_HEAD' did not match`. It now resets to the refreshed
ref, like the SDK and platform paths.
- **`install tip` reports checkout failures as errors.** A refused
branch, or a failed git command with git's stderr, now prints `Error: …`
and exits 1 for go, js and java, as the platform path already did,
instead of a traceback.
- **An interrupted js install leaves nothing behind.** #663 already
removes a partial `dist/` when npm fails. A Ctrl-C mid-install still
left a directory holding only `cli.sh`, which `install_release` then
skipped as installed from then on. Both js install paths now remove it
unless the install finished.
- `AGENTS.md` claimed the bare clone mapped `refs/heads/*`, which is
what hid the first bug. It and the code comments also said `git pull`
fails in a worktree; it merges origin's default branch into whatever is
checked out.

### Validation
- `uv run pytest` in `otdf-sdk-mgr`: 207 passed, and 321 at the top of
this track (#642). ruff, ruff format and pyright are clean.
- `test_checkout.py` runs real git against a local origin. Every shared
behaviour is parametrized over the SDK, go and platform entry points:
new and existing worktrees follow their branch, `HEAD` (including beside
a tag named `main`), a deleted branch is refused, tags and SHAs are
checked out and then reused, and a force-pushed `refs/pull/N/head` is
followed. This replaces the stubbed command-string test for platform PR
refs. SDK-only tests guard other worktrees, force pushes and `x` → `x/y`
renames; platform-only tests cover the helper-scripts worktree. A
`CliRunner` test covers the `install tip` error path.
- Mutation-checked: `symbolic-ref --short`, treating every non-origin
name as a deleted branch, dropping go's explicit PR-ref fetch or its
`+`, swallowing go's refusal, and dropping the `install tip` catch each
fail a test.
- Two new tests interrupt each js install path.
- `isolated_git` keeps those tests off the developer's git config, any
inherited `GIT_DIR`, and the network (`GIT_ALLOW_PROTOCOL=file`).

### Follow-ups
Older problems found while reviewing this PR are fixed in a stack of
drafts based on it: #673 (don't reset a directory that isn't a worktree)
→ #674 (branch names vs versions) → #675 (tags moved upstream) → #676
(`checkout go` / `--all`).

### Stack ([DSPX-4372-t1
plan](#657))

Two parallel tracks from `main`; they share no imports and meet in stage
5.

| Part | PR | Base |
|---|---|---|
| 2a: bare-repo and js install fixes | **#667 (this PR)** | `main` |
| 2b: manifest contract | #668 | 2a |
| 2c: `install benchmark` | #626 | 2b |
| 2d: `otdf-local env` exports | #642 | 2c |
| 3a: arms as a tuple | #669 | `main` |
| 3b: two to four arms | #658 | 3a |
| 3c: pytest reads the manifest | #670 | 3b |
| 4: candidate-to-candidate conclusions | #659 | 3c |
| 5, 6: CI and report | #660, #661 | not yet moved onto these stacks |



<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

<!-- coderabbit-ai-generated:v1 -->

## Summary by CodeRabbit

* **Bug Fixes**
* SDK and platform worktrees now follow updated branches and pull
request refs, including after force-pushes. Missing branches produce a
clear error instead of a traceback.
* Interrupted JavaScript installations no longer leave partial
distribution files behind.

* **Documentation**
* Updated platform installation guidance for branch refreshes, detached
worktrees, and pull request refs.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

Signed-off-by: Dave Mihalcik <dmihalcik@virtru.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.

1 participant