This is an automated email from the ASF dual-hosted git repository.

cryptoe pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new 697dfcce885 minor: `unannouncePropagationDelay` should be ignored for 
tasks which don't support querying (#20444)
697dfcce885 is described below

commit 697dfcce8855d03bb9dc0359ffe40c1d7b262c7f
Author: Karan Kumar <[email protected]>
AuthorDate: Wed Sep 30 01:21:58 2026 +0530

    minor: `unannouncePropagationDelay` should be ignored for tasks which don't 
support querying (#20444)
    
    * `unannouncePropagationDelay` should be ignored for tasks which don't 
support querying.
---
 .../druid/server/initialization/ServerConfig.java  |  41 +++++++-
 .../jetty/CliIndexerServerModule.java              |   3 +-
 .../initialization/jetty/JettyServerModule.java    |   2 +-
 .../druid/initialization/ServerConfigTest.java     |   3 +-
 .../main/java/org/apache/druid/cli/CliPeon.java    |   2 +
 .../org/apache/druid/guice/PeonServerModule.java   | 106 +++++++++++++++++++++
 .../apache/druid/guice/PeonServerModuleTest.java   |  83 ++++++++++++++++
 7 files changed, 235 insertions(+), 5 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/server/initialization/ServerConfig.java 
b/server/src/main/java/org/apache/druid/server/initialization/ServerConfig.java
index 093eae2d36f..816cd7fc4ff 100644
--- 
a/server/src/main/java/org/apache/druid/server/initialization/ServerConfig.java
+++ 
b/server/src/main/java/org/apache/druid/server/initialization/ServerConfig.java
@@ -113,7 +113,8 @@ public class ServerConfig
         enableHSTS,
         false,
         uriCompliance,
-        enforceStrictSNIHostChecking
+        enforceStrictSNIHostChecking,
+        true
     );
   }
 
@@ -141,7 +142,8 @@ public class ServerConfig
       boolean enableHSTS,
       boolean enableResponseIdentityHeaders,
       @Nullable UriCompliance uriCompliance,
-      boolean enforceStrictSNIHostChecking
+      boolean enforceStrictSNIHostChecking,
+      boolean enableQueryRequestsQueuing
   )
   {
     this.numThreads = numThreads;
@@ -168,6 +170,7 @@ public class ServerConfig
     this.enableResponseIdentityHeaders = enableResponseIdentityHeaders;
     this.uriCompliance = uriCompliance != null ? uriCompliance : 
UriCompliance.LEGACY;
     this.enforceStrictSNIHostChecking = enforceStrictSNIHostChecking;
+    this.enableQueryRequestsQueuing = enableQueryRequestsQueuing;
   }
 
   public ServerConfig()
@@ -348,6 +351,40 @@ public class ServerConfig
     return unannouncePropagationDelay;
   }
 
+  /**
+   * Returns a copy of this config with {@link 
#getUnannouncePropagationDelay()} replaced by the given value.
+   */
+  public ServerConfig withUnannouncePropagationDelay(final Period 
newUnannouncePropagationDelay)
+  {
+    return new ServerConfig(
+        numThreads,
+        queueSize,
+        enableRequestLimit,
+        maxIdleTime,
+        defaultQueryTimeout,
+        maxScatterGatherBytes.getBytes(),
+        maxSubqueryRows,
+        maxSubqueryBytes,
+        useNestedForUnknownTypeInSubquery,
+        maxQueryTimeout,
+        maxRequestHeaderSize,
+        gracefulShutdownTimeout,
+        newUnannouncePropagationDelay,
+        inflateBufferSize,
+        compressionLevel,
+        enableForwardedRequestCustomizer,
+        allowedHttpMethods,
+        showDetailedJettyErrors,
+        errorResponseTransformStrategy,
+        contentSecurityPolicy,
+        enableHSTS,
+        enableResponseIdentityHeaders,
+        uriCompliance,
+        enforceStrictSNIHostChecking,
+        enableQueryRequestsQueuing
+    );
+  }
+
   public int getInflateBufferSize()
   {
     return inflateBufferSize;
diff --git 
a/server/src/main/java/org/apache/druid/server/initialization/jetty/CliIndexerServerModule.java
 
b/server/src/main/java/org/apache/druid/server/initialization/jetty/CliIndexerServerModule.java
index 9a7edd490ec..d06df424cd4 100644
--- 
a/server/src/main/java/org/apache/druid/server/initialization/jetty/CliIndexerServerModule.java
+++ 
b/server/src/main/java/org/apache/druid/server/initialization/jetty/CliIndexerServerModule.java
@@ -163,7 +163,8 @@ public class CliIndexerServerModule implements Module
         oldConfig.isEnableHSTS(),
         oldConfig.isEnableResponseIdentityHeaders(),
         oldConfig.getUriCompliance(),
-        oldConfig.isEnforceStrictSNIHostChecking()
+        oldConfig.isEnforceStrictSNIHostChecking(),
+        oldConfig.isEnableQueryRequestsQueuing()
     );
   }
 }
diff --git 
a/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyServerModule.java
 
b/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyServerModule.java
index f534a41f604..bb02598bb15 100644
--- 
a/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyServerModule.java
+++ 
b/server/src/main/java/org/apache/druid/server/initialization/jetty/JettyServerModule.java
@@ -177,7 +177,7 @@ public class JettyServerModule extends JerseyServletModule
     return provider;
   }
 
-  static Server makeAndInitializeServer(
+  public static Server makeAndInitializeServer(
       Injector injector,
       Lifecycle lifecycle,
       DruidNode node,
diff --git 
a/server/src/test/java/org/apache/druid/initialization/ServerConfigTest.java 
b/server/src/test/java/org/apache/druid/initialization/ServerConfigTest.java
index 463833b6f5e..5a6911f5368 100644
--- a/server/src/test/java/org/apache/druid/initialization/ServerConfigTest.java
+++ b/server/src/test/java/org/apache/druid/initialization/ServerConfigTest.java
@@ -72,7 +72,8 @@ public class ServerConfigTest
         true,
         true,
         UriCompliance.RFC3986,
-        false
+        false,
+        true
     );
     String modifiedConfigJson = 
OBJECT_MAPPER.writeValueAsString(modifiedConfig);
     ServerConfig modifiedConfig2 = OBJECT_MAPPER.readValue(modifiedConfigJson, 
ServerConfig.class);
diff --git a/services/src/main/java/org/apache/druid/cli/CliPeon.java 
b/services/src/main/java/org/apache/druid/cli/CliPeon.java
index 6afc51fae19..84effc35a6f 100644
--- a/services/src/main/java/org/apache/druid/cli/CliPeon.java
+++ b/services/src/main/java/org/apache/druid/cli/CliPeon.java
@@ -57,6 +57,7 @@ import org.apache.druid.guice.LifecycleModule;
 import org.apache.druid.guice.ManageLifecycle;
 import org.apache.druid.guice.ManageLifecycleServer;
 import org.apache.druid.guice.PeonProcessingModule;
+import org.apache.druid.guice.PeonServerModule;
 import org.apache.druid.guice.PolyBind;
 import org.apache.druid.guice.QueryRunnerFactoryModule;
 import org.apache.druid.guice.QueryableModule;
@@ -342,6 +343,7 @@ public class CliPeon extends GuiceRunnable
           }
         },
         new QueryablePeonModule(),
+        new PeonServerModule(),
         new IndexingServiceInputSourceModule(),
         new IndexingServiceTuningConfigModule(),
         new InputSourceModule(),
diff --git 
a/services/src/main/java/org/apache/druid/guice/PeonServerModule.java 
b/services/src/main/java/org/apache/druid/guice/PeonServerModule.java
new file mode 100644
index 00000000000..3cd0a61a098
--- /dev/null
+++ b/services/src/main/java/org/apache/druid/guice/PeonServerModule.java
@@ -0,0 +1,106 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.guice;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.inject.Binder;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.Module;
+import com.google.inject.Provides;
+import org.apache.druid.guice.annotations.Self;
+import org.apache.druid.indexing.common.task.Task;
+import org.apache.druid.java.util.common.lifecycle.Lifecycle;
+import org.apache.druid.java.util.common.logger.Logger;
+import org.apache.druid.query.Druids;
+import org.apache.druid.query.TableDataSource;
+import org.apache.druid.query.datasourcemetadata.DataSourceMetadataQuery;
+import org.apache.druid.server.DruidNode;
+import org.apache.druid.server.initialization.ServerConfig;
+import org.apache.druid.server.initialization.TLSServerConfig;
+import org.apache.druid.server.initialization.jetty.JettyServerModule;
+import org.apache.druid.server.security.TLSCertificateChecker;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.joda.time.Period;
+
+public class PeonServerModule implements Module
+{
+  private static final Logger log = new Logger(PeonServerModule.class);
+
+  /**
+   * Used for the probe query in {@link #isQueryable} when the task has no 
datasource, since {@link TableDataSource}
+   * requires one.
+   */
+  private static final String PLACEHOLDER_DATASOURCE = "__fake";
+
+  @Override
+  public void configure(Binder binder)
+  {
+  }
+
+  @Provides
+  @LazySingleton
+  public Server getServer(
+      final Injector injector,
+      final Lifecycle lifecycle,
+      @Self final DruidNode node,
+      final ServerConfig config,
+      final TLSServerConfig tlsServerConfig,
+      final Task task
+  )
+  {
+    return JettyServerModule.makeAndInitializeServer(
+        injector,
+        lifecycle,
+        node,
+        adjustServerConfig(config, task),
+        tlsServerConfig,
+        injector.getExistingBinding(Key.get(SslContextFactory.Server.class)),
+        injector.getInstance(TLSCertificateChecker.class)
+    );
+  }
+
+  @VisibleForTesting
+  static ServerConfig adjustServerConfig(final ServerConfig config, final Task 
task)
+  {
+    if (Period.ZERO.equals(config.getUnannouncePropagationDelay()) || 
isQueryable(task)) {
+      return config;
+    }
+
+    log.info(
+        "Ignoring unannouncePropagationDelay[%s] since task[%s] of type[%s] 
does not serve queries.",
+        config.getUnannouncePropagationDelay(),
+        task.getId(),
+        task.getType()
+    );
+    return config.withUnannouncePropagationDelay(Period.ZERO);
+  }
+
+  /**
+   * Whether the task answers queries over its datasource. {@link 
Task#getQueryRunner} returns null for tasks that
+   * do not, so probe it with a lightweight {@link DataSourceMetadataQuery} on 
the task's datasource.
+   */
+  private static boolean isQueryable(final Task task)
+  {
+    final String dataSource = task.getDataSource() == null ? 
PLACEHOLDER_DATASOURCE : task.getDataSource();
+    return 
task.getQueryRunner(Druids.newDataSourceMetadataQueryBuilder().dataSource(dataSource).build())
 != null;
+  }
+}
diff --git 
a/services/src/test/java/org/apache/druid/guice/PeonServerModuleTest.java 
b/services/src/test/java/org/apache/druid/guice/PeonServerModuleTest.java
new file mode 100644
index 00000000000..ed76a201bf2
--- /dev/null
+++ b/services/src/test/java/org/apache/druid/guice/PeonServerModuleTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.guice;
+
+import org.apache.druid.indexing.common.task.NoopTask;
+import org.apache.druid.query.NoopQueryRunner;
+import org.apache.druid.query.Query;
+import org.apache.druid.query.QueryRunner;
+import org.apache.druid.server.initialization.ServerConfig;
+import org.joda.time.Period;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class PeonServerModuleTest
+{
+  private static final Period DELAY = Period.seconds(30);
+
+  @Test
+  public void testNonQueryableTaskIgnoresUnannounceDelay()
+  {
+    final ServerConfig config = new 
ServerConfig().withUnannouncePropagationDelay(DELAY);
+    final ServerConfig adjusted = PeonServerModule.adjustServerConfig(config, 
NoopTask.forDatasource("wiki"));
+
+    Assertions.assertEquals(Period.ZERO, 
adjusted.getUnannouncePropagationDelay());
+    
Assertions.assertEquals(config.withUnannouncePropagationDelay(Period.ZERO), 
adjusted);
+  }
+
+  @Test
+  public void testQueryableTaskKeepsUnannounceDelay()
+  {
+    final ServerConfig config = new 
ServerConfig().withUnannouncePropagationDelay(DELAY);
+    final NoopTask queryableTask = new NoopTask(null, null, "wiki", 0, 0, null)
+    {
+      @Override
+      public <T> QueryRunner<T> getQueryRunner(Query<T> query)
+      {
+        return new NoopQueryRunner<>();
+      }
+    };
+
+    Assertions.assertSame(config, PeonServerModule.adjustServerConfig(config, 
queryableTask));
+  }
+
+  @Test
+  public void testNullDatasourceTaskIgnoresUnannounceDelay()
+  {
+    final ServerConfig config = new 
ServerConfig().withUnannouncePropagationDelay(DELAY);
+    final ServerConfig adjusted = PeonServerModule.adjustServerConfig(config, 
NoopTask.create());
+    Assertions.assertEquals(Period.ZERO, 
adjusted.getUnannouncePropagationDelay());
+  }
+
+  @Test
+  public void testZeroDelayIsUnchanged()
+  {
+    final ServerConfig config = new ServerConfig();
+    Assertions.assertSame(config, PeonServerModule.adjustServerConfig(config, 
NoopTask.forDatasource("wiki")));
+  }
+
+  @Test
+  public void testWithUnannouncePropagationDelayPreservesQueryQueuing()
+  {
+    final ServerConfig config = new 
ServerConfig(false).withUnannouncePropagationDelay(DELAY);
+    Assertions.assertFalse(config.isEnableQueryRequestsQueuing());
+    Assertions.assertEquals(DELAY, config.getUnannouncePropagationDelay());
+  }
+}


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

Reply via email to