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

  1. Check controller task logs and availability; the worker HTTP post failed, often because the controller already exited.
  2. Inspect network/connectivity between middle managers/peons and the controller.
  3. 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)