apache/druid · info

numThreads[ ] configured, that is ignored on Router

Error message

numThreads[%d] configured, that is ignored on Router

What it means

Log warning in RouterProcessingModule.getProcessingExecutorPool. The Router does not execute queries itself, so it binds a NoopQueryProcessingPool; any explicit druid.processing.numThreads setting is honored only by query-running nodes and is silently ignored on the Router. The warning tells the operator their setting has no effect here.

Solutions

  1. Remove druid.processing.numThreads from the Router's runtime.properties if it was set intentionally for the Router.
  2. Keep processing tuning in per-node config (historicals, peers) rather than common.runtime.properties.
  3. No action needed if the setting is only present incidentally — the Router uses NoopQueryProcessingPool regardless.
  4. Document in deployment tooling that processing configs do not apply to Router.

Example fix

// before (router runtime.properties)
druid.processing.numThreads=2
// after (removed)
# druid.processing.numThreads not set on Router
Defensive patterns

Strategy: validation

Validate before calling

// Strip processing keys from Router configs
if (role == Role.ROUTER) {
  props.remove("druid.processing.numThreads");
}

Prevention

When it happens

Trigger: Runtime property druid.processing.numThreads (or the config object's numThreads) is set to a non-zero value in the Router's runtime.properties or common config, making isNumThreadsConfigured() true.

Common situations: Copying a shared runtime.properties or common.runtime.properties with processing tuning from historicals to the Router; templated configs applied cluster-wide.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/bf35180a67d828ca. Report an issue: GitHub.

Appendix: source

Thrown at server/src/main/java/org/apache/druid/guice/RouterProcessingModule.java:64

 *
 * @see DruidProcessingModule
 */
public class RouterProcessingModule implements Module
{
  private static final Logger log = new Logger(RouterProcessingModule.class);

  @Override
  public void configure(Binder binder)
  {
    DruidProcessingModule.registerConfigsAndMonitor(binder);
  }

  @Provides
  @ManageLifecycle
  public QueryProcessingPool getProcessingExecutorPool(DruidProcessingConfig config)
  {
    if (config.isNumThreadsConfigured()) {
      log.warn("numThreads[%d] configured, that is ignored on Router", config.getNumThreads());
    }
    return NoopQueryProcessingPool.instance();
  }

  @Provides
  @LazySingleton
  @Global
  public NonBlockingPool<ByteBuffer> getIntermediateResultsPool()
  {
    return DummyNonBlockingPool.instance();
  }

  @Provides
  @LazySingleton
  @Merging
  public BlockingPool<ByteBuffer> getMergeBufferPool(DruidProcessingConfig config)
  {
    if (config.isNumMergeBuffersConfigured()) {

View on GitHub (pinned to 9b90983fd2)