Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(federation): match JS condition order with multiple skip/include on the same selection #6120

Merged
merged 3 commits into from
Oct 7, 2024

Conversation

goto-bus-stop
Copy link
Member

@goto-bus-stop goto-bus-stop commented Oct 4, 2024

Rust was iterating in a consistent order, JS iterates in declaration
order.

Surprisingly this was the only place we use the consistent order. This
removes the iter_sorted() method from DirectiveList that is now no
longer used. Internally, DirectiveList still uses the consistent sort
order for hashing and equality.

I think it's somewhat nicer to use the consistent order here, so you do
not get different plans based on an innocuous input difference, but so
be it. We can consider using a consistent order everywhere we handle
directives in the future.

…on the same selection

Rust was iterating in a consistent order, JS iterates in declaration
order.

Surprisingly this was the only place we use the consistent order. This
removes the `iter_sorted()` method from DirectiveList that is now no
longer used. Internally, DirectiveList still uses the consistent sort
order for hashing and equality.

I think it's somewhat nicer to use the consistent order here, so you do
not get different plans based on an innocuous input difference, but so
be it. We can consider using a consistent order everywhere we handle
directives in the future.
@svc-apollo-docs
Copy link
Collaborator

svc-apollo-docs commented Oct 4, 2024

✅ Docs Preview Ready

Configuration
{
  "repoOverrides": {
    "apollographql/router@dev": {
      "remote": {
        "owner": "apollographql",
        "repo": "router",
        "branch": "renee/ROUTER-799"
      }
    }
  }
}
Name Link

Commit

8d141d9

Preview

https://www.apollographql.com/docs/deploy-preview/e79c59d433d5d96b5863

Build ID

e79c59d433d5d96b5863

File Changes

0 new, 2 changed, 0 removed
* graphos/reference/federation/versions.mdx
* graphos/routing/uplink.mdx

Pages

2


2 pages published. Build will be available for 30 days.

Copy link
Contributor

github-actions bot commented Oct 4, 2024

@goto-bus-stop, please consider creating a changeset entry in /.changesets/. These instructions describe the process and tooling.

@router-perf
Copy link

router-perf bot commented Oct 4, 2024

CI performance tests

  • connectors-const - Connectors stress test that runs with a constant number of users
  • const - Basic stress test that runs with a constant number of users
  • demand-control-instrumented - A copy of the step test, but with demand control monitoring and metrics enabled
  • demand-control-uninstrumented - A copy of the step test, but with demand control monitoring enabled
  • enhanced-signature - Enhanced signature enabled
  • events - Stress test for events with a lot of users and deduplication ENABLED
  • 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
  • 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_callback - Stress test for events with a lot of users and deduplication ENABLED in 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
  • extended-reference-mode - Extended reference mode enabled
  • large-request - Stress test with a 1 MB request payload
  • no-tracing - Basic stress test, no tracing
  • reload - Reload test over a long period of time at a constant rate of users
  • step-jemalloc-tuning - Clone of the basic stress test for jemalloc tuning
  • step-local-metrics - Field stats that are generated from the router rather than FTV1
  • step-with-prometheus - A copy of the step test with the Prometheus metrics exporter enabled
  • step - Basic stress test that steps up the number of users over time
  • xlarge-request - Stress test with 10 MB request payload
  • xxlarge-request - Stress test with 100 MB request payload

@goto-bus-stop goto-bus-stop merged commit 42ff333 into dev Oct 7, 2024
14 of 15 checks passed
@goto-bus-stop goto-bus-stop deleted the renee/ROUTER-799 branch October 7, 2024 14:56
goto-bus-stop added a commit that referenced this pull request Oct 10, 2024
…n the same selection

PR #6120 was the wrong solution. JS doesn't actually maintain the order
of the conditions, like I thought. Instead, it always puts `@skip` first
and `@include` second, the opposite of what Rust was doing.

The queries I was testing with just happened to pass in #6120.

This changes the implementation of `Conditions::from_directives` to
pick the directives out manually instead of iterating. Technically, this
does two iterations of the directive list...but, the code is a bit
simpler, I think.
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.

3 participants