{"record":{"id":"bb897d0f0ed51f18","repo":"apache/druid","slug":"action-s-failed-for-worker-s-with-status-s","errorCode":null,"errorMessage":"Action [%s] failed for worker [%s] with status %s(%s)","messagePattern":"Action \\[(.+?)\\] failed for worker \\[(.+?)\\] with status (.+?)\\((.+?)\\)","errorType":"exception","errorClass":"RE","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/overlord/WorkerTaskRunnerQueryAdapter.java","lineNumber":109,"sourceCode":"        actionName\n    );\n\n    try {\n      final StatusResponseHolder response = httpClient.go(\n          new Request(HttpMethod.POST, workerUrl),\n          StatusResponseHandler.getInstance()\n      ).get();\n\n      log.info(\n          \"Sent %s action request to worker: %s, status: %s, response: %s\",\n          action,\n          workerHost,\n          response.getStatus(),\n          response.getContent()\n      );\n\n      if (!HttpResponseStatus.OK.equals(response.getStatus())) {\n        throw new RE(\n            \"Action [%s] failed for worker [%s] with status %s(%s)\",\n            action,\n            workerHost,\n            response.getStatus().getCode(),\n            response.getStatus().getReasonPhrase()\n        );\n      }\n    }\n    catch (ExecutionException | InterruptedException | TimeoutException e) {\n      Throwables.propagate(e);\n    }\n  }\n\n  private WorkerTaskRunner getWorkerTaskRunner()\n  {\n    Optional<TaskRunner> taskRunnerOpt = taskMaster.getTaskRunner();\n    if (taskRunnerOpt.isPresent() && taskRunnerOpt.get() instanceof WorkerTaskRunner) {\n      return (WorkerTaskRunner) taskRunnerOpt.get();","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/overlord/WorkerTaskRunnerQueryAdapter.java#L91-L127","documentation":"After sending the enable/disable HTTP request to the worker, the adapter checks the response status. Any non-200 response is converted into a RequestException reporting the action, worker host, and HTTP status code/reason, so callers see worker-side failure details.","triggerScenarios":"The worker returns a non-OK status for the disable/enable worker HTTP call — 404 because the worker path is unavailable, 403 due to auth, 5xx from worker-side errors, or a proxy intercepting the call.","commonSituations":"Worker running an incompatible version; TLS/proxy misconfiguration returning error pages; security enabled and the caller lacking worker endpoint permissions; worker node down behind a load balancer.","solutions":["Check the worker's logs for the error matching the returned HTTP status.","Verify worker endpoint URL, ports, and proxy/TLS configuration.","If security is enabled, grant the caller permission to the worker enable/disable endpoints.","Ensure worker and Overlord versions are compatible."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  adapter.enableWorker(host);\n} catch (RequestException e) {\n  if (e.getMessage().contains(\"failed for worker\")) {\n    // inspect status in message; retry transient 5xx, fix auth/config for 4xx\n  }\n}","preventionTips":["Monitor worker health/endpoints before issuing enable/disable actions.","Keep worker and Overlord versions aligned.","Grant security roles for the worker endpoints when auth is enabled.","Check proxy/TLS settings that can turn worker calls into error responses."],"tags":["druid","worker","http","overlord"],"backgroundTag":"http-error-response","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}