jtuglu1 commented on code in PR #19221:
URL: https://github.com/apache/druid/pull/19221#discussion_r3019609150


##########
server/src/main/java/org/apache/druid/server/broker/BrokerDynamicConfig.java:
##########
@@ -52,14 +54,24 @@ public class BrokerDynamicConfig
    */
   private final QueryContext queryContext;
 
+  /**
+   * Per-datasource per-segment timeout configuration. Maps datasource name to 
its
+   * {@link PerSegmentTimeoutConfig}. When a query targets a datasource in 
this map,
+   * the broker injects the configured {@code perSegmentTimeout} into the 
query context
+   * (unless the caller already set it explicitly).
+   */
+  private final Map<String, PerSegmentTimeoutConfig> perSegmentTimeoutConfig;
+
   @JsonCreator
   public BrokerDynamicConfig(
       @JsonProperty("queryBlocklist") @Nullable List<QueryBlocklistRule> 
queryBlocklist,
-      @JsonProperty("queryContext") @Nullable QueryContext queryContext
+      @JsonProperty("queryContext") @Nullable QueryContext queryContext,
+      @JsonProperty("perSegmentTimeoutConfig") @Nullable Map<String, 
PerSegmentTimeoutConfig> perSegmentTimeoutConfig

Review Comment:
   It'd be great if we could enforce this as an immutable map (either with an 
immutable copy or otherwise) as AFAIK this deserde into a mutable LinkedHashMap.



##########
server/src/main/java/org/apache/druid/server/broker/BrokerDynamicConfig.java:
##########
@@ -74,6 +86,13 @@ public QueryContext getQueryContext()
     return queryContext;
   }
 
+  @JsonProperty
+  @JsonInclude(JsonInclude.Include.NON_EMPTY)

Review Comment:
   Have we tested with a null/empty map value? I think this will cause a bug in 
the UI. We want to allow people to "reset" the dynamic config, and this will 
exclude from the (de)serde I believe.



##########
server/src/main/java/org/apache/druid/server/QueryLifecycle.java:
##########
@@ -216,15 +221,49 @@ public void initialize(final Query<?> baseQuery)
       queryId = UUID.randomUUID().toString();
     }
 
-    Map<String, Object> mergedUserAndConfigContext = QueryContexts.override(
-        queryConfigProvider.getContext(),
-        baseQuery.getContext()
-    );
-    mergedUserAndConfigContext.put(BaseQuery.QUERY_ID, queryId);
-    this.baseQuery = 
baseQuery.withOverriddenContext(mergedUserAndConfigContext);
+    // Start with system defaults, apply per-datasource override, then user 
context wins
+    Map<String, Object> contextWithDefaults = new 
HashMap<>(queryConfigProvider.getContext());
+    applyPerDatasourcePerSegmentTimeout(baseQuery, contextWithDefaults, 
queryId);
+    Map<String, Object> finalContext = 
QueryContexts.override(contextWithDefaults, baseQuery.getContext());
+    finalContext.put(BaseQuery.QUERY_ID, queryId);
+
+    this.baseQuery = baseQuery.withOverriddenContext(finalContext);
     this.toolChest = conglomerate.getToolChest(this.baseQuery);
   }
 
+  /**
+   * If a per-datasource per-segment timeout is configured, injects it into 
the context defaults.
+   * User context (applied later via {@link QueryContexts#override}) will 
override this if set explicitly.
+   * In monitorOnly mode, logs the configured timeout but does not inject it.
+   */
+  private void applyPerDatasourcePerSegmentTimeout(
+      final Query<?> query,
+      final Map<String, Object> contextWithDefaults,
+      final String queryId
+  )
+  {
+    if (perSegmentTimeoutConfig.isEmpty()) {
+      return;
+    }
+
+    for (String tableName : query.getDataSource().getTableNames()) {

Review Comment:
   Let's leave a call-out in the docs, etc. saying that we will apply the 
*first* timeout (not the max or min) across things like a join or 
UnionDatasource where `getDataSource().getTableNames()` returns multiple 
values. This might come as unexpected for some users who see non-deterministic 
timeouts (depending on the order of the elements in the Set).



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to