diff --git a/.changesets/exp_hoist_orphan_errors.md b/.changesets/exp_hoist_orphan_errors.md deleted file mode 100644 index 52ed8a8773..0000000000 --- a/.changesets/exp_hoist_orphan_errors.md +++ /dev/null @@ -1,43 +0,0 @@ -### Add `experimental_hoist_orphan_errors` to control orphan error path assignment - -The GraphQL specification requires that errors include a `path` pointing to the most specific field where the error occurred. When a subgraph returns entity errors without valid paths, the router's default behavior is its closest attempt at spec compliance: it assigns each error to every matching entity path in the response. This is the correct behavior when subgraphs respond correctly. - -However, when a subgraph returns a large number of entity errors without valid paths โ€” for example, 2000 errors for 2000 expected entities โ€” this causes a multiplicative explosion in the error array that can lead to significant memory pressure and out-of-memory kills. The root cause is the subgraph: a spec-compliant subgraph includes correct paths on its entity errors, and fixing the subgraph is the right long-term solution. - -The new `experimental_hoist_orphan_errors` configuration provides an important mitigation while you work toward that fix. When enabled, the router assigns each orphaned error to the nearest non-array ancestor path instead of duplicating it across every entity. This trades spec-precise path assignment for substantially reduced error volume in the response โ€” a conscious trade-off, not a strict improvement. - -To target a specific subgraph: - -```yaml -experimental_hoist_orphan_errors: - subgraphs: - my_subgraph: - enabled: true -``` - -To target all subgraphs: - -```yaml -experimental_hoist_orphan_errors: - all: - enabled: true -``` - -To target all subgraphs except one: - -```yaml -experimental_hoist_orphan_errors: - all: - enabled: true - subgraphs: - noisy_one: - enabled: false -``` - -Per-subgraph settings override `all`. Note that this feature reduces the number of propagated errors but doesn't impose a hard cap โ€” if your subgraph returns an extremely large number of errors, the router still processes all of them. - -You'll likely know if you need this. Use it sparingly, and enable it only if you're affected and have been advised to do so. The behavior of this option is expected to change in a future release. - -For full configuration reference and additional examples, see the [`experimental_hoist_orphan_errors` documentation](https://www.apollographql.com/docs/graphos/routing/configuration/yaml#experimental_hoist_orphan_errors). - -By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8998 diff --git a/.changesets/fix_license_handling.md b/.changesets/fix_license_handling.md deleted file mode 100644 index c10714307e..0000000000 --- a/.changesets/fix_license_handling.md +++ /dev/null @@ -1,7 +0,0 @@ -### Enforce feature restrictions for warning-state licenses - -The router now enforces license restrictions even when a license is in a warning state. Previously, warning-state licenses could bypass enforcement for restricted features. - -If your deployment uses restricted features, the router returns an error instead of continuing to run. - -By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8768 diff --git a/CHANGELOG.md b/CHANGELOG.md index b1c4df0d9b..83064ac6d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,66 @@ This project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html). +# [2.10.1] - 2026-03-11 + +## ๐Ÿ› Fixes + +### Enforce feature restrictions for warning-state licenses + +The router now enforces license restrictions even when a license is in a warning state. Previously, warning-state licenses could bypass enforcement for restricted features. + +If your deployment uses restricted features, the router returns an error instead of continuing to run. + +By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8768 + +## ๐Ÿงช Experimental + +### Add `experimental_hoist_orphan_errors` to control orphan error path assignment + +The GraphQL specification requires that errors include a `path` pointing to the most specific field where the error occurred. When a subgraph returns entity errors without valid paths, the router's default behavior is its closest attempt at spec compliance: it assigns each error to every matching entity path in the response. This is the correct behavior when subgraphs respond correctly. + +However, when a subgraph returns a large number of entity errors without valid paths โ€” for example, 2000 errors for 2000 expected entities โ€” this causes a multiplicative explosion in the error array that can lead to significant memory pressure and out-of-memory kills. The root cause is the subgraph: a spec-compliant subgraph includes correct paths on its entity errors, and fixing the subgraph is the right long-term solution. + +The new `experimental_hoist_orphan_errors` configuration provides an important mitigation while you work toward that fix. When enabled, the router assigns each orphaned error to the nearest non-array ancestor path instead of duplicating it across every entity. This trades spec-precise path assignment for substantially reduced error volume in the response โ€” a conscious trade-off, not a strict improvement. + +To target a specific subgraph: + +```yaml +experimental_hoist_orphan_errors: + subgraphs: + my_subgraph: + enabled: true +``` + +To target all subgraphs: + +```yaml +experimental_hoist_orphan_errors: + all: + enabled: true +``` + +To target all subgraphs except one: + +```yaml +experimental_hoist_orphan_errors: + all: + enabled: true + subgraphs: + noisy_one: + enabled: false +``` + +Per-subgraph settings override `all`. Note that this feature reduces the number of propagated errors but doesn't impose a hard cap โ€” if your subgraph returns an extremely large number of errors, the router still processes all of them. + +You'll likely know if you need this. Use it sparingly, and enable it only if you're affected and have been advised to do so. The behavior of this option is expected to change in a future release. + +For full configuration reference and additional examples, see the [`experimental_hoist_orphan_errors` documentation](https://www.apollographql.com/docs/graphos/routing/configuration/yaml#experimental_hoist_orphan_errors). + +By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8998 + + + # [2.10.0] - 2025-12-11 ## ๐Ÿš€ Features diff --git a/Cargo.lock b/Cargo.lock index b538b6bed4..0d33c2ed54 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -212,7 +212,7 @@ dependencies = [ [[package]] name = "apollo-federation" -version = "2.10.1-rc.2" +version = "2.10.1" dependencies = [ "apollo-compiler", "apollo-federation", @@ -286,7 +286,7 @@ dependencies = [ [[package]] name = "apollo-router" -version = "2.10.1-rc.2" +version = "2.10.1" dependencies = [ "addr2line 0.25.1", "ahash", @@ -462,7 +462,7 @@ dependencies = [ [[package]] name = "apollo-router-benchmarks" -version = "2.10.1-rc.2" +version = "2.10.1" dependencies = [ "apollo-parser", "apollo-router", diff --git a/apollo-federation/Cargo.toml b/apollo-federation/Cargo.toml index edcfebfd62..7f25a5ee9b 100644 --- a/apollo-federation/Cargo.toml +++ b/apollo-federation/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-federation" -version = "2.10.1-rc.2" +version = "2.10.1" authors = ["The Apollo GraphQL Contributors"] edition = "2024" description = "Apollo Federation" diff --git a/apollo-router-benchmarks/Cargo.toml b/apollo-router-benchmarks/Cargo.toml index d78ce0a41d..069dd36869 100644 --- a/apollo-router-benchmarks/Cargo.toml +++ b/apollo-router-benchmarks/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-router-benchmarks" -version = "2.10.1-rc.2" +version = "2.10.1" authors = ["Apollo Graph, Inc. "] edition = "2021" license = "Elastic-2.0" diff --git a/apollo-router/Cargo.toml b/apollo-router/Cargo.toml index d62df7397a..5c334e8b91 100644 --- a/apollo-router/Cargo.toml +++ b/apollo-router/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "apollo-router" -version = "2.10.1-rc.2" +version = "2.10.1" authors = ["Apollo Graph, Inc. "] repository = "https://github.com/apollographql/router/" documentation = "https://docs.rs/apollo-router" @@ -59,7 +59,7 @@ snapshot = [] addr2line = "0.25.0" anyhow = "1.0.86" apollo-compiler.workspace = true -apollo-federation = { path = "../apollo-federation", version = "=2.10.1-rc.2" } +apollo-federation = { path = "../apollo-federation", version = "=2.10.1" } async-compression = { version = "0.4.6", features = [ "tokio", "futures-io", diff --git a/docs/shared/k8s-manual-config.mdx b/docs/shared/k8s-manual-config.mdx index 8f3785bbde..7bdaea41f4 100644 --- a/docs/shared/k8s-manual-config.mdx +++ b/docs/shared/k8s-manual-config.mdx @@ -6,10 +6,10 @@ kind: ServiceAccount metadata: name: release-name-router labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm --- # Source: router/templates/secret.yaml @@ -18,10 +18,10 @@ kind: Secret metadata: name: "release-name-router" labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm data: managedFederationApiKey: "UkVEQUNURUQ=" @@ -32,10 +32,10 @@ kind: ConfigMap metadata: name: release-name-router labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm data: configuration.yaml: | @@ -55,10 +55,10 @@ kind: Service metadata: name: release-name-router labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm spec: type: ClusterIP @@ -81,10 +81,10 @@ kind: Deployment metadata: name: release-name-router labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm annotations: @@ -103,10 +103,10 @@ spec: annotations: kubectl.kubernetes.io/default-container: router labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm spec: serviceAccountName: release-name-router @@ -117,7 +117,7 @@ spec: - name: router securityContext: {} - image: "ghcr.io/apollographql/router:v2.10.1-rc.2" + image: "ghcr.io/apollographql/router:v2.10.1" imagePullPolicy: IfNotPresent args: - --hot-reload @@ -171,10 +171,10 @@ kind: Pod metadata: name: "release-name-router-test-connection" labels: - helm.sh/chart: router-2.10.1-rc.2 + helm.sh/chart: router-2.10.1 app.kubernetes.io/name: router app.kubernetes.io/instance: release-name - app.kubernetes.io/version: "v2.10.1-rc.2" + app.kubernetes.io/version: "v2.10.1" app.kubernetes.io/managed-by: Helm annotations: "helm.sh/hook": test diff --git a/helm/chart/router/Chart.yaml b/helm/chart/router/Chart.yaml index bf900e8620..1d9b4a03dc 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: 2.10.1-rc.2 +version: 2.10.1 # 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: "v2.10.1-rc.2" +appVersion: "v2.10.1" diff --git a/helm/chart/router/README.md b/helm/chart/router/README.md index 5bfda41e73..b5a800546f 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: 2.10.1-rc.2](https://img.shields.io/badge/Version-2.10.1--rc.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v2.10.1-rc.2](https://img.shields.io/badge/AppVersion-v2.10.1--rc.2-informational?style=flat-square) +![Version: 2.10.1](https://img.shields.io/badge/Version-2.10.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: v2.10.1](https://img.shields.io/badge/AppVersion-v2.10.1-informational?style=flat-square) ## Prerequisites @@ -11,7 +11,7 @@ ## Get Repo Info ```console -helm pull oci://ghcr.io/apollographql/helm-charts/router --version 2.10.1-rc.2 +helm pull oci://ghcr.io/apollographql/helm-charts/router --version 2.10.1 ``` ## Install Chart @@ -19,7 +19,7 @@ helm pull oci://ghcr.io/apollographql/helm-charts/router --version 2.10.1-rc.2 **Important:** only helm3 is supported ```console -helm upgrade --install [RELEASE_NAME] oci://ghcr.io/apollographql/helm-charts/router --version 2.10.1-rc.2 --values my-values.yaml +helm upgrade --install [RELEASE_NAME] oci://ghcr.io/apollographql/helm-charts/router --version 2.10.1 --values my-values.yaml ``` _See [configuration](#configuration) below._ diff --git a/scripts/install.sh b/scripts/install.sh index ca90ff3e35..1dec660995 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -11,7 +11,7 @@ BINARY_DOWNLOAD_PREFIX="${APOLLO_ROUTER_BINARY_DOWNLOAD_PREFIX:="https://github. # Router version defined in apollo-router's Cargo.toml # Note: Change this line manually during the release steps. -PACKAGE_VERSION="v2.10.1-rc.2" +PACKAGE_VERSION="v2.10.1" download_binary() { downloader --check