Repository navigation
fix(graphql): record collapsed JIT resolver errors - #10027
Conversation
Overall package sizeSelf size: 8.75 MB Dependency sizes| name | version | self size | total size | |------|---------|-----------|------------| | import-in-the-middle | 3.4.0 | 127.33 kB | 447.04 kB | | opentracing | 0.14.7 | 194.81 kB | 194.81 kB | | dc-polyfill | 0.1.11 | 25.74 kB | 25.74 kB |🤖 This report was automatically generated by heaviest-objects-in-the-universe |
🎉 All green!🧪 All tests passed 🔄 Datadog retried 1 test - 1 passed on retry 🎯 Code Coverage (details) 🔗 Commit SHA: 830b1da | Docs | View more details | Give us feedback! |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7e73739c90
ℹ️ 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".
BenchmarksBenchmark execution time: 2026-09-02 20:29:37 Comparing candidate commit 830b1da in PR branch Found 0 performance improvements and 0 performance regressions! Performance is the same for 2314 metrics, 14 unstable metrics.
|
94adf26 to
b110429
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b110429e15
ℹ️ 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".
b43eb93 to
a970105
Compare
Collapsed JIT fields observe only the first resolver completion, so a later sibling error leaves the shared span and resolve hook successful. Compiler-side error recording preserves one resolve-hook call without adding a completion observer to every resolver. On Node 24.18.0 and V8 13.6, a 50,000-item query improved from 87.8–90.9 to 45.8–48.9 ns per resolver.
`depth: 0` still entered compiled resolver instrumentation because generated dispatch only checked whether an execution context existed. On Node 24.9.0 and V8 13.6, a 50,000-item query improved from 37.5–37.7 to 21.1–21.4 ns per resolver.
Collapsed JIT fields defer resolver hooks until execution completes, so the execute hook must run after the deferred resolver hooks.
Resolver-call shape is fixed in the upstream compiler source, so validating each compiled field retained a fallback for a module the rewriter had already accepted. Rewriter assertions now reject unsupported source before instrumentation and let the loader use the original module.
a970105 to
830b1da
Compare
* fix(graphql): record collapsed JIT resolver errors Collapsed JIT fields observe only the first resolver completion, so a later sibling error leaves the shared span and resolve hook successful. Compiler-side error recording preserves one resolve-hook call without adding a completion observer to every resolver. On Node 24.18.0 and V8 13.6, a 50,000-item query improved from 87.8–90.9 to 45.8–48.9 ns per resolver. * perf(graphql): restore disabled JIT resolver fast path `depth: 0` still entered compiled resolver instrumentation because generated dispatch only checked whether an execution context existed. On Node 24.9.0 and V8 13.6, a 50,000-item query improved from 37.5–37.7 to 21.1–21.4 ns per resolver. * fix(graphql): preserve resolver hook order Collapsed JIT fields defer resolver hooks until execution completes, so the execute hook must run after the deferred resolver hooks. * refactor(graphql): validate JIT resolver source in rewriter Resolver-call shape is fixed in the upstream compiler source, so validating each compiled field retained a fallback for a module the rewriter had already accepted. Rewriter assertions now reject unsupported source before instrumentation and let the loader use the original module.
* fix(graphql): record collapsed JIT resolver errors Collapsed JIT fields observe only the first resolver completion, so a later sibling error leaves the shared span and resolve hook successful. Compiler-side error recording preserves one resolve-hook call without adding a completion observer to every resolver. On Node 24.18.0 and V8 13.6, a 50,000-item query improved from 87.8–90.9 to 45.8–48.9 ns per resolver. * perf(graphql): restore disabled JIT resolver fast path `depth: 0` still entered compiled resolver instrumentation because generated dispatch only checked whether an execution context existed. On Node 24.9.0 and V8 13.6, a 50,000-item query improved from 37.5–37.7 to 21.1–21.4 ns per resolver. * fix(graphql): preserve resolver hook order Collapsed JIT fields defer resolver hooks until execution completes, so the execute hook must run after the deferred resolver hooks. * refactor(graphql): validate JIT resolver source in rewriter Resolver-call shape is fixed in the upstream compiler source, so validating each compiled field retained a fallback for a module the rewriter had already accepted. Rewriter assertions now reject unsupported source before instrumentation and let the loader use the original module.
* fix(graphql): record collapsed JIT resolver errors Collapsed JIT fields observe only the first resolver completion, so a later sibling error leaves the shared span and resolve hook successful. Compiler-side error recording preserves one resolve-hook call without adding a completion observer to every resolver. On Node 24.18.0 and V8 13.6, a 50,000-item query improved from 87.8–90.9 to 45.8–48.9 ns per resolver. * perf(graphql): restore disabled JIT resolver fast path `depth: 0` still entered compiled resolver instrumentation because generated dispatch only checked whether an execution context existed. On Node 24.9.0 and V8 13.6, a 50,000-item query improved from 37.5–37.7 to 21.1–21.4 ns per resolver. * fix(graphql): preserve resolver hook order Collapsed JIT fields defer resolver hooks until execution completes, so the execute hook must run after the deferred resolver hooks. * refactor(graphql): validate JIT resolver source in rewriter Resolver-call shape is fixed in the upstream compiler source, so validating each compiled field retained a fallback for a module the rewriter had already accepted. Rewriter assertions now reject unsupported source before instrumentation and let the loader use the original module.
* fix(graphql): record collapsed JIT resolver errors Collapsed JIT fields observe only the first resolver completion, so a later sibling error leaves the shared span and resolve hook successful. Compiler-side error recording preserves one resolve-hook call without adding a completion observer to every resolver. On Node 24.18.0 and V8 13.6, a 50,000-item query improved from 87.8–90.9 to 45.8–48.9 ns per resolver. * perf(graphql): restore disabled JIT resolver fast path `depth: 0` still entered compiled resolver instrumentation because generated dispatch only checked whether an execution context existed. On Node 24.9.0 and V8 13.6, a 50,000-item query improved from 37.5–37.7 to 21.1–21.4 ns per resolver. * fix(graphql): preserve resolver hook order Collapsed JIT fields defer resolver hooks until execution completes, so the execute hook must run after the deferred resolver hooks. * refactor(graphql): validate JIT resolver source in rewriter Resolver-call shape is fixed in the upstream compiler source, so validating each compiled field retained a fallback for a module the rewriter had already accepted. Rewriter assertions now reject unsupported source before instrumentation and let the loader use the original module.
Collapsed GraphQL JIT fields observe only the first resolver completion. A later list sibling can fail without marking the shared span or resolve hook.
The compiler records later failures in the existing synchronous and asynchronous error branches. Compiler-owned dispatch avoids a completion observer and resolver wrapper on the hot path.
On Node 24.18.0 and V8 13.6, a 50,000-item collapsed query improved from 87.8–90.9 to 45.8–48.9 ns per resolver.