Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 0 additions & 43 deletions .changesets/exp_hoist_orphan_errors.md

This file was deleted.

7 changes: 0 additions & 7 deletions .changesets/fix_license_handling.md

This file was deleted.

60 changes: 60 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions Cargo.lock
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ dependencies = [

[[package]]
name = "apollo-federation"
version = "2.10.1-rc.2"
version = "2.10.1"
dependencies = [
"apollo-compiler",
"apollo-federation",
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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",
Expand Down
2 changes: 1 addition & 1 deletion apollo-federation/Cargo.toml
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 1 addition & 1 deletion apollo-router-benchmarks/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "apollo-router-benchmarks"
version = "2.10.1-rc.2"
version = "2.10.1"
authors = ["Apollo Graph, Inc. <packages@apollographql.com>"]
edition = "2021"
license = "Elastic-2.0"
Expand Down
4 changes: 2 additions & 2 deletions apollo-router/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "apollo-router"
version = "2.10.1-rc.2"
version = "2.10.1"
authors = ["Apollo Graph, Inc. <packages@apollographql.com>"]
repository = "https://github.com/apollographql/router/"
documentation = "https://docs.rs/apollo-router"
Expand Down Expand Up @@ -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",
Expand Down
30 changes: 15 additions & 15 deletions docs/shared/k8s-manual-config.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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="
Expand All @@ -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: |
Expand All @@ -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
Expand All @@ -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:

Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions helm/chart/router/Chart.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
6 changes: 3 additions & 3 deletions helm/chart/router/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -11,15 +11,15 @@
## 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

**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._
Expand Down
2 changes: 1 addition & 1 deletion scripts/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down