Repository navigation
perf(engine): probe an edge load's endpoints on the parse partitions - #1147
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. |
ReviewAn edge Explain output gains Recommendation: keep the placement. Correct the contract text in a follow-up. This pull request merged at
Blocking
Optional
Tradeoff and liabilityThe design keeps one judgment. What this spends: the scan input and the build scratch stay reserved until after the drain, including after those buffers are freed, so a parallel parse cannot change Five more moves of the same kind (uniqueness, cardinality, retained edges) can reuse This matches the bulk-load RFC: partitions may compute together, and the refusal for a parsed input stays in check order and row order. It sits beside #1141. ValidationReviewed head: Local, on
Before and after, same case file,
That is the precedence change. It is not a compile failure or a zero-test run. The temporary case was not pushed. CI on I did not measure the SF30 times in the pull request body (210.0 s to 168.5 s, validate 55.6 s to 11.8 s). Treat those numbers as the author's, unverified. Inline comments
This sentence is too wide. After a successful parse, the first missing endpoint is unchanged. On
This sentence holds for a missing endpoint after the file has parsed. Add the budget case beside it. On
Optional. When the key-set read and the parse both fail, this |
An edge
load csvprobes its endpoints on one thread after the drain while the parse partitions, which already sweep every other check, sit idle: 56 s of SF30's 210 s load after #1141. The bulk-load RFC (docs/rfcs/2026-10-15-bulk-load-as-a-query-plan.md, #1026) specifies the endpoint check; this PR decides where the plan probes it.The planner now places the endpoint checks per edge:
swept, on the parse partitions as each batch arrives, when both checks read their committed key set whole over node types keyed by oneI32,I64orU32@key;judged, after the drain, otherwise. The merge keeps the earliest miss, so the refusal is still the first missing endpoint in row order.On SF30, 31 overwrite statements on a fresh graph, release builds of
484e3345and this branch, one round each: load 210.0 → 168.5 s, the edges' validate 55.6 → 11.8 s; parse 55.2 → 58.3 s as the probe's CPU moves into it, write and capture unchanged.For review: the decision to challenge is the admission order. The key sets are admitted before any partition parses and their scan buffers are released after the drain, so a memory refusal reports one
actualin every DST replay, and a set the budget cannot admit refuses before a malformed row does, where the judged route reports the parse error;load_csv_edge_endpoints_set_admission_refuses_before_parse.gqtpins it. Least sure:U64keys stay judged because the set isi64-keyed;load_csv_edge_endpoints_key_types.gqtpins it. Explain JSON gainsprobeon eachedge_richeck and the statisticendpoint_probe, additive, sameexplain_version. The DST cost golden gains two lines,EndpointProbeSweptandEndpointProbeJudged, none moved; release notechangelog.d/load-endpoint-checks-swept.performance.md.