{"record":{"id":"8f80ef8d67ef74c8","repo":"pinpoint-apm/pinpoint","slug":"empty-outhost-for-in-link-set-to-def","errorCode":null,"errorMessage":"    Empty outHost for IN_LINK {} -> {}. Set to default host.","messagePattern":"    Empty outHost for IN_LINK (.+?) -> (.+?)\\. Set to default host\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/v3/InLinkV3Mapper.java","lineNumber":146,"sourceCode":"            if (logger.isTraceEnabled()) {\n                logger.trace(\"    Fetched IN_LINK inLink:{}\", linkDataMap);\n            }\n        }\n\n        return linkDataMap;\n    }\n\n\n    private String fallbackHost(Application self, Application inApplication) {\n        logger.debug(\"    Empty outHost for IN_LINK {} -> {}\", self, inApplication);\n        ServiceType inServiceType = inApplication.getServiceType();\n        if (inServiceType.isQueue()) {\n            return QUEUE_DEFAULT_HOST;\n        }\n        if (inServiceType.isTerminal()) {\n            return TERMINAL_DEFAULT_HOST;\n        }\n        logger.warn(\"    Empty outHost for IN_LINK {} -> {}. Set to default host.\", self, inApplication);\n        return DEFAULT_HOST;\n    }\n\n    private String outHost(String outHost) {\n        if (MERGE_AGENT.equals(outHost)) {\n            return MERGE_AGENT;\n        }\n        return outHost;\n    }\n\n    private SlotCode readSlotCode(Cell cell) {\n        byte[] qualifierArray = cell.getQualifierArray();\n        byte slotCodeByte = qualifierArray[cell.getQualifierOffset()];\n        return SlotCode.valueOf(slotCodeByte);\n    }\n\n    private Application readSelfApplication(UidLinkRowKey self, ServiceType inServiceType) {\n        int serviceUid = self.getLinkServiceUid();","sourceCodeStart":128,"sourceCodeEnd":164,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/web/src/main/java/com/navercorp/pinpoint/web/applicationmap/dao/v3/InLinkV3Mapper.java#L128-L164","documentation":"When mapping an IN_LINK row, InLinkV3Mapper.fallbackHost found an empty outHost on a link whose source service type is neither a queue nor a terminal node. The mapper logs this warning and substitutes DEFAULT_HOST so map rendering can continue instead of failing the row. It indicates incomplete or unexpected link data in storage, not a fatal condition.","triggerScenarios":"mapRow reads an in-link record from the HBase/link dao whose outHost column/field is empty, and fallbackHost's queue and terminal service-type branches do not apply, so the default-host fallback path is taken.","commonSituations":"Legacy or partially migrated link data in HBase missing the outHost field; agent/plugin versions that did not populate outHost for certain service types; data written by an older Pinpoint version being read by a newer mapper schema (v3).","solutions":["Identify the applications in the warning (self -> inApplication) and re-collect or backfill the link data so outHost is populated.","Verify the source application's ServiceType plugin is correctly registered on the server; an unknown/misconfigured type falls through to DEFAULT_HOST.","If the data is stale, delete/expire the affected rows so the map stops rendering with the placeholder host.","If the service type is genuinely a queue or terminal, confirm its ServiceType flags (isQueue/isTerminal) so the correct QUEUE_DEFAULT_HOST/TERMINAL_DEFAULT_HOST branch is used instead."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Before consuming mapped link data, verify outHost is present on in-link rows\nif (inLink == null || inLink.getOutHost() == null || inLink.getOutHost().isEmpty()) {\n    logger.warn(\"in-link {} -> {} has empty outHost; expect default-host fallback\", inLink.getFrom(), inLink.getTo());\n}","typeGuard":"boolean hasHost(String outHost) { return outHost != null && !outHost.isEmpty() && !outHost.equals(DEFAULT_HOST); }","tryCatchPattern":null,"preventionTips":["Keep agent and plugin versions in sync with the server so outHost is always populated","Audit stored link rows for missing outHost after schema/version migrations","Register ServiceType plugins server-side so queue/terminal types resolve to their proper default hosts"],"tags":["data-quality","fallback","hbase","service-map"],"backgroundTag":"empty-required-field","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}