{"record":{"id":"069948078fbb5ecc","repo":"apache/druid","slug":"failed-to-parser-get-lookups-response-from-s-r","errorCode":null,"errorMessage":"Failed to parser GET lookups response from [%s]. response [%s].","messagePattern":"Failed to parser GET lookups response from \\[(.+?)\\]\\. response \\[(.+?)\\]\\.","errorType":"exception","errorClass":"IOException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java","lineNumber":869,"sourceCode":"          lookupCoordinatorManagerConfig.getHostTimeout()\n      ).get()) {\n        if (returnCode.get() == HttpURLConnection.HTTP_OK) {\n          try {\n            final LookupsState<LookupExtractorFactoryMapContainer> response = smileMapper.readValue(\n                result,\n                LOOKUPS_STATE_TYPE_REFERENCE\n            );\n            LOG.debug(\n                \"Get on [%s], Status: [%s] reason: [%s], Response [%s].\",\n                url,\n                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        }","sourceCodeStart":851,"sourceCodeEnd":887,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/server/lookup/cache/LookupCoordinatorManager.java#L851-L887","documentation":"getLookupStateForNode() throws this IOException when a GET of a node's current lookup state returns 2xx but the response body cannot be parsed due to an IOException during body read. The coordinator needs this response to compare actual vs. desired lookup state and decide on updates.","triggerScenarios":"GET to the lookup node's /lookup lookups endpoint succeeds at the status level but the body stream throws IOException mid-read — connection reset, truncated chunked response, or socket timeout while reading.","commonSituations":"Overloaded lookup nodes closing connections during large state responses, proxies timing out long-running GETs, transient network failures between coordinator and historical/lookup nodes.","solutions":["Retry the GET — the management loop will re-sync state on the next pass","Check lookup node logs and GC/health; an overloaded node may be dropping streams","Inspect intermediary proxies for response truncation or timeouts","Increase HTTP read timeouts in the coordinator's HttpClientConfig if responses are large"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  state = coordinator.getLookupStateForNode(host);\n} catch (IOException e) {\n  if (e.getMessage().startsWith(\"Failed to parser GET lookups response\")) {\n    // transient: retry or fall back to last-known state\n  }\n}","preventionTips":["Cache last-known-good lookup state to fall back on transient read failures","Increase HTTP read timeouts for large lookup states","Monitor node load; overloaded nodes truncate streamed responses","Schedule lookup syncs outside peak load windows"],"tags":["http","io"],"backgroundTag":"http-request-failed","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"}