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]