router
router copied to clipboard
Added integrity checks on operations and selection sets
Operations and selection/selection-sets has internal invariants (before considering its correctness or any other constraints).
I call it "well-formedness" of operation/selection/-set structs. For example:
- Every node has the same schema.
- Every selection set must have a type that is dictated by their parent selection (namely, field's base type and inline fragment's "casted" type).
- All fields must be defined in the schema.
- All fragment spreads must be defined in the NamedFragments.
- Every inline fragment spread's
parent_type_positionmust be the type of its parent selection set.
I implemented the check and placed it in several places where we build operations. Those checks are only executed in debug builds.
I found a bug in rebase_on and fixed it in this PR. Though, that fix didn't change the status of existing tests.
Checklist
Complete the checklist (and note appropriate exceptions) before the PR is marked ready-for-review.
- [x] Changes are compatible[^1]
- [ ] Documentation[^2] completed
- [ ] Performance impact assessed and acceptable
- Tests added and passing[^3]
- [ ] Unit Tests
- [x] Integration Tests
- [ ] Manual Tests
Exceptions
Note any exceptions here
Notes
[^1]: It may be appropriate to bring upcoming changes to the attention of other (impacted) groups. Please endeavour to do this before seeking PR approval. The mechanism for doing this will vary considerably, so use your judgement as to how and when to do this. [^2]: Configuration is an important part of many changes. Where applicable please try to document configuration examples. [^3]: Tick whichever testing boxes are applicable. If you are adding Manual Tests, please document the manual testing (extensively) in the Exceptions.
@duckki, please consider creating a changeset entry in /.changesets/. These instructions describe the process and tooling.
CI performance tests
- [ ] reload - Reload test over a long period of time at a constant rate of users
- [ ] no-tracing - Basic stress test, no tracing
- [ ] events_callback - Stress test for events with a lot of users and deduplication ENABLED in callback mode
- [ ] xlarge-request - Stress test with 10 MB request payload
- [ ] events_big_cap_high_rate_callback - Stress test for events with a lot of users, deduplication enabled and high rate event with a big queue capacity using callback mode
- [ ] events_without_dedup - Stress test for events with a lot of users and deduplication DISABLED
- [ ] events_without_dedup_callback - Stress test for events with a lot of users and deduplication DISABLED using callback mode
- [x] step - Basic stress test that steps up the number of users over time
- [ ] step-jemalloc-tuning - Clone of the basic stress test for jemalloc tuning
- [ ] events_big_cap_high_rate - Stress test for events with a lot of users, deduplication enabled and high rate event with a big queue capacity
- [ ] step-with-prometheus - A copy of the step test with the Prometheus metrics exporter enabled
- [ ] demand-control-instrumented - A copy of the step test, but with demand control monitoring and metrics enabled
- [ ] events - Stress test for events with a lot of users and deduplication ENABLED
- [ ] xxlarge-request - Stress test with 100 MB request payload
- [ ] large-request - Stress test with a 1 MB request payload
- [ ] demand-control-uninstrumented - A copy of the step test, but with demand control monitoring enabled
- [x] const - Basic stress test that runs with a constant number of users
I really, really like the listing of invariants and checking them. We should start a doc that lists these things out.
Changing to draft so we don't get pinged to rereview it every day in slack 😇
Totally reasonable to re-open this, but I'll close this for now!