From f723bd83b9268b219eec579d16ee0f51e4ccec0c Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Tue, 26 Nov 2024 11:38:09 +0200 Subject: [PATCH 1/5] prep release: v1.58.0 --- ...ify_authorization_directive_composition.md | 6 - .../feat_add_dns_resolution_strategy.md | 30 -- .changesets/feat_error_extensions_service.md | 32 -- .changesets/feat_geal_subgraph_request_id.md | 6 - ...ble_generate_query_fragments_by_default.md | 19 - .changesets/feat_max_headers.md | 19 - .../feat_router_528_impl_set_context.md | 6 - .../fix_bryn_fix_header_propagation.md | 18 - ...ix_fix_file_upload_variable_placeholder.md | 7 - ...en_log_less_error_for_subgraph_batching.md | 5 - .../fix_geal_deduplication_processing_time.md | 5 - .../fix_geal_introspection_dedup_fix.md | 5 - .changesets/fix_renee_limit_errors.md | 5 - .changesets/fix_simon_compute_jobs.md | 21 - ...nesling_demand_control_variable_scoring.md | 41 -- ...inesling_remove_demand_control_warnings.md | 5 - .../fix_tninesling_typename_resolution.md | 7 - .changesets/maint_bnjjj_feat_854.md | 5 - .../maint_bnjjj_fix_supergraph_events_span.md | 5 - ...al_query_planner_cache_key_improvements.md | 8 - CHANGELOG.md | 287 +++++++++++ Cargo.lock | 8 +- apollo-federation/Cargo.toml | 2 +- apollo-router-benchmarks/Cargo.toml | 2 +- apollo-router-scaffold/Cargo.toml | 2 +- .../templates/base/Cargo.template.toml | 2 +- .../templates/base/xtask/Cargo.template.toml | 2 +- apollo-router/Cargo.toml | 4 +- .../tracing/docker-compose.datadog.yml | 2 +- dockerfiles/tracing/docker-compose.jaeger.yml | 2 +- dockerfiles/tracing/docker-compose.zipkin.yml | 2 +- helm/chart/router/Chart.yaml | 4 +- helm/chart/router/README.md | 6 +- licenses.html | 457 ++---------------- scripts/install.sh | 2 +- 35 files changed, 349 insertions(+), 690 deletions(-) delete mode 100644 .changesets/docs_clarify_authorization_directive_composition.md delete mode 100644 .changesets/feat_add_dns_resolution_strategy.md delete mode 100644 .changesets/feat_error_extensions_service.md delete mode 100644 .changesets/feat_geal_subgraph_request_id.md delete mode 100644 .changesets/feat_lrlna_enable_generate_query_fragments_by_default.md delete mode 100644 .changesets/feat_max_headers.md delete mode 100644 .changesets/feat_router_528_impl_set_context.md delete mode 100644 .changesets/fix_bryn_fix_header_propagation.md delete mode 100644 .changesets/fix_fix_file_upload_variable_placeholder.md delete mode 100644 .changesets/fix_garypen_log_less_error_for_subgraph_batching.md delete mode 100644 .changesets/fix_geal_deduplication_processing_time.md delete mode 100644 .changesets/fix_geal_introspection_dedup_fix.md delete mode 100644 .changesets/fix_renee_limit_errors.md delete mode 100644 .changesets/fix_simon_compute_jobs.md delete mode 100644 .changesets/fix_tninesling_demand_control_variable_scoring.md delete mode 100644 .changesets/fix_tninesling_remove_demand_control_warnings.md delete mode 100644 .changesets/fix_tninesling_typename_resolution.md delete mode 100644 .changesets/maint_bnjjj_feat_854.md delete mode 100644 .changesets/maint_bnjjj_fix_supergraph_events_span.md delete mode 100644 .changesets/maint_geal_query_planner_cache_key_improvements.md diff --git a/.changesets/docs_clarify_authorization_directive_composition.md b/.changesets/docs_clarify_authorization_directive_composition.md deleted file mode 100644 index 5413e0234e..0000000000 --- a/.changesets/docs_clarify_authorization_directive_composition.md +++ /dev/null @@ -1,6 +0,0 @@ -### Clarify docs for authorization directive composition ([PR #6216](https://github.com/apollographql/router/pull/6216)) - -The docs for [authorization directive composition](https://www.apollographql.com/docs/graphos/routing/security/authorization#composition-and-federation) have been clarified, including corrected code examples. - - -By [@Meschreiber](https://github.com/Meschreiber) in https://github.com/apollographql/router/pull/6216 diff --git a/.changesets/feat_add_dns_resolution_strategy.md b/.changesets/feat_add_dns_resolution_strategy.md deleted file mode 100644 index 399865ced1..0000000000 --- a/.changesets/feat_add_dns_resolution_strategy.md +++ /dev/null @@ -1,30 +0,0 @@ -### Support DNS resolution strategy configuration ([PR #6109](https://github.com/apollographql/router/pull/6109)) - -The router now supports a configurable DNS resolution strategy for the URLs of coprocessors and subgraphs. -The new option is called `dns_resolution_strategy` and supports the following values: -* `ipv4_only` - Only query for `A` (IPv4) records. -* `ipv6_only` - Only query for `AAAA` (IPv6) records. -* `ipv4_and_ipv6` - Query for both `A` (IPv4) and `AAAA` (IPv6) records in parallel. -* `ipv6_then_ipv4` - Query for `AAAA` (IPv6) records first; if that fails, query for `A` (IPv4) records. -* `ipv4_then_ipv6`(default) - Query for `A` (IPv4) records first; if that fails, query for `AAAA` (IPv6) records. - -You can change the DNS resolution strategy applied to a subgraph's URL: - -```yaml title="router.yaml" -traffic_shaping: - all: - dns_resolution_strategy: ipv4_then_ipv6 - -``` - -You can also change the DNS resolution strategy applied to a coprocessor's URL: - -```yaml title="router.yaml" -coprocessor: - url: http://coprocessor.example.com:8081 - client: - dns_resolution_strategy: ipv4_then_ipv6 - -``` - -By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6109 diff --git a/.changesets/feat_error_extensions_service.md b/.changesets/feat_error_extensions_service.md deleted file mode 100644 index e8a1e09031..0000000000 --- a/.changesets/feat_error_extensions_service.md +++ /dev/null @@ -1,32 +0,0 @@ -### Add `extensions.service` for all subgraph errors ([PR #6191](https://github.com/apollographql/router/pull/6191)) - - -For improved debuggability, the router now supports adding a subgraph's name as an extension to all errors originating from the subgraph. - -If `include_subgraph_errors` is `true` for a particular subgraph, all errors originating in this subgraph will have the subgraph's name exposed as a `service` extension. - -You can enable subgraph errors with the following configuration: -```yaml title="router.yaml" -include_subgraph_errors: - all: true # Propagate errors from all subgraphs -``` -> Note: This option is enabled by default by the router's [dev mode](https://www.apollographql.com/docs/graphos/reference/router/configuration#dev-mode-defaults). - -Consequently, when a subgraph returns an error, it will have a `service` extension with the subgraph name as its value. The following example shows the extension for a `products` subgraph: - -```json -{ - "data": null, - "errors": [ - { - "message": "Invalid product ID", - "path": [], - "extensions": { - "service": "products" - } - } - ] -} -``` - -By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6191 \ No newline at end of file diff --git a/.changesets/feat_geal_subgraph_request_id.md b/.changesets/feat_geal_subgraph_request_id.md deleted file mode 100644 index 07d85f8efd..0000000000 --- a/.changesets/feat_geal_subgraph_request_id.md +++ /dev/null @@ -1,6 +0,0 @@ -### Add subgraph request id ([PR #5858](https://github.com/apollographql/router/pull/5858)) - -The router now supports a subgraph request ID that is a unique string identifying a subgraph request and response. It allows plugins and coprocessors to keep some state per subgraph request by matching on this ID. It's available in coprocessors as `subgraphRequestId` and Rhai scripts as `request.subgraph.id` and `response.subgraph.id`. - - -By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/5858 \ No newline at end of file diff --git a/.changesets/feat_lrlna_enable_generate_query_fragments_by_default.md b/.changesets/feat_lrlna_enable_generate_query_fragments_by_default.md deleted file mode 100644 index d541706cd9..0000000000 --- a/.changesets/feat_lrlna_enable_generate_query_fragments_by_default.md +++ /dev/null @@ -1,19 +0,0 @@ -### Compress subgraph operations by generating fragments ([PR #6013](https://github.com/apollographql/router/pull/6013)) - -The router now compresses operations sent to subgraphs by default by generating fragment -definitions and using them in the operation. - -This change enables `generate_query_fragments` by default while disabling `experimental_reuse_query_fragments`. When enabled, `experimental_reuse_query_fragments` attempts to intelligently reuse the fragment definitions -from the original operation. However, fragment generation with `generate_query_fragments` is much faster also produces better outputs in most cases. - -If you are relying on the shape of fragments in your subgraph operations or tests, you can opt out of the new algorithm with the configuration below. - -> Note: The subgraph operations generated by the query planner are not guaranteed consistent release over release. We strongly recommend against relying on the shape of planned subgraph operations, as new router features and optimizations will continuously affect it. We plan to remove `experimental_reuse_query_fragments` in a future release. - -```yaml -supergraph: - generate_query_fragments: false - experimental_reuse_query_fragments: true -``` - -By [@lrlna](https://github.com/lrlna) in https://github.com/apollographql/router/pull/6013 diff --git a/.changesets/feat_max_headers.md b/.changesets/feat_max_headers.md deleted file mode 100644 index 97c58995a7..0000000000 --- a/.changesets/feat_max_headers.md +++ /dev/null @@ -1,19 +0,0 @@ -### Configuration options for HTTP/1 max headers and buffer limits ([PR #6194](https://github.com/apollographql/router/pull/6194)) - -This update introduces configuration options that allow you to adjust the maximum number of HTTP/1 request headers and the maximum buffer size allocated for headers. - -By default, the router accepts HTTP/1 requests with up to 100 headers and allocates ~400 KiB of buffer space to store them. If you need to handle requests with more headers or require a different buffer size, you can now configure these limits in the router's configuration file: -```yaml -limits: - http1_request_max_headers: 200 - http1_request_max_buf_size: 200kib -``` - -If you are using the router as a Rust crate, the `http1_request_max_buf_size` option requires the `hyper_header_limits` feature and also necessitates using Apollo's fork of the Hyper crate until the [changes are merged upstream](https://github.com/hyperium/hyper/pull/3523). -You can include this fork by adding the following patch to your Cargo.toml file: -```toml -[patch.crates-io] -"hyper" = { git = "https://github.com/apollographql/hyper.git", tag = "header-customizations-20241108" } -``` - -By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6194 diff --git a/.changesets/feat_router_528_impl_set_context.md b/.changesets/feat_router_528_impl_set_context.md deleted file mode 100644 index b805deca59..0000000000 --- a/.changesets/feat_router_528_impl_set_context.md +++ /dev/null @@ -1,6 +0,0 @@ -### Add `@context` support in the native query planner ([PR #6310](https://github.com/apollographql/router/pull/6310)) - -The [`@context`](https://www.apollographql.com/docs/graphos/reference/federation/directives#context) feature is now available in the native query planner. -This brings the native query planner to feature parity with the legacy query planner for all Federation v2 graphs. - -By [@clenfest](https://github.com/clenfest), [@TylerBloom](https://github.com/TylerBloom) in https://github.com/apollographql/router/pull/6310 \ No newline at end of file diff --git a/.changesets/fix_bryn_fix_header_propagation.md b/.changesets/fix_bryn_fix_header_propagation.md deleted file mode 100644 index fe402a26c6..0000000000 --- a/.changesets/fix_bryn_fix_header_propagation.md +++ /dev/null @@ -1,18 +0,0 @@ -### Renamed headers' original values can again be propagated ([PR #6281](https://github.com/apollographql/router/pull/6281)) - -[PR #4535](https://github.com/apollographql/router/pull/4535) introduced a regression where the following header propagation config would not work: - -```yaml -headers: -- propagate: - named: a - rename: b -- propagate: - named: a - rename: c -``` - -The goal of the original PR was to prevent multiple headers from being mapped to a single target header. However, it did not consider renames and instead prevented multiple mappings from the same source header. -The router now propagates headers properly and ensures that a target header is only propagated to once. - -By [@BrynCooke](https://github.com/BrynCooke) in https://github.com/apollographql/router/pull/6281 diff --git a/.changesets/fix_fix_file_upload_variable_placeholder.md b/.changesets/fix_fix_file_upload_variable_placeholder.md deleted file mode 100644 index 2e7dc5a521..0000000000 --- a/.changesets/fix_fix_file_upload_variable_placeholder.md +++ /dev/null @@ -1,7 +0,0 @@ -### Remove placeholders from file upload query variables ([PR #6293](https://github.com/apollographql/router/pull/6293)) - -Previously, file upload query variables in subgraph requests incorrectly contained internal placeholders. -According to the [GraphQL Multipart Request Spec](https://github.com/jaydenseric/graphql-multipart-request-spec?tab=readme-ov-file#multipart-form-field-structure), these variables should be set to null. -This issue has been fixed by ensuring that the router complies with the specification and improving compatibility with subgraphs handling file uploads. - -By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6293 diff --git a/.changesets/fix_garypen_log_less_error_for_subgraph_batching.md b/.changesets/fix_garypen_log_less_error_for_subgraph_batching.md deleted file mode 100644 index 9f7d8d1628..0000000000 --- a/.changesets/fix_garypen_log_less_error_for_subgraph_batching.md +++ /dev/null @@ -1,5 +0,0 @@ -### Don't log response data upon notification failure for subgraph batching ([PR #6150](https://github.com/apollographql/router/pull/6150)) - -For a subgraph batching operation, the router now doesn't log the entire subgraph response when failing to notify a waiting batch participant. This saves the router from logging the large amount of data (PII and/or non-PII data) that a subgraph response may contain. - -By [@garypen](https://github.com/garypen) in https://github.com/apollographql/router/pull/6150 \ No newline at end of file diff --git a/.changesets/fix_geal_deduplication_processing_time.md b/.changesets/fix_geal_deduplication_processing_time.md deleted file mode 100644 index 71e10b87ed..0000000000 --- a/.changesets/fix_geal_deduplication_processing_time.md +++ /dev/null @@ -1,5 +0,0 @@ -### Overhead processing metrics should exclude subgraph response time when deduplication is enabled ([PR #6207](https://github.com/apollographql/router/pull/6207)) - -The router's calculated overhead processing time has been fixed, where the time spent waiting for the subgraph response of a deduplicated request had been incorrectly included. - -By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6207 \ No newline at end of file diff --git a/.changesets/fix_geal_introspection_dedup_fix.md b/.changesets/fix_geal_introspection_dedup_fix.md deleted file mode 100644 index 3fc10a3748..0000000000 --- a/.changesets/fix_geal_introspection_dedup_fix.md +++ /dev/null @@ -1,5 +0,0 @@ -### Introspection response deduplication should always produce results ([Issue #6249](https://github.com/apollographql/router/issues/6249)) - -To reduce CPU usage, query planning and introspection queries are deduplicated. In some cases, deduplicated introspection queries were not receiving their result. This issue has been fixed, and the router now sends results in all cases. - -By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6257 \ No newline at end of file diff --git a/.changesets/fix_renee_limit_errors.md b/.changesets/fix_renee_limit_errors.md deleted file mode 100644 index c2df146205..0000000000 --- a/.changesets/fix_renee_limit_errors.md +++ /dev/null @@ -1,5 +0,0 @@ -### Limit the amount of GraphQL validation errors returned per response ([PR #6187](https://github.com/apollographql/router/pull/6187)) - -When an invalid query is submitted, the router now returns at most one hundred GraphQL parsing and validation errors in a response. This prevents generating too large of a response for a nonsensical document. - -By [@goto-bus-stop](https://github.com/goto-bus-stop) in https://github.com/apollographql/router/pull/6187 \ No newline at end of file diff --git a/.changesets/fix_simon_compute_jobs.md b/.changesets/fix_simon_compute_jobs.md deleted file mode 100644 index ac7f1fccaa..0000000000 --- a/.changesets/fix_simon_compute_jobs.md +++ /dev/null @@ -1,21 +0,0 @@ -### Move heavy computation to a thread pool with a priority queue ([PR #6247](https://github.com/apollographql/router/pull/6247)) - -The router now avoids blocking threads when executing asynchronous code by using a thread pool with a priority queue. - -This improves the performance of the following components can take non-trivial amounts of CPU time: - -* GraphQL parsing -* GraphQL validation -* Query planning -* Schema introspection - -In order to avoid blocking threads that execute asynchronous code, -they are now run in a new thread pool with a priority queue. The size of the thread pool is based on the number of available CPU cores. - -The thread pool replaces the router's prior implementation that used Tokio’s [`spawn_blocking`](https://docs.rs/tokio/latest/tokio/task/fn.spawn_blocking.html). - -`apollo.router.compute_jobs.queued` is a new gauge metric for the number of items in the thread pool's priority queue. - -> Note: when the native query planner is enabled, the dedicated queue of the legacy query planner is no longer used, so the `apollo.router.query_planning.queued` metric is no longer emitted. - -By [@SimonSapin](https://github.com/SimonSapin) in https://github.com/apollographql/router/pull/6247 diff --git a/.changesets/fix_tninesling_demand_control_variable_scoring.md b/.changesets/fix_tninesling_demand_control_variable_scoring.md deleted file mode 100644 index fdac861553..0000000000 --- a/.changesets/fix_tninesling_demand_control_variable_scoring.md +++ /dev/null @@ -1,41 +0,0 @@ -### Fix demand control panic for custom scalars that represent non-GraphQL-compliant JSON ([PR #6288](https://github.com/apollographql/router/pull/6288)) - -Previously, a panic could be triggered in the router's demand control plugin with the following schema: - -``` -scalar ArbitraryJson - -type MyInput { - json: ArbitraryJson -} - -type Query { - fetch(args: MyInput): Int -} -``` - -Then, submitting the query - -``` -query FetchData($myJsonValue: ArbitraryJson) { - fetch(args: { - json: $myJsonValue - }) -} -``` - -and variables - -``` -{ - "myJsonValue": { - "field.with.dots": 1 - } -} -``` - -During scoring, the demand control plugin would attempt to convert the variable structure into a GraphQL-compliant structure requiring valid GraphQL names as keys. The dot characters in the keys however would cause a panic. - -With this fix, only the GraphQL compliant part of the input object is scored, and the arbitrary JSON marked by the custom scalar is scored as an opaque scalar (similar to how built-ins like `Int` or `String` are processed). - -By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6288 diff --git a/.changesets/fix_tninesling_remove_demand_control_warnings.md b/.changesets/fix_tninesling_remove_demand_control_warnings.md deleted file mode 100644 index 195ad7d04c..0000000000 --- a/.changesets/fix_tninesling_remove_demand_control_warnings.md +++ /dev/null @@ -1,5 +0,0 @@ -### Remove noisy demand control logs ([PR #6192](https://github.com/apollographql/router/pull/6192)) - -Demand control no longer logs warnings when a subgraph response is missing a requested field. - -By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6192 diff --git a/.changesets/fix_tninesling_typename_resolution.md b/.changesets/fix_tninesling_typename_resolution.md deleted file mode 100644 index 890cb13ff6..0000000000 --- a/.changesets/fix_tninesling_typename_resolution.md +++ /dev/null @@ -1,7 +0,0 @@ -### Fix incorrect overriding of concrete type names with interface names when merging responses ([PR #6250](https://github.com/apollographql/router/pull/6250)) - -When using `@interfaceObject`, differing pieces of data can come back with either concrete types or interface types depending on the source. Previously, receiving the data in a particular order could incorrectly result in the interface name of a type overwriting its concrete name. - -To make the response merging order-agnostic, the router now checks the schema to ensure concrete types are not overwritten with interfaces or less specific types. - -By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6250 diff --git a/.changesets/maint_bnjjj_feat_854.md b/.changesets/maint_bnjjj_feat_854.md deleted file mode 100644 index 2f5f7a762f..0000000000 --- a/.changesets/maint_bnjjj_feat_854.md +++ /dev/null @@ -1,5 +0,0 @@ -### Add entity caching invalidation configuration metrics ([PR #6286](https://github.com/apollographql/router/pull/6286)) - -We've added metrics for our analytics to know if entity caching invalidation is enabled. - -By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/6286 \ No newline at end of file diff --git a/.changesets/maint_bnjjj_fix_supergraph_events_span.md b/.changesets/maint_bnjjj_fix_supergraph_events_span.md deleted file mode 100644 index a0548cb374..0000000000 --- a/.changesets/maint_bnjjj_fix_supergraph_events_span.md +++ /dev/null @@ -1,5 +0,0 @@ -### Avoid creating stub span for supergraph events if current span exists ([PR #6096](https://github.com/apollographql/router/pull/6096)) - -The router optimized its telemetry implementation by not creating a redundant span when it already has a span available to use the span's extensions for supergraph events. - -By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/6096 \ No newline at end of file diff --git a/.changesets/maint_geal_query_planner_cache_key_improvements.md b/.changesets/maint_geal_query_planner_cache_key_improvements.md deleted file mode 100644 index afb446115a..0000000000 --- a/.changesets/maint_geal_query_planner_cache_key_improvements.md +++ /dev/null @@ -1,8 +0,0 @@ -### Query planner cache key improvements ([Issue #5160](https://github.com/apollographql/router/issues/5160)) - -> [!IMPORTANT] -> If you have enabled [Distributed query plan caching](https://www.apollographql.com/docs/router/configuration/distributed-caching/#distributed-query-plan-caching), this release changes the hashing algorithm used for the cache keys. On account of this, you should anticipate additional cache regeneration cost when updating between these versions while the new hashing algorithm comes into service. - -Several performance improvements have been implemented for query plan cache key generation. In particular, the distributed cache's key format has changed, which adds prefixes to the different key segments to help in debugging. - -By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6206 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index bb4866bf62..cebb213989 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,293 @@ All notable changes to Router will be documented in this file. This project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html). +# [1.58.0] - 2024-11-26 + +## 🚀 Features + +### Support DNS resolution strategy configuration ([PR #6109](https://github.com/apollographql/router/pull/6109)) + +The router now supports a configurable DNS resolution strategy for the URLs of coprocessors and subgraphs. +The new option is called `dns_resolution_strategy` and supports the following values: +* `ipv4_only` - Only query for `A` (IPv4) records. +* `ipv6_only` - Only query for `AAAA` (IPv6) records. +* `ipv4_and_ipv6` - Query for both `A` (IPv4) and `AAAA` (IPv6) records in parallel. +* `ipv6_then_ipv4` - Query for `AAAA` (IPv6) records first; if that fails, query for `A` (IPv4) records. +* `ipv4_then_ipv6`(default) - Query for `A` (IPv4) records first; if that fails, query for `AAAA` (IPv6) records. + +You can change the DNS resolution strategy applied to a subgraph's URL: + +```yaml title="router.yaml" +traffic_shaping: + all: + dns_resolution_strategy: ipv4_then_ipv6 + +``` + +You can also change the DNS resolution strategy applied to a coprocessor's URL: + +```yaml title="router.yaml" +coprocessor: + url: http://coprocessor.example.com:8081 + client: + dns_resolution_strategy: ipv4_then_ipv6 + +``` + +By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6109 + +### Configuration options for HTTP/1 max headers and buffer limits ([PR #6194](https://github.com/apollographql/router/pull/6194)) + +This update introduces configuration options that allow you to adjust the maximum number of HTTP/1 request headers and the maximum buffer size allocated for headers. + +By default, the router accepts HTTP/1 requests with up to 100 headers and allocates ~400 KiB of buffer space to store them. If you need to handle requests with more headers or require a different buffer size, you can now configure these limits in the router's configuration file: +```yaml +limits: + http1_request_max_headers: 200 + http1_request_max_buf_size: 200kib +``` + +If you are using the router as a Rust crate, the `http1_request_max_buf_size` option requires the `hyper_header_limits` feature and also necessitates using Apollo's fork of the Hyper crate until the [changes are merged upstream](https://github.com/hyperium/hyper/pull/3523). +You can include this fork by adding the following patch to your Cargo.toml file: +```toml +[patch.crates-io] +"hyper" = { git = "https://github.com/apollographql/hyper.git", tag = "header-customizations-20241108" } +``` + +By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6194 + +### Compress subgraph operations by generating fragments ([PR #6013](https://github.com/apollographql/router/pull/6013)) + +The router now compresses operations sent to subgraphs by default by generating fragment +definitions and using them in the operation. + +This change enables `generate_query_fragments` by default while disabling `experimental_reuse_query_fragments`. When enabled, `experimental_reuse_query_fragments` attempts to intelligently reuse the fragment definitions +from the original operation. However, fragment generation with `generate_query_fragments` is much faster also produces better outputs in most cases. + +If you are relying on the shape of fragments in your subgraph operations or tests, you can opt out of the new algorithm with the configuration below. + +> Note: The subgraph operations generated by the query planner are not guaranteed consistent release over release. We strongly recommend against relying on the shape of planned subgraph operations, as new router features and optimizations will continuously affect it. We plan to remove `experimental_reuse_query_fragments` in a future release. + +```yaml +supergraph: + generate_query_fragments: false + experimental_reuse_query_fragments: true +``` + +By [@lrlna](https://github.com/lrlna) in https://github.com/apollographql/router/pull/6013 + +### Add subgraph request id ([PR #5858](https://github.com/apollographql/router/pull/5858)) + +The router now supports a subgraph request ID that is a unique string identifying a subgraph request and response. It allows plugins and coprocessors to keep some state per subgraph request by matching on this ID. It's available in coprocessors as `subgraphRequestId` and Rhai scripts as `request.subgraph.id` and `response.subgraph.id`. + + +By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/5858 + +### Add `extensions.service` for all subgraph errors ([PR #6191](https://github.com/apollographql/router/pull/6191)) + + +For improved debuggability, the router now supports adding a subgraph's name as an extension to all errors originating from the subgraph. + +If `include_subgraph_errors` is `true` for a particular subgraph, all errors originating in this subgraph will have the subgraph's name exposed as a `service` extension. + +You can enable subgraph errors with the following configuration: +```yaml title="router.yaml" +include_subgraph_errors: + all: true # Propagate errors from all subgraphs +``` +> Note: This option is enabled by default by the router's [dev mode](https://www.apollographql.com/docs/graphos/reference/router/configuration#dev-mode-defaults). + +Consequently, when a subgraph returns an error, it will have a `service` extension with the subgraph name as its value. The following example shows the extension for a `products` subgraph: + +```json +{ + "data": null, + "errors": [ + { + "message": "Invalid product ID", + "path": [], + "extensions": { + "service": "products" + } + } + ] +} +``` + +By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6191 + +### Add `@context` support in the native query planner ([PR #6310](https://github.com/apollographql/router/pull/6310)) + +The [`@context`](https://www.apollographql.com/docs/graphos/reference/federation/directives#context) feature is now available in the native query planner. +This brings the native query planner to feature parity with the legacy query planner for all Federation v2 graphs. + +By [@clenfest](https://github.com/clenfest), [@TylerBloom](https://github.com/TylerBloom) in https://github.com/apollographql/router/pull/6310 + +## 🐛 Fixes + +### Remove noisy demand control logs ([PR #6192](https://github.com/apollographql/router/pull/6192)) + +Demand control no longer logs warnings when a subgraph response is missing a requested field. + +By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6192 + +### Renamed headers' original values can again be propagated ([PR #6281](https://github.com/apollographql/router/pull/6281)) + +[PR #4535](https://github.com/apollographql/router/pull/4535) introduced a regression where the following header propagation config would not work: + +```yaml +headers: +- propagate: + named: a + rename: b +- propagate: + named: a + rename: c +``` + +The goal of the original PR was to prevent multiple headers from being mapped to a single target header. However, it did not consider renames and instead prevented multiple mappings from the same source header. +The router now propagates headers properly and ensures that a target header is only propagated to once. + +By [@BrynCooke](https://github.com/BrynCooke) in https://github.com/apollographql/router/pull/6281 + +### Introspection response deduplication should always produce results ([Issue #6249](https://github.com/apollographql/router/issues/6249)) + +To reduce CPU usage, query planning and introspection queries are deduplicated. In some cases, deduplicated introspection queries were not receiving their result. This issue has been fixed, and the router now sends results in all cases. + +By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6257 + +### Don't log response data upon notification failure for subgraph batching ([PR #6150](https://github.com/apollographql/router/pull/6150)) + +For a subgraph batching operation, the router now doesn't log the entire subgraph response when failing to notify a waiting batch participant. This saves the router from logging the large amount of data (PII and/or non-PII data) that a subgraph response may contain. + +By [@garypen](https://github.com/garypen) in https://github.com/apollographql/router/pull/6150 + +### Move heavy computation to a thread pool with a priority queue ([PR #6247](https://github.com/apollographql/router/pull/6247)) + +The router now avoids blocking threads when executing asynchronous code by using a thread pool with a priority queue. + +This improves the performance of the following components can take non-trivial amounts of CPU time: + +* GraphQL parsing +* GraphQL validation +* Query planning +* Schema introspection + +In order to avoid blocking threads that execute asynchronous code, +they are now run in a new thread pool with a priority queue. The size of the thread pool is based on the number of available CPU cores. + +The thread pool replaces the router's prior implementation that used Tokio’s [`spawn_blocking`](https://docs.rs/tokio/latest/tokio/task/fn.spawn_blocking.html). + +`apollo.router.compute_jobs.queued` is a new gauge metric for the number of items in the thread pool's priority queue. + +> Note: when the native query planner is enabled, the dedicated queue of the legacy query planner is no longer used, so the `apollo.router.query_planning.queued` metric is no longer emitted. + +By [@SimonSapin](https://github.com/SimonSapin) in https://github.com/apollographql/router/pull/6247 + +### Limit the amount of GraphQL validation errors returned per response ([PR #6187](https://github.com/apollographql/router/pull/6187)) + +When an invalid query is submitted, the router now returns at most one hundred GraphQL parsing and validation errors in a response. This prevents generating too large of a response for a nonsensical document. + +By [@goto-bus-stop](https://github.com/goto-bus-stop) in https://github.com/apollographql/router/pull/6187 + +### Remove placeholders from file upload query variables ([PR #6293](https://github.com/apollographql/router/pull/6293)) + +Previously, file upload query variables in subgraph requests incorrectly contained internal placeholders. +According to the [GraphQL Multipart Request Spec](https://github.com/jaydenseric/graphql-multipart-request-spec?tab=readme-ov-file#multipart-form-field-structure), these variables should be set to null. +This issue has been fixed by ensuring that the router complies with the specification and improving compatibility with subgraphs handling file uploads. + +By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6293 + +### Overhead processing metrics should exclude subgraph response time when deduplication is enabled ([PR #6207](https://github.com/apollographql/router/pull/6207)) + +The router's calculated overhead processing time has been fixed, where the time spent waiting for the subgraph response of a deduplicated request had been incorrectly included. + +By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6207 + +### Fix demand control panic for custom scalars that represent non-GraphQL-compliant JSON ([PR #6288](https://github.com/apollographql/router/pull/6288)) + +Previously, a panic could be triggered in the router's demand control plugin with the following schema: + +``` +scalar ArbitraryJson + +type MyInput { + json: ArbitraryJson +} + +type Query { + fetch(args: MyInput): Int +} +``` + +Then, submitting the query + +``` +query FetchData(: ArbitraryJson) { + fetch(args: { + json: + }) +} +``` + +and variables + +``` +{ + "myJsonValue": { + "field.with.dots": 1 + } +} +``` + +During scoring, the demand control plugin would attempt to convert the variable structure into a GraphQL-compliant structure requiring valid GraphQL names as keys. The dot characters in the keys however would cause a panic. + +With this fix, only the GraphQL compliant part of the input object is scored, and the arbitrary JSON marked by the custom scalar is scored as an opaque scalar (similar to how built-ins like `Int` or `String` are processed). + +By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6288 + +### Fix incorrect overriding of concrete type names with interface names when merging responses ([PR #6250](https://github.com/apollographql/router/pull/6250)) + +When using `@interfaceObject`, differing pieces of data can come back with either concrete types or interface types depending on the source. Previously, receiving the data in a particular order could incorrectly result in the interface name of a type overwriting its concrete name. + +To make the response merging order-agnostic, the router now checks the schema to ensure concrete types are not overwritten with interfaces or less specific types. + +By [@tninesling](https://github.com/tninesling) in https://github.com/apollographql/router/pull/6250 + +## 🛠 Maintenance + +### Query planner cache key improvements ([Issue #5160](https://github.com/apollographql/router/issues/5160)) + +> [!IMPORTANT] +> If you have enabled [Distributed query plan caching](https://www.apollographql.com/docs/router/configuration/distributed-caching/#distributed-query-plan-caching), this release changes the hashing algorithm used for the cache keys. On account of this, you should anticipate additional cache regeneration cost when updating between these versions while the new hashing algorithm comes into service. + +Several performance improvements have been implemented for query plan cache key generation. In particular, the distributed cache's key format has changed, which adds prefixes to the different key segments to help in debugging. + +By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6206 + +### Add entity caching invalidation configuration metrics ([PR #6286](https://github.com/apollographql/router/pull/6286)) + +We've added metrics for our analytics to know if entity caching invalidation is enabled. + +By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/6286 + +### Avoid creating stub span for supergraph events if current span exists ([PR #6096](https://github.com/apollographql/router/pull/6096)) + +The router optimized its telemetry implementation by not creating a redundant span when it already has a span available to use the span's extensions for supergraph events. + +By [@bnjjj](https://github.com/bnjjj) in https://github.com/apollographql/router/pull/6096 + +## 📚 Documentation + +### Clarify docs for authorization directive composition ([PR #6216](https://github.com/apollographql/router/pull/6216)) + +The docs for [authorization directive composition](https://www.apollographql.com/docs/graphos/routing/security/authorization#composition-and-federation) have been clarified, including corrected code examples. + + +By [@Meschreiber](https://github.com/Meschreiber) in https://github.com/apollographql/router/pull/6216 + + + # [1.57.1] - 2024-10-31 ## 🐛 Fixes diff --git a/Cargo.lock b/Cargo.lock index 34e2c836de..57a87514d6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -178,7 +178,7 @@ dependencies = [ [[package]] name = "apollo-federation" -version = "1.58.0-rc.2" +version = "1.58.0" dependencies = [ "apollo-compiler", "derive_more", @@ -231,7 +231,7 @@ dependencies = [ [[package]] name = "apollo-router" -version = "1.58.0-rc.2" +version = "1.58.0" dependencies = [ "access-json", "ahash", @@ -399,7 +399,7 @@ dependencies = [ [[package]] name = "apollo-router-benchmarks" -version = "1.58.0-rc.2" +version = "1.58.0" dependencies = [ "apollo-parser", "apollo-router", @@ -415,7 +415,7 @@ dependencies = [ [[package]] name = "apollo-router-scaffold" -version = "1.58.0-rc.2" +version = "1.58.0" dependencies = [ "anyhow", "cargo-scaffold", diff --git a/apollo-federation/Cargo.toml b/apollo-federation/Cargo.toml index e0e8b9150c..c0103f435e 100644 --- a/apollo-federation/Cargo.toml +++ b/apollo-federation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-federation" -version = "1.58.0-rc.2" +version = "1.58.0" authors = ["The Apollo GraphQL Contributors"] edition = "2021" description = "Apollo Federation" diff --git a/apollo-router-benchmarks/Cargo.toml b/apollo-router-benchmarks/Cargo.toml index 34410cad70..359391b4a7 100644 --- a/apollo-router-benchmarks/Cargo.toml +++ b/apollo-router-benchmarks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-router-benchmarks" -version = "1.58.0-rc.2" +version = "1.58.0" authors = ["Apollo Graph, Inc. "] edition = "2021" license = "Elastic-2.0" diff --git a/apollo-router-scaffold/Cargo.toml b/apollo-router-scaffold/Cargo.toml index 105b1ce0bd..8b68e56a12 100644 --- a/apollo-router-scaffold/Cargo.toml +++ b/apollo-router-scaffold/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-router-scaffold" -version = "1.58.0-rc.2" +version = "1.58.0" authors = ["Apollo Graph, Inc. "] edition = "2021" license = "Elastic-2.0" diff --git a/apollo-router-scaffold/templates/base/Cargo.template.toml b/apollo-router-scaffold/templates/base/Cargo.template.toml index 0a181f0008..00b111b264 100644 --- a/apollo-router-scaffold/templates/base/Cargo.template.toml +++ b/apollo-router-scaffold/templates/base/Cargo.template.toml @@ -22,7 +22,7 @@ apollo-router = { path ="{{integration_test}}apollo-router" } apollo-router = { git="https://github.com/apollographql/router.git", branch="{{branch}}" } {{else}} # Note if you update these dependencies then also update xtask/Cargo.toml -apollo-router = "1.58.0-rc.2" +apollo-router = "1.58.0" {{/if}} {{/if}} async-trait = "0.1.52" diff --git a/apollo-router-scaffold/templates/base/xtask/Cargo.template.toml b/apollo-router-scaffold/templates/base/xtask/Cargo.template.toml index e81afd56d8..db2a939c2a 100644 --- a/apollo-router-scaffold/templates/base/xtask/Cargo.template.toml +++ b/apollo-router-scaffold/templates/base/xtask/Cargo.template.toml @@ -13,7 +13,7 @@ apollo-router-scaffold = { path ="{{integration_test}}apollo-router-scaffold" } {{#if branch}} apollo-router-scaffold = { git="https://github.com/apollographql/router.git", branch="{{branch}}" } {{else}} -apollo-router-scaffold = { git = "https://github.com/apollographql/router.git", tag = "v1.58.0-rc.2" } +apollo-router-scaffold = { git = "https://github.com/apollographql/router.git", tag = "v1.58.0" } {{/if}} {{/if}} anyhow = "1.0.58" diff --git a/apollo-router/Cargo.toml b/apollo-router/Cargo.toml index ab3a737fd0..f2cedca917 100644 --- a/apollo-router/Cargo.toml +++ b/apollo-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-router" -version = "1.58.0-rc.2" +version = "1.58.0" authors = ["Apollo Graph, Inc. "] repository = "https://github.com/apollographql/router/" documentation = "https://docs.rs/apollo-router" @@ -66,7 +66,7 @@ features = ["docs_rs"] access-json = "0.1.0" anyhow = "1.0.86" apollo-compiler.workspace = true -apollo-federation = { path = "../apollo-federation", version = "=1.58.0-rc.2" } +apollo-federation = { path = "../apollo-federation", version = "=1.58.0" } arc-swap = "1.6.0" async-channel = "1.9.0" async-compression = { version = "0.4.6", features = [ diff --git a/dockerfiles/tracing/docker-compose.datadog.yml b/dockerfiles/tracing/docker-compose.datadog.yml index 1f9bc33cb9..e69604eb8c 100644 --- a/dockerfiles/tracing/docker-compose.datadog.yml +++ b/dockerfiles/tracing/docker-compose.datadog.yml @@ -3,7 +3,7 @@ services: apollo-router: container_name: apollo-router - image: ghcr.io/apollographql/router:v1.58.0-rc.2 + image: ghcr.io/apollographql/router:v1.58.0 volumes: - ./supergraph.graphql:/etc/config/supergraph.graphql - ./router/datadog.router.yaml:/etc/config/configuration.yaml diff --git a/dockerfiles/tracing/docker-compose.jaeger.yml b/dockerfiles/tracing/docker-compose.jaeger.yml index 0a22a025e4..8225d7799a 100644 --- a/dockerfiles/tracing/docker-compose.jaeger.yml +++ b/dockerfiles/tracing/docker-compose.jaeger.yml @@ -4,7 +4,7 @@ services: apollo-router: container_name: apollo-router #build: ./router - image: ghcr.io/apollographql/router:v1.58.0-rc.2 + image: ghcr.io/apollographql/router:v1.58.0 volumes: - ./supergraph.graphql:/etc/config/supergraph.graphql - ./router/jaeger.router.yaml:/etc/config/configuration.yaml diff --git a/dockerfiles/tracing/docker-compose.zipkin.yml b/dockerfiles/tracing/docker-compose.zipkin.yml index d6230610f5..a84a7f1fcf 100644 --- a/dockerfiles/tracing/docker-compose.zipkin.yml +++ b/dockerfiles/tracing/docker-compose.zipkin.yml @@ -4,7 +4,7 @@ services: apollo-router: container_name: apollo-router build: ./router - image: ghcr.io/apollographql/router:v1.58.0-rc.2 + image: ghcr.io/apollographql/router:v1.58.0 volumes: - ./supergraph.graphql:/etc/config/supergraph.graphql - ./router/zipkin.router.yaml:/etc/config/configuration.yaml diff --git a/helm/chart/router/Chart.yaml b/helm/chart/router/Chart.yaml index 7ff3a8b8f7..51cf64fa63 100644 --- a/helm/chart/router/Chart.yaml +++ b/helm/chart/router/Chart.yaml @@ -20,10 +20,10 @@ type: application # so it matches the shape of our release process and release automation. # By proxy of that decision, this version uses SemVer 2.0.0, though the prefix # of "v" is not included. -version: 1.58.0-rc.2 +version: 1.58.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: "v1.58.0-rc.2" +appVersion: "v1.58.0" diff --git a/helm/chart/router/README.md b/helm/chart/router/README.md index 15e2be484d..c68ab5cd8b 100644 --- a/helm/chart/router/README.md +++ b/helm/chart/router/README.md @@ -2,7 +2,7 @@ [router](https://github.com/apollographql/router) Rust Graph Routing runtime for Apollo Federation -![Version: 1.58.0-rc.2](https://img.shields.io/badge/Version-1.58.0--rc.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v1.58.0-rc.2](https://img.shields.io/badge/AppVersion-v1.58.0--rc.2-informational?style=flat-square) +![Version: 1.58.0](https://img.shields.io/badge/Version-1.58.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v1.58.0](https://img.shields.io/badge/AppVersion-v1.58.0-informational?style=flat-square) ## Prerequisites @@ -11,7 +11,7 @@ ## Get Repo Info ```console -helm pull oci://ghcr.io/apollographql/helm-charts/router --version 1.58.0-rc.2 +helm pull oci://ghcr.io/apollographql/helm-charts/router --version 1.58.0 ``` ## Install Chart @@ -19,7 +19,7 @@ helm pull oci://ghcr.io/apollographql/helm-charts/router --version 1.58.0-rc.2 **Important:** only helm3 is supported ```console -helm upgrade --install [RELEASE_NAME] oci://ghcr.io/apollographql/helm-charts/router --version 1.58.0-rc.2 --values my-values.yaml +helm upgrade --install [RELEASE_NAME] oci://ghcr.io/apollographql/helm-charts/router --version 1.58.0 --values my-values.yaml ``` _See [configuration](#configuration) below._ diff --git a/licenses.html b/licenses.html index 37ceccad5d..8d5e68ad9f 100644 --- a/licenses.html +++ b/licenses.html @@ -44,13 +44,13 @@

Third Party Licenses

Overview of licenses:

    -
  • Apache License 2.0 (445)
  • -
  • MIT License (154)
  • +
  • Apache License 2.0 (430)
  • +
  • MIT License (145)
  • BSD 3-Clause "New" or "Revised" License (11)
  • ISC License (8)
  • -
  • Elastic License 2.0 (6)
  • Mozilla Public License 2.0 (5)
  • BSD 2-Clause "Simplified" License (4)
  • +
  • Elastic License 2.0 (3)
  • Creative Commons Zero v1.0 Universal (2)
  • OpenSSL License (1)
  • Unicode License Agreement - Data Files and Software (2016) (1)
  • @@ -66,7 +66,6 @@

    Used by:

  • aws-config
  • aws-credential-types
  • aws-runtime
  • -
  • aws-sigv4
  • aws-smithy-async
  • aws-smithy-http
  • aws-smithy-json
  • @@ -1718,8 +1717,6 @@

    Used by:

    Apache License 2.0

    Used by:

    @@ -1943,191 +1940,6 @@

    Used by:

    the License, but only in their entirety and only with respect to the Combined Software. - - -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    -                                 Apache License
    -                           Version 2.0, January 2004
    -                        https://www.apache.org/licenses/
    -
    -   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    -
    -   1. Definitions.
    -
    -      "License" shall mean the terms and conditions for use, reproduction,
    -      and distribution as defined by Sections 1 through 9 of this document.
    -
    -      "Licensor" shall mean the copyright owner or entity authorized by
    -      the copyright owner that is granting the License.
    -
    -      "Legal Entity" shall mean the union of the acting entity and all
    -      other entities that control, are controlled by, or are under common
    -      control with that entity. For the purposes of this definition,
    -      "control" means (i) the power, direct or indirect, to cause the
    -      direction or management of such entity, whether by contract or
    -      otherwise, or (ii) ownership of fifty percent (50%) or more of the
    -      outstanding shares, or (iii) beneficial ownership of such entity.
    -
    -      "You" (or "Your") shall mean an individual or Legal Entity
    -      exercising permissions granted by this License.
    -
    -      "Source" form shall mean the preferred form for making modifications,
    -      including but not limited to software source code, documentation
    -      source, and configuration files.
    -
    -      "Object" form shall mean any form resulting from mechanical
    -      transformation or translation of a Source form, including but
    -      not limited to compiled object code, generated documentation,
    -      and conversions to other media types.
    -
    -      "Work" shall mean the work of authorship, whether in Source or
    -      Object form, made available under the License, as indicated by a
    -      copyright notice that is included in or attached to the work
    -      (an example is provided in the Appendix below).
    -
    -      "Derivative Works" shall mean any work, whether in Source or Object
    -      form, that is based on (or derived from) the Work and for which the
    -      editorial revisions, annotations, elaborations, or other modifications
    -      represent, as a whole, an original work of authorship. For the purposes
    -      of this License, Derivative Works shall not include works that remain
    -      separable from, or merely link (or bind by name) to the interfaces of,
    -      the Work and Derivative Works thereof.
    -
    -      "Contribution" shall mean any work of authorship, including
    -      the original version of the Work and any modifications or additions
    -      to that Work or Derivative Works thereof, that is intentionally
    -      submitted to Licensor for inclusion in the Work by the copyright owner
    -      or by an individual or Legal Entity authorized to submit on behalf of
    -      the copyright owner. For the purposes of this definition, "submitted"
    -      means any form of electronic, verbal, or written communication sent
    -      to the Licensor or its representatives, including but not limited to
    -      communication on electronic mailing lists, source code control systems,
    -      and issue tracking systems that are managed by, or on behalf of, the
    -      Licensor for the purpose of discussing and improving the Work, but
    -      excluding communication that is conspicuously marked or otherwise
    -      designated in writing by the copyright owner as "Not a Contribution."
    -
    -      "Contributor" shall mean Licensor and any individual or Legal Entity
    -      on behalf of whom a Contribution has been received by Licensor and
    -      subsequently incorporated within the Work.
    -
    -   2. Grant of Copyright License. Subject to the terms and conditions of
    -      this License, each Contributor hereby grants to You a perpetual,
    -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    -      copyright license to reproduce, prepare Derivative Works of,
    -      publicly display, publicly perform, sublicense, and distribute the
    -      Work and such Derivative Works in Source or Object form.
    -
    -   3. Grant of Patent License. Subject to the terms and conditions of
    -      this License, each Contributor hereby grants to You a perpetual,
    -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    -      (except as stated in this section) patent license to make, have made,
    -      use, offer to sell, sell, import, and otherwise transfer the Work,
    -      where such license applies only to those patent claims licensable
    -      by such Contributor that are necessarily infringed by their
    -      Contribution(s) alone or by combination of their Contribution(s)
    -      with the Work to which such Contribution(s) was submitted. If You
    -      institute patent litigation against any entity (including a
    -      cross-claim or counterclaim in a lawsuit) alleging that the Work
    -      or a Contribution incorporated within the Work constitutes direct
    -      or contributory patent infringement, then any patent licenses
    -      granted to You under this License for that Work shall terminate
    -      as of the date such litigation is filed.
    -
    -   4. Redistribution. You may reproduce and distribute copies of the
    -      Work or Derivative Works thereof in any medium, with or without
    -      modifications, and in Source or Object form, provided that You
    -      meet the following conditions:
    -
    -      (a) You must give any other recipients of the Work or
    -          Derivative Works a copy of this License; and
    -
    -      (b) You must cause any modified files to carry prominent notices
    -          stating that You changed the files; and
    -
    -      (c) You must retain, in the Source form of any Derivative Works
    -          that You distribute, all copyright, patent, trademark, and
    -          attribution notices from the Source form of the Work,
    -          excluding those notices that do not pertain to any part of
    -          the Derivative Works; and
    -
    -      (d) If the Work includes a "NOTICE" text file as part of its
    -          distribution, then any Derivative Works that You distribute must
    -          include a readable copy of the attribution notices contained
    -          within such NOTICE file, excluding those notices that do not
    -          pertain to any part of the Derivative Works, in at least one
    -          of the following places: within a NOTICE text file distributed
    -          as part of the Derivative Works; within the Source form or
    -          documentation, if provided along with the Derivative Works; or,
    -          within a display generated by the Derivative Works, if and
    -          wherever such third-party notices normally appear. The contents
    -          of the NOTICE file are for informational purposes only and
    -          do not modify the License. You may add Your own attribution
    -          notices within Derivative Works that You distribute, alongside
    -          or as an addendum to the NOTICE text from the Work, provided
    -          that such additional attribution notices cannot be construed
    -          as modifying the License.
    -
    -      You may add Your own copyright statement to Your modifications and
    -      may provide additional or different license terms and conditions
    -      for use, reproduction, or distribution of Your modifications, or
    -      for any such Derivative Works as a whole, provided Your use,
    -      reproduction, and distribution of the Work otherwise complies with
    -      the conditions stated in this License.
    -
    -   5. Submission of Contributions. Unless You explicitly state otherwise,
    -      any Contribution intentionally submitted for inclusion in the Work
    -      by You to the Licensor shall be under the terms and conditions of
    -      this License, without any additional terms or conditions.
    -      Notwithstanding the above, nothing herein shall supersede or modify
    -      the terms of any separate license agreement you may have executed
    -      with Licensor regarding such Contributions.
    -
    -   6. Trademarks. This License does not grant permission to use the trade
    -      names, trademarks, service marks, or product names of the Licensor,
    -      except as required for reasonable and customary use in describing the
    -      origin of the Work and reproducing the content of the NOTICE file.
    -
    -   7. Disclaimer of Warranty. Unless required by applicable law or
    -      agreed to in writing, Licensor provides the Work (and each
    -      Contributor provides its Contributions) on an "AS IS" BASIS,
    -      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    -      implied, including, without limitation, any warranties or conditions
    -      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    -      PARTICULAR PURPOSE. You are solely responsible for determining the
    -      appropriateness of using or redistributing the Work and assume any
    -      risks associated with Your exercise of permissions under this License.
    -
    -   8. Limitation of Liability. In no event and under no legal theory,
    -      whether in tort (including negligence), contract, or otherwise,
    -      unless required by applicable law (such as deliberate and grossly
    -      negligent acts) or agreed to in writing, shall any Contributor be
    -      liable to You for damages, including any direct, indirect, special,
    -      incidental, or consequential damages of any character arising as a
    -      result of this License or out of the use or inability to use the
    -      Work (including but not limited to damages for loss of goodwill,
    -      work stoppage, computer failure or malfunction, or any and all
    -      other commercial damages or losses), even if such Contributor
    -      has been advised of the possibility of such damages.
    -
    -   9. Accepting Warranty or Additional Liability. While redistributing
    -      the Work or Derivative Works thereof, You may choose to offer,
    -      and charge a fee for, acceptance of support, warranty, indemnity,
    -      or other liability obligations and/or rights consistent with this
    -      License. However, in accepting such obligations, You may act only
    -      on Your own behalf and on Your sole responsibility, not on behalf
    -      of any other Contributor, and only if You agree to indemnify,
    -      defend, and hold each Contributor harmless for any liability
    -      incurred by, or claims asserted against, such Contributor by reason
    -      of your accepting any such warranty or additional liability.
    -
    -   END OF TERMS AND CONDITIONS
     
  • @@ -3197,7 +3009,6 @@

    Used by:

  • clap_builder
  • clap_derive
  • clap_lex
  • -
  • opentelemetry-proto
                                 Apache License
                            Version 2.0, January 2004
@@ -5712,7 +5523,6 @@ 

Used by:

  • utf-8
  • utf8parse
  • wasm-streams
  • -
  • zerocopy
  •                               Apache License
                             Version 2.0, January 2004
    @@ -8432,7 +8242,6 @@ 

    Used by:

  • bytes-utils
  • cc
  • cfg-if
  • -
  • ci_info
  • cmake
  • concurrent-queue
  • const-random
  • @@ -8447,7 +8256,6 @@

    Used by:

  • derive_arbitrary
  • displaydoc
  • either
  • -
  • envmnt
  • equivalent
  • event-listener
  • fastrand
  • @@ -8458,7 +8266,6 @@

    Used by:

  • fnv
  • form_urlencoded
  • fraction
  • -
  • fsio
  • futures-lite
  • futures-timer
  • gimli
  • @@ -11257,53 +11064,6 @@

    Used by:

    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -
    - -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    # Contributing
    -
    -## License
    -
    -Licensed under either of
    -
    - * Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
    - * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
    -
    -at your option.
    -
    -### Contribution
    -
    -Unless you explicitly state otherwise, any contribution intentionally submitted
    -for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any
    -additional terms or conditions.
    -
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    ../../LICENSE-APACHE
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    // Licensed under the Apache License, Version 2.0
    -// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
    -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
    -// All files in the project carrying such notice may not be copied, modified, or distributed
    -// except according to those terms.
     
  • @@ -11940,10 +11700,14 @@

    Used by:

    Apache License 2.0

    Used by:

  • - -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    Copyright [2022] [Bryn Cooke]
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
    -Unless required by applicable law or agreed to in writing, software
    -distributed under the License is distributed on an "AS IS" BASIS,
    -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -See the License for the specific language governing permissions and
    -limitations under the License.
    -
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    Copyright [2023] [Bryn Cooke]
    -
    -Licensed under the Apache License, Version 2.0 (the "License");
    -you may not use this file except in compliance with the License.
    -You may obtain a copy of the License at
    -
    -    http://www.apache.org/licenses/LICENSE-2.0
    -
     Unless required by applicable law or agreed to in writing, software
     distributed under the License is distributed on an "AS IS" BASIS,
     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    @@ -12105,33 +11828,6 @@ 

    Used by:

    at your option. All files in the project carrying such notice may not be copied, modified, or distributed except according to those terms. -
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    MIT OR Apache-2.0
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    MIT OR Apache-2.0
    -
    -
  • -
  • -

    Apache License 2.0

    -

    Used by:

    - -
    MIT or Apache-2.0
     
  • @@ -12694,9 +12390,6 @@

    Elastic License 2.0

    Used by:

    Copyright 2021 Apollo Graph, Inc.
     
    @@ -12961,6 +12654,36 @@ 

    Used by:

    // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +
    +
  • +
  • +

    ISC License

    +

    Used by:

    + +
    // Copyright 2021 Brian Smith.
    +//
    +// Permission to use, copy, modify, and/or distribute this software for any
    +// purpose with or without fee is hereby granted, provided that the above
    +// copyright notice and this permission notice appear in all copies.
    +//
    +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
    +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
    +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    +
    +#[test]
    +fn cert_without_extensions_test() {
    +    // Check the certificate is valid with
    +    // `openssl x509 -in cert_without_extensions.der -inform DER -text -noout`
    +    const CERT_WITHOUT_EXTENSIONS_DER: &[u8] = include_bytes!("cert_without_extensions.der");
    +
    +    assert!(webpki::EndEntityCert::try_from(CERT_WITHOUT_EXTENSIONS_DER).is_ok());
    +}
     
  • @@ -13030,7 +12753,6 @@

    ISC License

    Used by:

    ISC License:
     
    @@ -13752,66 +13474,6 @@ 

    Used by:

    shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -DEALINGS IN THE SOFTWARE. -
    -
  • -
  • -

    MIT License

    -

    Used by:

    - -
    Copyright (c) 2019 Carl Lerche
    -
    -Permission is hereby granted, free of charge, to any
    -person obtaining a copy of this software and associated
    -documentation files (the "Software"), to deal in the
    -Software without restriction, including without
    -limitation the rights to use, copy, modify, merge,
    -publish, distribute, sublicense, and/or sell copies of
    -the Software, and to permit persons to whom the Software
    -is furnished to do so, subject to the following
    -conditions:
    -
    -The above copyright notice and this permission notice
    -shall be included in all copies or substantial portions
    -of the Software.
    -
    -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
    -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
    -TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
    -PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
    -SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
    -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
    -IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
    -DEALINGS IN THE SOFTWARE.
    -
    -Copyright (c) 2018 David Tolnay
    -
    -Permission is hereby granted, free of charge, to any
    -person obtaining a copy of this software and associated
    -documentation files (the "Software"), to deal in the
    -Software without restriction, including without
    -limitation the rights to use, copy, modify, merge,
    -publish, distribute, sublicense, and/or sell copies of
    -the Software, and to permit persons to whom the Software
    -is furnished to do so, subject to the following
    -conditions:
    -
    -The above copyright notice and this permission notice
    -shall be included in all copies or substantial portions
    -of the Software.
    -
     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
     ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
     TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
    @@ -14818,6 +14480,8 @@ 

    Used by:

    MIT License

    Used by:

      +
    • async-stream
    • +
    • async-stream-impl
    • base64-simd
    • convert_case
    • cookie-factory
    • @@ -15160,8 +14824,6 @@

      Used by:

      The MIT License (MIT)
       
      @@ -15660,14 +15322,7 @@ 

      Used by:

      MIT License

      Used by:

      This project is dual-licensed under the Unlicense and MIT licenses.
       
      @@ -16069,6 +15724,7 @@ 

      Used by:

      Mozilla Public License 2.0

      Used by:

      Mozilla Public License Version 2.0
      @@ -16451,8 +16107,8 @@ 

      Used by:

      Mozilla Public License 2.0

      Used by:

      Mozilla Public License Version 2.0
       ==================================
      @@ -16827,35 +16483,6 @@ 

      Used by:

      This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0. -
      - -
    • -

      Mozilla Public License 2.0

      -

      Used by:

      - -
      This packge contains a modified version of ca-bundle.crt:
      -
      -ca-bundle.crt -- Bundle of CA Root Certificates
      -
      -Certificate data from Mozilla as of: Thu Nov  3 19:04:19 2011#
      -This is a bundle of X.509 certificates of public Certificate Authorities
      -(CA). These were automatically extracted from Mozilla's root certificates
      -file (certdata.txt).  This file can be found in the mozilla source tree:
      -http://mxr.mozilla.org/mozilla/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1#
      -It contains the certificates in PEM format and therefore
      -can be directly used with curl / libcurl / php_curl, or with
      -an Apache+mod_ssl webserver for SSL client authentication.
      -Just configure this file as the SSLCACertificateFile.#
      -
      -***** BEGIN LICENSE BLOCK *****
      -This Source Code Form is subject to the terms of the Mozilla Public License,
      -v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain
      -one at http://mozilla.org/MPL/2.0/.
      -
      -***** END LICENSE BLOCK *****
      -@(#) $RCSfile: certdata.txt,v $ $Revision: 1.80 $ $Date: 2011/11/03 15:11:58 $
       
    • diff --git a/scripts/install.sh b/scripts/install.sh index a1b50a9ae3..6446019f5b 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -11,7 +11,7 @@ BINARY_DOWNLOAD_PREFIX="https://github.com/apollographql/router/releases/downloa # Router version defined in apollo-router's Cargo.toml # Note: Change this line manually during the release steps. -PACKAGE_VERSION="v1.58.0-rc.2" +PACKAGE_VERSION="v1.58.0" download_binary() { downloader --check From 8a68998ae09b41d216c444759f2027619bc33378 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Tue, 26 Nov 2024 12:13:19 +0200 Subject: [PATCH 2/5] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Renée --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cebb213989..4ffdddd835 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,7 +65,7 @@ The router now compresses operations sent to subgraphs by default by generating definitions and using them in the operation. This change enables `generate_query_fragments` by default while disabling `experimental_reuse_query_fragments`. When enabled, `experimental_reuse_query_fragments` attempts to intelligently reuse the fragment definitions -from the original operation. However, fragment generation with `generate_query_fragments` is much faster also produces better outputs in most cases. +from the original operation. However, fragment generation with `generate_query_fragments` is much faster and produces better outputs in most cases. If you are relying on the shape of fragments in your subgraph operations or tests, you can opt out of the new algorithm with the configuration below. From 2ef1a9ada640ee40b3235220fe3c2b7d57911927 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Tue, 26 Nov 2024 12:16:27 +0200 Subject: [PATCH 3/5] Apply feedback from review Ref: https://github.com/apollographql/router/pull/6331#discussion_r1858196420 --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ffdddd835..983ed8d798 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ This project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2. # [1.58.0] - 2024-11-26 +> [!IMPORTANT] +> If you have enabled [Distributed query plan caching](https://www.apollographql.com/docs/router/configuration/distributed-caching/#distributed-query-plan-caching), this release contains changes which necessarily alter the hashing algorithm used for the cache keys. On account of this, you should anticipate additional cache regeneration cost when updating between these versions while the new hashing algorithm comes into service. + ## 🚀 Features ### Support DNS resolution strategy configuration ([PR #6109](https://github.com/apollographql/router/pull/6109)) @@ -261,9 +264,6 @@ By [@tninesling](https://github.com/tninesling) in https://github.com/apollograp ### Query planner cache key improvements ([Issue #5160](https://github.com/apollographql/router/issues/5160)) -> [!IMPORTANT] -> If you have enabled [Distributed query plan caching](https://www.apollographql.com/docs/router/configuration/distributed-caching/#distributed-query-plan-caching), this release changes the hashing algorithm used for the cache keys. On account of this, you should anticipate additional cache regeneration cost when updating between these versions while the new hashing algorithm comes into service. - Several performance improvements have been implemented for query plan cache key generation. In particular, the distributed cache's key format has changed, which adds prefixes to the different key segments to help in debugging. By [@Geal](https://github.com/Geal) in https://github.com/apollographql/router/pull/6206 From e51e2a57d1b03598f6716076d2a512086af0b5c6 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Tue, 26 Nov 2024 12:29:14 +0200 Subject: [PATCH 4/5] Update CHANGELOG.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Renée --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983ed8d798..7d1bcc5f6d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -172,7 +172,7 @@ By [@garypen](https://github.com/garypen) in https://github.com/apollographql/ro The router now avoids blocking threads when executing asynchronous code by using a thread pool with a priority queue. -This improves the performance of the following components can take non-trivial amounts of CPU time: +This improves the performance of the following components that can take non-trivial amounts of CPU time: * GraphQL parsing * GraphQL validation From 3402a333839020366169525d949f0d7547b25ea6 Mon Sep 17 00:00:00 2001 From: Jesse Rosenberger Date: Tue, 26 Nov 2024 16:32:13 +0200 Subject: [PATCH 5/5] Apply suggestions from code review Co-authored-by: Iryna Shestak --- CHANGELOG.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d1bcc5f6d..2db933defe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -124,8 +124,12 @@ By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apol ### Add `@context` support in the native query planner ([PR #6310](https://github.com/apollographql/router/pull/6310)) -The [`@context`](https://www.apollographql.com/docs/graphos/reference/federation/directives#context) feature is now available in the native query planner. -This brings the native query planner to feature parity with the legacy query planner for all Federation v2 graphs. +The [`@context`](https://www.apollographql.com/docs/graphos/reference/federation/directives#context) feature is now available in the [native query planner](https://www.apollographql.com/docs/graphos/routing/query-planning/native-query-planner). +This brings the native query planner to feature parity with the legacy query planner for all Federation v2 graphs. The native query planner can be enabled with the following configuration: +```yaml, filename=router.yaml +experimental_query_planner_mode: new +``` + By [@clenfest](https://github.com/clenfest), [@TylerBloom](https://github.com/TylerBloom) in https://github.com/apollographql/router/pull/6310 @@ -179,8 +183,7 @@ This improves the performance of the following components that can take non-triv * Query planning * Schema introspection -In order to avoid blocking threads that execute asynchronous code, -they are now run in a new thread pool with a priority queue. The size of the thread pool is based on the number of available CPU cores. +The size of the thread pool is based on the number of available CPU cores. The thread pool replaces the router's prior implementation that used Tokio’s [`spawn_blocking`](https://docs.rs/tokio/latest/tokio/task/fn.spawn_blocking.html).