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
- Align the selector's configured priorities with the priorities actually announced by servers in the tier (check broker runtime.properties vs historical server priorities).
- Bring up or restore historicals whose priorities match the configured set.
- If the fallback behavior is acceptable, treat as warning noise and remove unneeded priorities from config.
- 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
- Keep broker priority config in sync with historical priorities
- Alert on tierSelector/noServer metric
- Prefer pooled strategy for heterogeneous tiers
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
- No servers found for query
- At most one of 'druid.broker.segment.watchedTiers' and…
- Failed to initialize
- If configured, 'druid.broker.segment.ignoredTiers' must be…
- If configured, 'druid.broker.segment.watchedTiers' must be…
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)