{"record":{"id":"210f112ea22672cc","repo":"apache/druid","slug":"task-runner-does-not-support-enable-disable-worker","errorCode":null,"errorMessage":"Task Runner does not support enable/disable worker actions","messagePattern":"Task Runner does not support enable/disable worker actions","errorType":"exception","errorClass":"RE","httpStatus":null,"severity":"error","filePath":"indexing-service/src/main/java/org/apache/druid/indexing/overlord/WorkerTaskRunnerQueryAdapter.java","lineNumber":70,"sourceCode":"    this.httpClient = httpClient;\n  }\n\n  public void enableWorker(String host)\n  {\n    sendRequestToWorker(host, WorkerTaskRunner.ActionType.ENABLE);\n  }\n\n  public void disableWorker(String host)\n  {\n    sendRequestToWorker(host, WorkerTaskRunner.ActionType.DISABLE);\n  }\n\n  private void sendRequestToWorker(String workerHost, WorkerTaskRunner.ActionType action)\n  {\n    WorkerTaskRunner workerTaskRunner = getWorkerTaskRunner();\n\n    if (workerTaskRunner == null) {\n      throw new RE(\"Task Runner does not support enable/disable worker actions\");\n    }\n\n    Optional<ImmutableWorkerInfo> workerInfo = Iterables.tryFind(\n        workerTaskRunner.getWorkers(),\n        entry -> entry.getWorker()\n                      .getHost()\n                      .equals(workerHost)\n    );\n\n    if (!workerInfo.isPresent()) {\n      throw new RE(\n          \"Worker on host %s does not exists\",\n          workerHost\n      );\n    }\n\n    String actionName = WorkerTaskRunner.ActionType.ENABLE.equals(action) ? \"enable\" : \"disable\";\n    final URL workerUrl = TaskRunnerUtils.makeWorkerURL(","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/indexing-service/src/main/java/org/apache/druid/indexing/overlord/WorkerTaskRunnerQueryAdapter.java#L52-L88","documentation":"The Overlord's enable/disable worker HTTP endpoints require the underlying TaskRunner to be a WorkerTaskRunner (e.g. remote workers). If the resolved runner does not implement WorkerTaskRunner (getWorkerTaskRunner() returns null), the adapter throws RequestException because enable/disable actions are not supported by that runner.","triggerScenarios":"POSTing to /druid/indexer/v1/worker (enable/disable) when the cluster runs a local or otherwise non-worker TaskRunner, or when delegation wrappers hide the WorkerTaskRunner interface.","commonSituations":"Running middle management in local mode and calling worker management APIs meant for remote-HA setups; calling the endpoint on an Overlord configured without worker nodes.","solutions":["Deploy/run with a TaskRunner that supports workers (e.g. RemoteTaskRunner / HttpRemoteTaskRunner).","Do not call enable/disable worker endpoints when using a local or unsupported runner.","If using a delegating runner, ensure getWorkerTaskRunner() can unwrap to the WorkerTaskRunner."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  workerResource.enableWorker(host);\n} catch (RequestException e) {\n  if (e.getMessage().contains(\"does not support enable/disable\")) {\n    // runner is not a WorkerTaskRunner; skip worker management\n  }\n}","preventionTips":["Check the deployed TaskRunner type before using worker management APIs.","Only call worker enable/disable endpoints in remote-worker deployments.","Ensure runner delegates remain unwrappable so WorkerTaskRunner is discoverable."],"tags":["druid","overlord","task-runner","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}