Skip to content

Commit 0a61e05

Browse files
committed
apply correctly
1 parent 3f862e2 commit 0a61e05

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
@@ -295,26 +295,30 @@ impl SubgraphExecutorMap {
295295
.clone();
296296

297297
let mut client = self.client.clone();
298+
let mut timeout = &self.config.traffic_shaping.all.request_timeout;
299+
let pool_idle_timeout_seconds = self.config.traffic_shaping.all.pool_idle_timeout_seconds;
298300
let mut dedupe_enabled = self.config.traffic_shaping.all.dedupe_enabled;
299-
let mut timeout = self.config.traffic_shaping.all.request_timeout.clone();
300301
if let Some(subgraph_traffic_shaping_config) =
301302
self.config.traffic_shaping.subgraphs.get(subgraph_name)
302303
{
303-
if subgraph_traffic_shaping_config.pool_idle_timeout_seconds
304-
!= self.config.traffic_shaping.all.pool_idle_timeout_seconds
305-
{
306-
client = Arc::new(
307-
Client::builder(TokioExecutor::new())
308-
.pool_timer(TokioTimer::new())
309-
.pool_idle_timeout(Duration::from_secs(
310-
subgraph_traffic_shaping_config.pool_idle_timeout_seconds,
311-
))
312-
.pool_max_idle_per_host(self.max_connections_per_host)
313-
.build(HttpsConnector::new()),
314-
);
315-
}
316-
dedupe_enabled = subgraph_traffic_shaping_config.dedupe_enabled;
317-
timeout = subgraph_traffic_shaping_config.request_timeout.clone();
304+
client = Arc::new(
305+
Client::builder(TokioExecutor::new())
306+
.pool_timer(TokioTimer::new())
307+
.pool_idle_timeout(Duration::from_secs(
308+
subgraph_traffic_shaping_config
309+
.pool_idle_timeout_seconds
310+
.unwrap_or(pool_idle_timeout_seconds),
311+
))
312+
.pool_max_idle_per_host(self.max_connections_per_host)
313+
.build(HttpsConnector::new()),
314+
);
315+
dedupe_enabled = subgraph_traffic_shaping_config
316+
.dedupe_enabled
317+
.unwrap_or(dedupe_enabled);
318+
timeout = subgraph_traffic_shaping_config
319+
.request_timeout
320+
.as_ref()
321+
.unwrap_or(timeout);
318322
}
319323

320324
let executor = HTTPSubgraphExecutor::new(
@@ -324,7 +328,7 @@ impl SubgraphExecutorMap {
324328
semaphore,
325329
dedupe_enabled,
326330
self.in_flight_requests.clone(),
327-
timeout,
331+
timeout.clone(),
328332
);
329333

330334
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)