You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+60Lines changed: 60 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,6 +2,66 @@
2
2
3
3
This project adheres to [Semantic Versioning v2.0.0](https://semver.org/spec/v2.0.0.html).
4
4
5
+
# [2.10.1] - 2026-03-11
6
+
7
+
## 🐛 Fixes
8
+
9
+
### Enforce feature restrictions for warning-state licenses
10
+
11
+
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.
12
+
13
+
If your deployment uses restricted features, the router returns an error instead of continuing to run.
14
+
15
+
By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8768
16
+
17
+
## 🧪 Experimental
18
+
19
+
### Add `experimental_hoist_orphan_errors` to control orphan error path assignment
20
+
21
+
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.
22
+
23
+
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.
24
+
25
+
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.
26
+
27
+
To target a specific subgraph:
28
+
29
+
```yaml
30
+
experimental_hoist_orphan_errors:
31
+
subgraphs:
32
+
my_subgraph:
33
+
enabled: true
34
+
```
35
+
36
+
To target all subgraphs:
37
+
38
+
```yaml
39
+
experimental_hoist_orphan_errors:
40
+
all:
41
+
enabled: true
42
+
```
43
+
44
+
To target all subgraphs except one:
45
+
46
+
```yaml
47
+
experimental_hoist_orphan_errors:
48
+
all:
49
+
enabled: true
50
+
subgraphs:
51
+
noisy_one:
52
+
enabled: false
53
+
```
54
+
55
+
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.
56
+
57
+
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.
58
+
59
+
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).
60
+
61
+
By [@aaronArinder](https://github.com/aaronArinder) in https://github.com/apollographql/router/pull/8998
Copy file name to clipboardExpand all lines: apollo-router/src/configuration/snapshots/apollo_router__configuration__tests__schema_generation.snap
+51Lines changed: 51 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -5481,6 +5481,18 @@ expression: "&schema"
5481
5481
}
5482
5482
]
5483
5483
},
5484
+
"HoistOrphanErrors": {
5485
+
"additionalProperties": false,
5486
+
"description": "Per-subgraph configuration for hoisting orphan errors.\n\n\"Orphan errors\" are errors from entity fetches that lack a valid `_entities` path.\nWhen hoisting is enabled, these errors are assigned to the nearest non-array\nancestor in the response path, preventing them from being duplicated across\nevery element in an array.",
5487
+
"properties": {
5488
+
"enabled": {
5489
+
"default": false,
5490
+
"description": "Enable hoisting of orphan errors for this subgraph.",
5491
+
"type": "boolean"
5492
+
}
5493
+
},
5494
+
"type": "object"
5495
+
},
5484
5496
"Homepage": {
5485
5497
"additionalProperties": false,
5486
5498
"description": "Configuration options pertaining to the home page.",
@@ -9476,6 +9488,31 @@ expression: "&schema"
9476
9488
},
9477
9489
"type": "object"
9478
9490
},
9491
+
"SubgraphHoistOrphanErrorsConfiguration": {
9492
+
"description": "Configuration options pertaining to the subgraph server component.",
9493
+
"properties": {
9494
+
"all": {
9495
+
"allOf": [
9496
+
{
9497
+
"$ref": "#/definitions/HoistOrphanErrors"
9498
+
}
9499
+
],
9500
+
"default": {
9501
+
"enabled": false
9502
+
},
9503
+
"description": "options applying to all subgraphs"
"description": "When enabled for specific subgraphs, orphan errors (those without a valid\n`_entities` path) are assigned to the nearest non-array ancestor in the\nresponse path, preventing them from being duplicated across every array\nelement."
0 commit comments