apache/druid · warning

No servers found for query

Error message

No servers found for query[%s] matching configured priorities[%s]. Available priorities[%s].

What it means

PooledTierSelectorStrategy picks a query-serving server from a tier, honoring server priority configuration. When no servers in the tier match any of the configured priorities, it logs this warning, emits a 'tierSelector/noServer' metric, and then falls back to its pooling selection. It indicates a mismatch between broker priority configuration and actual server priorities.

Solutions

  1. Align the selector's configured priorities with the priorities actually announced by servers in the tier (check broker runtime.properties vs historical server priorities).
  2. Bring up or restore historicals whose priorities match the configured set.
  3. If the fallback behavior is acceptable, treat as warning noise and remove unneeded priorities from config.
  4. Check the tierSelector/noServer metric frequency to quantify impact.

Example fix

// before (broker runtime.properties)
druid.server.selector.priorities=0,5
// after (match historicals announcing priority 10)
druid.server.selector.priorities=0,5,10
Defensive patterns

Strategy: fallback

Validate before calling

Set<Integer> available = prioritizedServers.keySet();
if (available.stream().noneMatch(config.getPriorities()::contains)) { log.warn("No priorities match; relying on fallback"); }

Prevention

When it happens

Trigger: pick() is called for a query and prioritizedServers (servers grouped by priority) contains no priority that appears in the selector's configured priorities list — e.g. all available servers have priorities outside the configured set.

Common situations: druid.processing.priority / tier priority config lists priorities no historical actually announces; historicals reconfigured with new priorities while broker config unchanged; all historicals of the needed priority tier are down; system-generated segment metadata queries hitting a tier with no matching priorities.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

Thrown at server/src/main/java/org/apache/druid/client/selector/PooledTierSelectorStrategy.java:112

      if (configuredPriorities.contains(priority)) {
        candidateServerPool.addAll(servers);
      } else {
        log.debug(
            "Server priority[%d] not in the configured list of priorities[%s] so ignore servers[%s] for query[%s]",
            priority, config.getPriorities(), servers, query
        );
      }
    }

    if (candidateServerPool.isEmpty()) {
      if (query == null || query instanceof SegmentMetadataQuery) {
        // Debug logging to reduce logging spam as these are typically system-generated segment metadata queries
        log.debug(
            "No server found for query[%s] from server priorities[%s]. Configured priorities[%s].",
            query, prioritizedServers.keySet(), config.getPriorities()
        );
      } else {
        log.warn(
            "No servers found for query[%s] matching configured priorities[%s]. Available priorities[%s].",
            query, config.getPriorities(), prioritizedServers.keySet()
        );
        emitter.emit(
            ServiceMetricEvent.builder()
                              .setMetric("tierSelector/noServer", 1)
                              .setDimension("dataSource", String.valueOf(query.getDataSource()))
                              .setDimension("tierSelectorType", TYPE)
                              .setDimension("queryType", query.getType())
                              .setDimension("queryPriority", String.valueOf(query.context().getPriority()))
                              .setDimensionIfNotNull("queryId", query.getId())
        );
      }
      return List.of();
    }

    final List<QueryableDruidServer> selectedServers = serverSelectorStrategy.pick(query, candidateServerPool, segment, numServersToPick);
    log.debug("Selected servers[%s] for query[%s] from given servers[%s] and candidateServerPool[%s]", selectedServers, query, prioritizedServers, candidateServerPool);

View on GitHub (pinned to 9b90983fd2)