{"record":{"id":"34fddfe981a036ce","repo":"apache/druid","slug":"get-request-failed-to-s-d-s-response","errorCode":null,"errorMessage":"GET request failed to [%s] : [%d] : [%s]  Response: [%s]","messagePattern":"GET request failed to \\[(.+?)\\] : \\[(.+?)\\] : \\[(.+?)\\]  Response: \\[(.+?)\\]","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java","lineNumber":880,"sourceCode":"                returnCode.get(),\n                reasonString.get(),\n                response\n            );\n            return response;\n          }\n          catch (IOException ex) {\n            throw new IOE(ex, \"Failed to parser GET lookups response from [%s]. response [%s].\", url, result);\n          }\n        } else {\n          final ByteArrayOutputStream baos = new ByteArrayOutputStream();\n          try {\n            StreamUtils.copyAndClose(result, baos);\n          }\n          catch (IOException ex) {\n            LOG.warn(ex, \"Error reading response from GET on url [%s]\", url);\n          }\n\n          throw new IOE(\n              \"GET request failed to [%s] : [%d] : [%s]  Response: [%s]\",\n              url,\n              returnCode.get(),\n              reasonString.get(),\n              StringUtils.fromUtf8(baos.toByteArray())\n          );\n        }\n      }\n    }\n\n    @VisibleForTesting\n    HttpResponseHandler<InputStream, InputStream> makeResponseHandler(\n        final AtomicInteger returnCode,\n        final AtomicReference<String> reasonString\n    )\n    {\n      return new SequenceInputStreamResponseHandler()\n      {","sourceCodeStart":862,"sourceCodeEnd":898,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java#L862-L898","documentation":"getLookupStateForNode() throws this IOException when the GET request for a node's lookup state returns a non-2xx HTTP status. The message includes the URL, status code, reason phrase, and any readable response body to diagnose why the node refused or failed the GET.","triggerScenarios":"GET of /druid/listen/v1/lookups on a node returning 404 (node lacks the endpoint), 503 (node shutting down), 500 (server error), or auth rejection (401/403 when authentication is enabled).","commonSituations":"Querying nodes that don't host the lookups API (version skew or wrong tier/service), node mid-restart during rolling deploys, authentication misconfiguration between coordinator and nodes.","solutions":["Check the status code and body in the exception: 404 implies wrong endpoint/version, 5xx implies node-side failure","Ensure all nodes in the tier run a Druid version supporting the lookups endpoint","Exclude nodes that are shutting down or fix the node experiencing 5xx errors","If auth is enabled, verify coordinator credentials can access the lookup endpoint"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  state = coordinator.getLookupStateForNode(host);\n} catch (IOException e) {\n  if (e.getMessage().startsWith(\"GET request failed\")) {\n    int code = parseStatusCode(e.getMessage());\n    if (code == 404) { /* node too old / wrong endpoint */ }\n    else if (code >= 500) { /* node-side failure: retry later */ }\n  }\n}","preventionTips":["Confirm all tier nodes support the /druid/listen/v1/lookups endpoint","Use node health checks before issuing GET lookups state requests","Verify authentication config when Druid auth is enabled","Handle 404 vs 5xx distinctly — one is a version issue, the other transient"],"tags":["http","api"],"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-17T15:17:12.973Z"}