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
7 changes: 7 additions & 0 deletions .changesets/fix_query_hash_speedup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
### Improve performance of query hashing by using a precomputed schema hash ([PR #6622](https://github.com/apollographql/router/pull/6622))

The router now uses a simpler and faster query hashing algorithm with more predictable CPU and memory usage. This improvement is enabled by using a precomputed hash of the entire schema, rather than computing and hashing the subset of types and fields used by each query.

For more details on why these design decisions were made, please see the [PR description](https://github.com/apollographql/router/pull/6622)

By [@IvanGoncharov](https://github.com/IvanGoncharov) in https://github.com/apollographql/router/pull/6622
4 changes: 2 additions & 2 deletions apollo-router/src/batching.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,14 @@ use crate::error::FetchError;
use crate::error::SubgraphBatchingError;
use crate::graphql;
use crate::plugins::telemetry::otel::span_ext::OpenTelemetrySpanExt;
use crate::query_planner::fetch::QueryHash;
use crate::services::http::HttpClientServiceFactory;
use crate::services::process_batches;
use crate::services::router::body::get_body_bytes;
use crate::services::router::body::RouterBody;
use crate::services::subgraph::SubgraphRequestId;
use crate::services::SubgraphRequest;
use crate::services::SubgraphResponse;
use crate::spec::QueryHash;
use crate::Context;

/// A query that is part of a batch.
Expand Down Expand Up @@ -485,13 +485,13 @@ mod tests {
use crate::graphql;
use crate::graphql::Request;
use crate::layers::ServiceExt as LayerExt;
use crate::query_planner::fetch::QueryHash;
use crate::services::http::HttpClientServiceFactory;
use crate::services::router;
use crate::services::subgraph;
use crate::services::subgraph::SubgraphRequestId;
use crate::services::SubgraphRequest;
use crate::services::SubgraphResponse;
use crate::spec::QueryHash;
use crate::Configuration;
use crate::Context;
use crate::TestHarness;
Expand Down
6 changes: 3 additions & 3 deletions apollo-router/src/plugin/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ where
Schema::parse_and_validate(supergraph_sdl.to_string(), PathBuf::from("synthetic"))
.expect("failed to parse supergraph schema"),
))
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into())
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into_inner())
.supergraph_sdl(supergraph_sdl)
.notify(Notify::builder().build())
.build()
Expand All @@ -119,7 +119,7 @@ where
BoxError::from(e.errors.to_string())
})?,
))
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into())
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into_inner())
.supergraph_sdl(supergraph_sdl)
.notify(Notify::builder().build())
.build()
Expand All @@ -136,7 +136,7 @@ where

PluginInit::fake_builder()
.config(config)
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into())
.supergraph_schema_id(crate::spec::Schema::schema_id(&supergraph_sdl).into_inner())
.supergraph_sdl(supergraph_sdl)
.supergraph_schema(supergraph_schema)
.launch_id(Arc::new("launch_id".to_string()))
Expand Down
6 changes: 4 additions & 2 deletions apollo-router/src/plugins/cache/entity.rs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,11 @@ use crate::json_ext::PathElement;
use crate::plugin::Plugin;
use crate::plugin::PluginInit;
use crate::plugins::authorization::CacheKeyMetadata;
use crate::query_planner::fetch::QueryHash;
use crate::query_planner::OperationKind;
use crate::services::subgraph;
use crate::services::subgraph::SubgraphRequestId;
use crate::services::supergraph;
use crate::spec::QueryHash;
use crate::spec::TYPENAME;
use crate::Context;
use crate::Endpoint;
Expand Down Expand Up @@ -1220,9 +1220,11 @@ pub(crate) fn hash_vary_headers(headers: &http::HeaderMap) -> String {
hex::encode(digest.finalize().as_slice())
}

// XXX(@goto-bus-stop): this doesn't make much sense: QueryHash already includes the operation name.
// This function can be removed outright later at the cost of invalidating all entity caches.
pub(crate) fn hash_query(query_hash: &QueryHash, body: &graphql::Request) -> String {
let mut digest = Sha256::new();
digest.update(&query_hash.0);
digest.update(query_hash.as_bytes());
digest.update(&[0u8; 1][..]);
digest.update(body.operation_name.as_deref().unwrap_or("-").as_bytes());
digest.update(&[0u8; 1][..]);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:ab9056ba140750aa8fe58360172b450fa717e7ea177e4a3c9426fe1291a88da2:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:e734548bbe559d607f045e8fe5b5225543a1093dac991e137d1208a12af536de:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "cached",
"cache_control": "public"
},
{
"key": "version:1.0:subgraph:user:type:Query:hash:0d4d253b049bbea514a54a892902fa4b9b658aedc9b8f2a1308323cdeef3c0ca:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:user:type:Query:hash:3e689b15c9cee1f2812c319a66ddbe8bfc452c8ab6759566ed1987cae95178cd:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "cached",
"cache_control": "public"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:ab9056ba140750aa8fe58360172b450fa717e7ea177e4a3c9426fe1291a88da2:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:e734548bbe559d607f045e8fe5b5225543a1093dac991e137d1208a12af536de:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "new",
"cache_control": "public"
},
{
"key": "version:1.0:subgraph:user:type:Query:hash:0d4d253b049bbea514a54a892902fa4b9b658aedc9b8f2a1308323cdeef3c0ca:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:user:type:Query:hash:3e689b15c9cee1f2812c319a66ddbe8bfc452c8ab6759566ed1987cae95178cd:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "new",
"cache_control": "public"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5221ff42b311b757445c096c023cee4fefab5de49735e421c494f1119326317b:hash:4913f52405bb614177e7c718d43da695c2f0e7411707c2f77f1c62380153c8d8:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5221ff42b311b757445c096c023cee4fefab5de49735e421c494f1119326317b:hash:5f460b74668616b2388b1afed7af6557ee4a0d60fbca18f3b4c59b8027035f32:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "cached",
"cache_control": "[REDACTED]"
},
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:4913f52405bb614177e7c718d43da695c2f0e7411707c2f77f1c62380153c8d8:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:5f460b74668616b2388b1afed7af6557ee4a0d60fbca18f3b4c59b8027035f32:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "cached",
"cache_control": "[REDACTED]"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5221ff42b311b757445c096c023cee4fefab5de49735e421c494f1119326317b:hash:4913f52405bb614177e7c718d43da695c2f0e7411707c2f77f1c62380153c8d8:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5221ff42b311b757445c096c023cee4fefab5de49735e421c494f1119326317b:hash:5f460b74668616b2388b1afed7af6557ee4a0d60fbca18f3b4c59b8027035f32:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "new",
"cache_control": "[REDACTED]"
},
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:4913f52405bb614177e7c718d43da695c2f0e7411707c2f77f1c62380153c8d8:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:5f460b74668616b2388b1afed7af6557ee4a0d60fbca18f3b4c59b8027035f32:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "new",
"cache_control": "[REDACTED]"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:ab9056ba140750aa8fe58360172b450fa717e7ea177e4a3c9426fe1291a88da2:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:e734548bbe559d607f045e8fe5b5225543a1093dac991e137d1208a12af536de:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"status": "cached",
"cache_control": "private"
},
{
"key": "version:1.0:subgraph:user:type:Query:hash:0d4d253b049bbea514a54a892902fa4b9b658aedc9b8f2a1308323cdeef3c0ca:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"key": "version:1.0:subgraph:user:type:Query:hash:3e689b15c9cee1f2812c319a66ddbe8bfc452c8ab6759566ed1987cae95178cd:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"status": "cached",
"cache_control": "private"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:ab9056ba140750aa8fe58360172b450fa717e7ea177e4a3c9426fe1291a88da2:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:e734548bbe559d607f045e8fe5b5225543a1093dac991e137d1208a12af536de:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"status": "cached",
"cache_control": "private"
},
{
"key": "version:1.0:subgraph:user:type:Query:hash:0d4d253b049bbea514a54a892902fa4b9b658aedc9b8f2a1308323cdeef3c0ca:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"key": "version:1.0:subgraph:user:type:Query:hash:3e689b15c9cee1f2812c319a66ddbe8bfc452c8ab6759566ed1987cae95178cd:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"status": "cached",
"cache_control": "private"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
---
source: apollo-router/src/plugins/cache/tests.rs
expression: cache_keys
snapshot_kind: text
---
[
{
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:ab9056ba140750aa8fe58360172b450fa717e7ea177e4a3c9426fe1291a88da2:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"key": "version:1.0:subgraph:orga:type:Organization:entity:5811967f540d300d249ab30ae681359a7815fdb5d3dc71a94be1d491006a6b27:hash:e734548bbe559d607f045e8fe5b5225543a1093dac991e137d1208a12af536de:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c",
"status": "new",
"cache_control": "private"
},
{
"key": "version:1.0:subgraph:user:type:Query:hash:0d4d253b049bbea514a54a892902fa4b9b658aedc9b8f2a1308323cdeef3c0ca:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"key": "version:1.0:subgraph:user:type:Query:hash:3e689b15c9cee1f2812c319a66ddbe8bfc452c8ab6759566ed1987cae95178cd:data:d9d84a3c7ffc27b0190a671212f3740e5b8478e84e23825830e97822e25cf05c:03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4",
"status": "new",
"cache_control": "private"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
source: apollo-router/src/plugins/progressive_override/tests.rs
expression: query_plan
snapshot_kind: text
---
{
"data": null,
Expand All @@ -19,7 +20,7 @@ expression: query_plan
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "343157a7d5b7929ebdc0c17cbf0f23c8d3cf0c93a820856d3a189521cc2f24a2",
"schemaAwareHash": "83a61d8e05a2342e4c13c5b518e1e4a5b4cbc405477fce069c784526eb3b1ae5",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
source: apollo-router/src/plugins/progressive_override/tests.rs
expression: query_plan
snapshot_kind: text
---
{
"data": {
Expand All @@ -24,7 +25,7 @@ expression: query_plan
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "df2a0633d70ab97805722bae920647da51b7eb821b06d8a2499683c5c7024316",
"schemaAwareHash": "3c438d69bd20986101e4fb91167d5db4b871b250a5e5b670e19e9305b2756baa",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -63,7 +64,7 @@ expression: query_plan
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "56ac7a7cc11b7f293acbdaf0327cb2b676415eab8343e9259322a1609c90455e",
"schemaAwareHash": "fcec2495ee805f82a5712f74f89797ed678eb5118ff8044a1c8fb232d6dd16df",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
source: apollo-router/src/plugins/expose_query_plan.rs
expression: "serde_json::to_value(response).unwrap()"
snapshot_kind: text
---
{
"data": {
Expand Down Expand Up @@ -69,7 +70,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "45b4beebcbf1df72ab950db7bd278417712b1aa39119317f44ad5b425bdb6997",
"schemaAwareHash": "5c4bde1b693a9d93618856d221a620783601d3e6141991ea1d49763dca5fe94b",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -109,7 +110,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "645f3f8763133d2376e33ab3d1145be7ded0ccc8e94e20aba1fbaa34a51633da",
"schemaAwareHash": "1763ef26b5543dd364a96f6b29f9db6edbbe06ef4b260fd6dd59258cf09134b8",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -156,7 +157,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "a79f69245d777abc4afbd7d0a8fc434137fa4fd1079ef082edf4c7746b5a0fcd",
"schemaAwareHash": "b634e94c76926292e24ea336046389758058cccf227b49917b625adccfc29d07",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -200,7 +201,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "5ad94764f288a41312e07745510bf5dade2b63fb82c3d896f7d00408dbbe5cce",
"schemaAwareHash": "2ff7e653609dee610e4c5e06a666391889af36a0f78ce44a15cf758e4cc897e5",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
---
source: apollo-router/src/plugins/expose_query_plan.rs
expression: "serde_json::to_value(response).unwrap()"
snapshot_kind: text
---
{
"data": {
Expand Down Expand Up @@ -69,7 +70,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "45b4beebcbf1df72ab950db7bd278417712b1aa39119317f44ad5b425bdb6997",
"schemaAwareHash": "5c4bde1b693a9d93618856d221a620783601d3e6141991ea1d49763dca5fe94b",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -109,7 +110,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "645f3f8763133d2376e33ab3d1145be7ded0ccc8e94e20aba1fbaa34a51633da",
"schemaAwareHash": "1763ef26b5543dd364a96f6b29f9db6edbbe06ef4b260fd6dd59258cf09134b8",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -156,7 +157,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "a79f69245d777abc4afbd7d0a8fc434137fa4fd1079ef082edf4c7746b5a0fcd",
"schemaAwareHash": "b634e94c76926292e24ea336046389758058cccf227b49917b625adccfc29d07",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down Expand Up @@ -200,7 +201,7 @@ expression: "serde_json::to_value(response).unwrap()"
"inputRewrites": null,
"outputRewrites": null,
"contextRewrites": null,
"schemaAwareHash": "5ad94764f288a41312e07745510bf5dade2b63fb82c3d896f7d00408dbbe5cce",
"schemaAwareHash": "2ff7e653609dee610e4c5e06a666391889af36a0f78ce44a15cf758e4cc897e5",
"authorization": {
"is_authenticated": false,
"scopes": [],
Expand Down
Loading