Skip to content

Commit c1b0e3d

Browse files
committed
apply correctly
1 parent 59202c1 commit c1b0e3d

File tree

2 files changed

+55
-18
lines changed

2 files changed

+55
-18
lines changed

lib/executor/src/executors/map.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -298,26 +298,30 @@ impl SubgraphExecutorMap {
298298
.clone();
299299

300300
let mut client = self.client.clone();
301+
let mut timeout = &self.config.traffic_shaping.all.request_timeout;
302+
let pool_idle_timeout_seconds = self.config.traffic_shaping.all.pool_idle_timeout_seconds;
301303
let mut dedupe_enabled = self.config.traffic_shaping.all.dedupe_enabled;
302-
let mut timeout = self.config.traffic_shaping.all.request_timeout.clone();
303304
if let Some(subgraph_traffic_shaping_config) =
304305
self.config.traffic_shaping.subgraphs.get(subgraph_name)
305306
{
306-
if subgraph_traffic_shaping_config.pool_idle_timeout_seconds
307-
!= self.config.traffic_shaping.all.pool_idle_timeout_seconds
308-
{
309-
client = Arc::new(
310-
Client::builder(TokioExecutor::new())
311-
.pool_timer(TokioTimer::new())
312-
.pool_idle_timeout(Duration::from_secs(
313-
subgraph_traffic_shaping_config.pool_idle_timeout_seconds,
314-
))
315-
.pool_max_idle_per_host(self.max_connections_per_host)
316-
.build(HttpsConnector::new()),
317-
);
318-
}
319-
dedupe_enabled = subgraph_traffic_shaping_config.dedupe_enabled;
320-
timeout = subgraph_traffic_shaping_config.request_timeout.clone();
307+
client = Arc::new(
308+
Client::builder(TokioExecutor::new())
309+
.pool_timer(TokioTimer::new())
310+
.pool_idle_timeout(Duration::from_secs(
311+
subgraph_traffic_shaping_config
312+
.pool_idle_timeout_seconds
313+
.unwrap_or(pool_idle_timeout_seconds),
314+
))
315+
.pool_max_idle_per_host(self.max_connections_per_host)
316+
.build(HttpsConnector::new()),
317+
);
318+
dedupe_enabled = subgraph_traffic_shaping_config
319+
.dedupe_enabled
320+
.unwrap_or(dedupe_enabled);
321+
timeout = subgraph_traffic_shaping_config
322+
.request_timeout
323+
.as_ref()
324+
.unwrap_or(timeout);
321325
}
322326

323327
let executor = HTTPSubgraphExecutor::new(
@@ -327,7 +331,7 @@ impl SubgraphExecutorMap {
327331
semaphore,
328332
dedupe_enabled,
329333
self.in_flight_requests.clone(),
330-
timeout,
334+
timeout.clone(),
331335
);
332336

333337
self.executors_by_subgraph

lib/router-config/src/traffic_shaping.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ pub struct TrafficShapingConfig {
1313
pub all: TrafficShapingExecutorConfig,
1414
/// Optional per-subgraph configurations that will override the default configuration for specific subgraphs.
1515
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
16-
pub subgraphs: HashMap<String, TrafficShapingExecutorConfig>,
16+
pub subgraphs: HashMap<String, TrafficShapingExecutorSubgraphConfig>,
1717
/// Limits the concurrent amount of requests/connections per host/subgraph.
1818
#[serde(default = "default_max_connections_per_host")]
1919
pub max_connections_per_host: usize,
@@ -41,6 +41,39 @@ fn default_dedupe_enabled() -> bool {
4141
true
4242
}
4343

44+
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)]
45+
#[serde(deny_unknown_fields)]
46+
pub struct TrafficShapingExecutorSubgraphConfig {
47+
/// Timeout for idle sockets being kept-alive.
48+
pub pool_idle_timeout_seconds: Option<u64>,
49+
50+
/// Enables/disables request deduplication to subgraphs.
51+
///
52+
/// When requests exactly matches the hashing mechanism (e.g., subgraph name, URL, headers, query, variables), and are executed at the same time, they will
53+
/// be deduplicated by sharing the response of other in-flight requests.
54+
pub dedupe_enabled: Option<bool>,
55+
56+
/// Optional timeout configuration for requests to subgraphs.
57+
///
58+
/// Example with a fixed duration:
59+
/// ```yaml
60+
/// timeout:
61+
/// duration: 5s
62+
/// ```
63+
///
64+
/// Or with a VRL expression that can return a duration based on the operation kind:
65+
/// ```yaml
66+
/// timeout:
67+
/// expression: |
68+
/// if (.request.operation.type == "mutation") {
69+
/// "10s"
70+
/// } else {
71+
/// "15s"
72+
/// }
73+
/// ```
74+
pub request_timeout: Option<DurationOrExpression>,
75+
}
76+
4477
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)]
4578
#[serde(deny_unknown_fields)]
4679
pub struct TrafficShapingExecutorConfig {

0 commit comments

Comments
 (0)