Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5fd299b

Browse files
committed
graphql: Move recording query work into the resolver
1 parent 97a3c3a commit 5fd299b

File tree

9 files changed

+49
-21
lines changed

9 files changed

+49
-21
lines changed

graphql/src/execution/resolver.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
use std::time::Duration;
2+
13
use graph::components::store::UnitStream;
2-
use graph::data::query::Trace;
4+
use graph::data::query::{CacheStatus, Trace};
35
use graph::prelude::{async_trait, s, tokio, Error, QueryExecutionError};
46
use graph::schema::ApiSchema;
57
use graph::{
@@ -9,6 +11,8 @@ use graph::{
911

1012
use crate::execution::{ast as a, ExecutionContext};
1113

14+
use super::Query;
15+
1216
/// A GraphQL resolver that can resolve entities, enum values, scalar types and interfaces/unions.
1317
#[async_trait]
1418
pub trait Resolver: Sized + Send + Sync + 'static {
@@ -122,4 +126,8 @@ pub trait Resolver: Sized + Send + Sync + 'static {
122126
fn post_process(&self, _result: &mut QueryResult) -> Result<(), Error> {
123127
Ok(())
124128
}
129+
130+
fn record_work(&self, _query: &Query, _elapsed: Duration, _cache_status: CacheStatus) {
131+
// by default, record nothing
132+
}
125133
}

graphql/src/query/mod.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ use graph::prelude::{BlockPtr, CheapClone, QueryExecutionError, QueryResult};
22
use std::sync::Arc;
33
use std::time::Instant;
44

5-
use graph::data::graphql::effort::LoadManager;
6-
75
use crate::execution::{ast as a, *};
86

97
/// Utilities for working with GraphQL query ASTs.
@@ -26,8 +24,6 @@ pub struct QueryExecutionOptions<R> {
2624
/// Maximum value for the `skip` argument
2725
pub max_skip: u32,
2826

29-
pub load_manager: Arc<LoadManager>,
30-
3127
/// Whether to include an execution trace in the result
3228
pub trace: bool,
3329
}
@@ -76,9 +72,8 @@ where
7672
.await;
7773
let elapsed = start.elapsed();
7874
let cache_status = ctx.cache_status.load();
79-
options
80-
.load_manager
81-
.record_work(query.shape_hash, elapsed, cache_status);
75+
ctx.resolver
76+
.record_work(query.as_ref(), elapsed, cache_status);
8277
query.log_cache_status(
8378
&selection_set,
8479
block_ptr.map(|b| b.number).unwrap_or(0),

graphql/src/runner.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ where
156156
error_policy,
157157
query.schema.id().clone(),
158158
metrics.cheap_clone(),
159+
self.load_manager.cheap_clone(),
159160
)
160161
.await?;
161162
max_block = max_block.max(resolver.block_number());
@@ -168,7 +169,6 @@ where
168169
deadline: ENV_VARS.graphql.query_timeout.map(|t| Instant::now() + t),
169170
max_first: max_first.unwrap_or(ENV_VARS.graphql.max_first),
170171
max_skip: max_skip.unwrap_or(ENV_VARS.graphql.max_skip),
171-
load_manager: self.load_manager.clone(),
172172
trace,
173173
},
174174
)
@@ -268,6 +268,7 @@ where
268268
max_first: ENV_VARS.graphql.max_first,
269269
max_skip: ENV_VARS.graphql.max_skip,
270270
graphql_metrics: self.graphql_metrics.clone(),
271+
load_manager: self.load_manager.cheap_clone(),
271272
},
272273
)
273274
}

graphql/src/store/resolver.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@ use std::collections::BTreeMap;
22
use std::result;
33
use std::sync::Arc;
44

5-
use graph::components::store::*;
5+
use graph::components::store::{SubscriptionManager, UnitStream};
6+
use graph::data::graphql::effort::LoadManager;
67
use graph::data::graphql::{object, ObjectOrInterface};
7-
use graph::data::query::Trace;
8+
use graph::data::query::{CacheStatus, Trace};
89
use graph::data::value::{Object, Word};
910
use graph::prelude::*;
1011
use graph::schema::{ast as sast, ApiSchema, META_FIELD_TYPE};
1112
use graph::schema::{ErrorPolicy, BLOCK_FIELD_TYPE};
1213

13-
use crate::execution::ast as a;
14+
use crate::execution::{ast as a, Query};
1415
use crate::metrics::GraphQLMetrics;
15-
use crate::prelude::*;
16+
use crate::prelude::{ExecutionContext, Resolver};
1617
use crate::query::ext::BlockConstraint;
1718
use crate::store::query::collect_entities_from_query_field;
1819

@@ -28,6 +29,7 @@ pub struct StoreResolver {
2829
has_non_fatal_errors: bool,
2930
error_policy: ErrorPolicy,
3031
graphql_metrics: Arc<GraphQLMetrics>,
32+
load_manager: Arc<LoadManager>,
3133
}
3234

3335
#[derive(Clone, Debug)]
@@ -64,6 +66,7 @@ impl StoreResolver {
6466
store: Arc<dyn QueryStore>,
6567
subscription_manager: Arc<dyn SubscriptionManager>,
6668
graphql_metrics: Arc<GraphQLMetrics>,
69+
load_manager: Arc<LoadManager>,
6770
) -> Self {
6871
StoreResolver {
6972
logger: logger.new(o!("component" => "StoreResolver")),
@@ -76,6 +79,7 @@ impl StoreResolver {
7679
has_non_fatal_errors: false,
7780
error_policy: ErrorPolicy::Deny,
7881
graphql_metrics,
82+
load_manager,
7983
}
8084
}
8185

@@ -93,6 +97,7 @@ impl StoreResolver {
9397
error_policy: ErrorPolicy,
9498
deployment: DeploymentHash,
9599
graphql_metrics: Arc<GraphQLMetrics>,
100+
load_manager: Arc<LoadManager>,
96101
) -> Result<Self, QueryExecutionError> {
97102
let store_clone = store.cheap_clone();
98103
let block_ptr = Self::locate_block(store_clone.as_ref(), bc, state).await?;
@@ -110,6 +115,7 @@ impl StoreResolver {
110115
has_non_fatal_errors,
111116
error_policy,
112117
graphql_metrics,
118+
load_manager,
113119
};
114120
Ok(resolver)
115121
}
@@ -385,4 +391,9 @@ impl Resolver for StoreResolver {
385391
}
386392
Ok(())
387393
}
394+
395+
fn record_work(&self, query: &Query, elapsed: Duration, cache_status: CacheStatus) {
396+
self.load_manager
397+
.record_work(query.shape_hash, elapsed, cache_status);
398+
}
388399
}

graphql/src/subscription/mod.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::result::Result;
22
use std::time::{Duration, Instant};
33

44
use graph::components::store::UnitStream;
5+
use graph::data::graphql::effort::LoadManager;
56
use graph::schema::ApiSchema;
67
use graph::{components::store::SubscriptionManager, prelude::*, schema::ErrorPolicy};
78

@@ -38,6 +39,8 @@ pub struct SubscriptionExecutionOptions {
3839
pub max_skip: u32,
3940

4041
pub graphql_metrics: Arc<GraphQLMetrics>,
42+
43+
pub load_manager: Arc<LoadManager>,
4144
}
4245

4346
pub fn execute_subscription(
@@ -88,6 +91,7 @@ fn create_source_event_stream(
8891
options.store.clone(),
8992
options.subscription_manager.cheap_clone(),
9093
options.graphql_metrics.cheap_clone(),
94+
options.load_manager.cheap_clone(),
9195
);
9296
let ctx = ExecutionContext {
9397
logger: options.logger.cheap_clone(),
@@ -155,6 +159,7 @@ fn map_source_to_response_stream(
155159
max_first,
156160
max_skip,
157161
graphql_metrics,
162+
load_manager,
158163
} = options;
159164

160165
trigger_stream
@@ -169,6 +174,7 @@ fn map_source_to_response_stream(
169174
max_first,
170175
max_skip,
171176
graphql_metrics.cheap_clone(),
177+
load_manager.cheap_clone(),
172178
)
173179
.boxed()
174180
})
@@ -184,13 +190,15 @@ async fn execute_subscription_event(
184190
max_first: u32,
185191
max_skip: u32,
186192
metrics: Arc<GraphQLMetrics>,
193+
load_manager: Arc<LoadManager>,
187194
) -> Arc<QueryResult> {
188195
async fn make_resolver(
189196
store: Arc<dyn QueryStore>,
190197
logger: &Logger,
191198
subscription_manager: Arc<dyn SubscriptionManager>,
192199
query: &Arc<crate::execution::Query>,
193200
metrics: Arc<GraphQLMetrics>,
201+
load_manager: Arc<LoadManager>,
194202
) -> Result<StoreResolver, QueryExecutionError> {
195203
let state = store.deployment_state().await?;
196204
StoreResolver::at_block(
@@ -202,11 +210,20 @@ async fn execute_subscription_event(
202210
ErrorPolicy::Deny,
203211
query.schema.id().clone(),
204212
metrics,
213+
load_manager,
205214
)
206215
.await
207216
}
208217

209-
let resolver = match make_resolver(store, &logger, subscription_manager, &query, metrics).await
218+
let resolver = match make_resolver(
219+
store,
220+
&logger,
221+
subscription_manager,
222+
&query,
223+
metrics,
224+
load_manager,
225+
)
226+
.await
210227
{
211228
Ok(resolver) => resolver,
212229
Err(e) => return Arc::new(e.into()),

server/index-node/src/service.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,6 @@ where
141141
Err(e) => return Ok(QueryResults::from(QueryResult::from(e))),
142142
};
143143

144-
let load_manager = self.graphql_runner.load_manager();
145-
146144
// Run the query using the index node resolver
147145
let query_clone = query.cheap_clone();
148146
let logger = self.logger.cheap_clone();
@@ -159,7 +157,6 @@ where
159157
deadline: None,
160158
max_first: std::u32::MAX,
161159
max_skip: std::u32::MAX,
162-
load_manager,
163160
trace: false,
164161
};
165162
let result = execute_query(query_clone.cheap_clone(), None, None, options).await;

store/test-store/src/store.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,8 @@ async fn execute_subgraph_query_internal(
536536
bc,
537537
error_policy,
538538
query.schema.id().clone(),
539-
graphql_metrics()
539+
graphql_metrics(),
540+
LOAD_MANAGER.clone()
540541
)
541542
.await
542543
);
@@ -548,7 +549,6 @@ async fn execute_subgraph_query_internal(
548549
QueryExecutionOptions {
549550
resolver,
550551
deadline,
551-
load_manager: LOAD_MANAGER.clone(),
552552
max_first: std::u32::MAX,
553553
max_skip: std::u32::MAX,
554554
trace,

store/test-store/tests/graphql/introspection.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ use graph_graphql::prelude::{
1212
a, execute_query, ExecutionContext, Query as PreparedQuery, QueryExecutionOptions, Resolver,
1313
};
1414
use test_store::graphql_metrics;
15-
use test_store::LOAD_MANAGER;
1615

1716
/// Mock resolver used in tests that don't need a resolver.
1817
#[derive(Clone)]
@@ -568,7 +567,6 @@ async fn introspection_query(schema: Schema, query: &str) -> QueryResult {
568567
deadline: None,
569568
max_first: std::u32::MAX,
570569
max_skip: std::u32::MAX,
571-
load_manager: LOAD_MANAGER.clone(),
572570
trace: false,
573571
};
574572

store/test-store/tests/graphql/query.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ async fn run_subscription(
625625
max_first: std::u32::MAX,
626626
max_skip: std::u32::MAX,
627627
graphql_metrics: graphql_metrics(),
628+
load_manager: LOAD_MANAGER.clone(),
628629
};
629630
let schema = STORE
630631
.subgraph_store()

0 commit comments

Comments
 (0)