apache/druid · error · IllegalStateException
Was asked for a query runner but realtimeAppenderator was…
Error message
Was asked for a query runner but realtimeAppenderator was null!
What it means
getQueryRunnerForIntervals can only serve queries through the single realtime appenderator of the peon. If it is null (no realtime appenderator was created, e.g. in a batch task), the manager throws this ISE because it cannot answer queries from in-flight data.
Solutions
- Only query datasources being served by a realtime (streaming) task
- Ensure createRealtimeAppenderatorForTask is invoked before any query arrives at the peon
- Wait for batch task segments to be published and query historical/middle-manager-published data instead
Example fix
// before
QueryRunner<T> runner = peonManager.getQueryRunnerForIntervals(query, intervals); // throws if batch
// after
if (taskTypeSupportsRealtimeQuery(task)) {
QueryRunner<T> runner = peonManager.getQueryRunnerForIntervals(query, intervals);
} Defensive patterns
Strategy: validation
Validate before calling
if (!isRealtimeTask(task)) { return null; /* skip peon query */ } Type guard
if (manager.hasRealtimeAppenderator()) { runner = manager.getQueryRunnerForIntervals(q, intervals); } Try / catch
try { return manager.getQueryRunnerForIntervals(query, intervals); } catch (ISE e) { log.warn("no realtime appenderator; no in-flight data"); return null; } Prevention
- Only route queries to streaming tasks' peons
- Create the realtime appenderator before advertising the task as queryable
- Query batch data only after segments are published
When it happens
Trigger: Issuing a query against a peon that has only a batch appenderator, or before createRealtimeAppenderatorForTask has run; query routing (QueryLifecycle / broker) hitting this QueryableDataSource during batch ingestion.
Common situations: Querying in-flight data of a batch task; querying a datasource whose only peon has shut down its appenderator; misdirected broker query routing to a batch task's peon.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- A batch appenderator was already created for this peon's…
- A realtime appenderator was already created for this peon's…
- Cannot handle datasource
- Unknown operation[ ], known operations[ ]
- Unknown query type[ ].
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/76bd228b3b1e9611.
Report an issue: GitHub.
Appendix: source
Thrown at server/src/main/java/org/apache/druid/segment/realtime/appenderator/PeonAppenderatorsManager.java:174
);
return batchAppenderator;
}
}
@Override
public void removeAppenderatorsForTask(String taskId, String dataSource)
{
// the peon only runs one task, and the process will shutdown later, don't need to do anything
}
@Override
public <T> QueryRunner<T> getQueryRunnerForIntervals(
Query<T> query,
Iterable<Interval> intervals
)
{
if (realtimeAppenderator == null) {
throw new ISE("Was asked for a query runner but realtimeAppenderator was null!");
} else {
return realtimeAppenderator.getQueryRunnerForIntervals(query, intervals);
}
}
@Override
public <T> QueryRunner<T> getQueryRunnerForSegments(
Query<T> query,
Iterable<SegmentDescriptor> specs
)
{
if (realtimeAppenderator == null) {
throw new ISE("Was asked for a query runner but realtimeAppenderator was null!");
} else {
return realtimeAppenderator.getQueryRunnerForSegments(query, specs);
}
}
View on GitHub (pinned to 9b90983fd2)