{"record":{"id":"8c15ecd55419bb60","repo":"apache/cassandra","slug":"unknown-endpoint-cannot-map-to-accord-node-id","errorCode":null,"errorMessage":"Unknown endpoint: ; cannot map to Accord Node.Id","messagePattern":"Unknown endpoint: ; cannot map to Accord Node\\.Id","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/service/accord/repair/AccordRepair.java","lineNumber":98,"sourceCode":"    private volatile Thread waiting;\n\n    public AccordRepair(SharedContext ctx, ColumnFamilyStore cfs, TimeUUID repairId, String keyspace, Collection<Range<Token>> ranges, SyncRemote syncRemote, List<InetAddressAndPort> endpoints)\n    {\n        this.ctx = ctx;\n        this.cfs = cfs;\n        this.repairId = repairId;\n        this.syncRemote = syncRemote;\n        // TODO (desired): support unsafe configuration where we permit less than a quorum,\n        //  but this is challenging to do safely as repair has no concept of participants from earlier epochs\n        if (syncRemote != All && endpoints != null)\n        {\n            including = new ArrayList<>(endpoints.size());\n            AccordEndpointMapper mapper = AccordService.instance().endpointMapper();\n            for (InetAddressAndPort ep : endpoints)\n            {\n                Node.Id id = mapper.mappedIdOrNull(ep);\n                if (id == null)\n                    throw new IllegalStateException(\"Unknown endpoint: \" + ep + \"; cannot map to Accord Node.Id\");\n                including.add(id);\n            }\n        }\n        else including = null;\n        this.ranges = AccordTopology.toAccordRanges(keyspace, ranges);\n    }\n\n    public Epoch minEpoch()\n    {\n        return minEpoch;\n    }\n\n    public static class AccordRepairResult\n    {\n        public final Ranges repairedRanges;\n        public final long maxHlc;\n\n        public AccordRepairResult(Ranges ranges, long maxHlc)","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/service/accord/repair/AccordRepair.java#L80-L116","documentation":"AccordRepair's constructor maps each repair endpoint (InetAddressAndPort) to an Accord Node.Id via the AccordEndpointMapper. If any endpoint has no mapping (mapper.mappedIdOrNull returns null), it throws IllegalStateException 'Unknown endpoint: <ep>; cannot map to Accord Node.Id'. The node is not known to Accord's topology (not registered/mapped), so the repair cannot include it.","triggerScenarios":"Starting an Accord repair whose requested endpoints include a host that is down, decommissioned, or never registered with Accord — the endpoint mapper has no InetAddressAndPort -> Node.Id entry.","commonSituations":"Repairing after a node was replaced/decommissioned but the repair request still lists the old address; running repair before the node joined the cluster/Accord service; DNS/IP changes causing endpoint mismatch; clock/timing during bootstrap.","solutions":["Verify all requested endpoints are current, live cluster members (nodetool status) and have joined Accord.","Update the repair request/automation to use the replaced node's current address instead of a decommissioned one.","Ensure AccordService is fully started (topology synced) before initiating repair.","If the mapping is stale, restart or re-sync the Accord service so the endpoint mapper reflects current cluster membership."],"exampleFix":"// before: passing stale endpoint list\nnew AccordRepair(keyspace, ranges, List.of(oldAddress));\n// after: use current live endpoints\nnew AccordRepair(keyspace, ranges, getLiveEndpoints());","handlingStrategy":"validation","validationCode":"AccordEndpointMapper mapper = AccordService.instance().endpointMapper();\nfor (InetAddressAndPort ep : endpoints) if (mapper.mappedIdOrNull(ep) == null) throw new IllegalArgumentException(\"endpoint not mapped in Accord: \" + ep);","typeGuard":null,"tryCatchPattern":"try { new AccordRepair(keyspace, ranges, endpoints); } catch (IllegalStateException e) { LOG.error(\"Repair endpoint unknown to Accord; refresh membership: {}\", e.getMessage()); }","preventionTips":["Resolve current live endpoints via nodetool status instead of cached host lists.","Wait for AccordService to be fully started before repairs.","Purge decommissioned/replaced hosts from repair automation.","Handle IP changes (DHCP/DNS) with stable broadcast addresses."],"tags":["accord","repair","topology","endpoint-mapping"],"backgroundTag":"resource-not-found","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}