apache/druid · error · QueryException/ResponseException (RE)
Failed to post the worker error
Error message
Failed to post the worker error [%s] to the controller
What it means
In MSQWarningReportLimiterPublisher.publishException, when a warning's error code is in criticalWarningCodes (warnings disallowed altogether), the publisher escalates it and posts it to the controller via postWorkerError. This message is the failure of that POST itself — the worker could not deliver the (now-critical) error to the controller, typically due to HTTP/network failure or the controller task being gone.
Solutions
- Check controller task logs and availability; the worker HTTP post failed, often because the controller already exited.
- Inspect network/connectivity between middle managers/peons and the controller.
- If the controller is gone, the query is already failing elsewhere; examine the original controller-side error.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at multi-stage-query/src/main/java/org/apache/druid/msq/indexing/error/MSQWarningReportLimiterPublisher.java:103 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/a0f98cb54084e77a.
Report an issue: GitHub.
Appendix: source
Thrown at multi-stage-query/src/main/java/org/apache/druid/msq/indexing/error/MSQWarningReportLimiterPublisher.java:103
this.workerId = workerId;
this.host = host;
}
@Override
public void publishException(int stageNumber, Throwable e)
{
String errorCode = MSQErrorReport.getFaultFromException(e).getErrorCode();
synchronized (lock) {
totalCount = totalCount + 1;
errorCodeToCurrentCount.compute(errorCode, (ignored, count) -> count == null ? 1L : count + 1);
// Send the warning as an error if it is disallowed altogether
if (criticalWarningCodes.contains(errorCode)) {
try {
controllerClient.postWorkerError(MSQErrorReport.fromException(workerId, host, stageNumber, e));
}
catch (IOException postException) {
throw new RE(postException, "Failed to post the worker error [%s] to the controller", errorCode);
}
}
if (totalLimit != -1 && totalCount > totalLimit) {
return;
}
}
long limitForFault = errorCodeToLimit.getOrDefault(errorCode, -1L);
synchronized (lock) {
if (limitForFault != -1 && errorCodeToCurrentCount.getOrDefault(errorCode, 0L) > limitForFault) {
return;
}
}
delegate.publishException(stageNumber, e);
}
}
View on GitHub (pinned to 9b90983fd2)