Repository navigation
feat(bench): decouple the harness from the engine with served read-only workloads - #932
Merged
azimafroozeh merged 3 commits intoOct 10, 2026
Conversation
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Problem. A benchmark should measure the system as it is deployed. Ours measures a library:
omnigraph-benchlinks the engine in-process, so the only surface with a number is embedded execution on a local file system. The deployed surface,omnigraph-serverover HTTP, has none (execution: serveris refused at admission), and measuring a new engine revision means rebuilding the harness, because the engine is a build dependency of the bench binary.Why coupling was the wrong shape. A harness that shares a process with its SUT conflates three things that a black-box benchmark keeps apart: the clock (it stopped at the engine's Arrow batches, not at a request boundary), the provenance (the worker's own build and machine stood in for the server's), and the artifact (a fresh bench build per engine commit instead of the server image CI already publishes). The result measured one surface and had to be rebuilt to measure any new revision.
Solution. The bench becomes an out-of-process client over the public API for read-only workloads: same GQT workloads, same record schema, two execution targets. #923 gave the GQT runner the server target; this PR gives the bench its admission, timing, provenance and records. No engine, server or API change.
GqtEnvironmentgains thetargetandnetwork_positionaxes (embedded serialization unchanged; a served definition must declarenetwork_position). The served program must be idempotent read-only end to end, loop bodies and verification suffixes included; restarts, mutations, loads, settings prefixes and index requirements are refused before any request.long-running-server,reset: none). The interval is end-to-end client latency, request serialization through row decoding; warm-up and assertions are outside it.declared-deploymentbeside the observed client build and machine; absent server counters stay null, never zero; every served record isclaim_eligible: false. Projection transform 5 separates declared from observed columns.LANCE_andOMNIGRAPH_namespaces, travels only on the worker's bounded stdin, is redacted from diagnostics in raw, JSON-escaped and form-encoded spellings; durable evidence stores the SHA-256 of the normalized endpoint.query-shapes-served,traversal-served) as separate workload files, measured text byte-identical to the embedded source, the 40 historical point identities unchanged.gqt_served_smoke.rsboots the server binary and runsomnigraph-gqt --serverend to end in theservedCI cell, which builds withcargo test --no-runso its three steps share one feature world.Backing issue / RFC
docs/rfcs/0039-end-to-end-benchmark.md) for read-only workloads; the RFC gains its served exception in this diff.Checklist
gqt_served_tests.rs(admission, receipt, endpoint, token, evidence exclusivity, projection, measured HTTP against a local listener);catalog_clipins the 16 selectors and twin parity; the 40-identity golden unchanged; threeserved_*.gqtcorpus cases pin served rows equal to in-process rows;gqt_server_binary_round_tripruns the CLI end to endbenchmarks/README.md,docs/dev/testing.md,docs/dev/ci.md, RFC 0039changelog.d/served-read-benchmarks.added.mdLocal verification
omnigraph-bench run e2e-query-count-served --server … --graph … --server-receipt … --server-token-env … --repetitions 3, release client against an unmodified release server built from980498d6, same host, local FS: three repetitions on three fresh client PIDs, server alive throughout, receipt hashes equal in every sample, no token in retained output. Diagnostic run, no archive written.cargo tree -e features -i omnigraph-clusterwith and withoutno-dev: dev-dependencies addfailpointsandtest-util, hencecargo test --no-runin the CI cell rather thancargo build --bins.Notes for reviewers
declared-deploymentand never claim-eligible. Kept to avoid a new API.PROJECTION_TRANSFORM_VERSION4 → 5: an existing projection is refused and rebuilt from the archive; record format and historical bytes unchanged.local-fsonly; the S3-rooted server is a later phase. Explicit--dataset/--queriespairs refuse--server.