{"record":{"id":"4e7d80147b0278d0","repo":"pinpoint-apm/pinpoint","slug":"duplicated-cluster-key-detected-key-num","errorCode":null,"errorMessage":"Duplicated cluster key detected: key = {}, num = {}","messagePattern":"Duplicated cluster key detected: key = (.+?), num = (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"realtime/realtime-collector/src/main/java/com/navercorp/pinpoint/realtime/collector/receiver/grpc/GrpcAgentConnectionRepository.java","lineNumber":60,"sourceCode":"\n    public void remove(GrpcAgentConnection conn) {\n        this.connMap.remove(conn.getClusterKey(), conn);\n    }\n\n    Collection<GrpcAgentConnection> getConnections() {\n        return new ArrayList<>(this.connMap.values());\n    }\n\n    public GrpcAgentConnection getConnection(ClusterKey key) {\n        Collection<GrpcAgentConnection> candidates = this.connMap.get(key);\n\n        final int size = candidates.size();\n        if (size == 0) {\n            return null;\n        }\n        if (size > 1) {\n            if (logger.isWarnEnabled()) {\n                logger.warn(\"Duplicated cluster key detected: key = {}, num = {}\", key, size);\n            }\n        }\n\n        synchronized (this.connMap) {\n            final Iterator<GrpcAgentConnection> iterator = candidates.iterator();\n            if (iterator.hasNext()) {\n                return iterator.next();\n            } else {\n                return null;\n            }\n        }\n    }\n\n    @Override\n    public Collection<ClusterPoint> getClusterPointList() {\n        Collection<GrpcAgentConnection> values = this.connMap.values();\n        return new ArrayList<>(values);\n    }","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/realtime/realtime-collector/src/main/java/com/navercorp/pinpoint/realtime/collector/receiver/grpc/GrpcAgentConnectionRepository.java#L42-L78","documentation":"Warn log in GrpcAgentConnectionRepository.getConnection: multiple live connections share the same ClusterKey (agentId + startTimestamp + socket), meaning a duplicate agent connection was registered; the code still proceeds but picks among ambiguous candidates.","triggerScenarios":"Thrown at realtime/realtime-collector/src/main/java/com/navercorp/pinpoint/realtime/collector/receiver/grpc/GrpcAgentConnectionRepository.java:60 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Investigate why the agent opened parallel collector connections (e.g. collector restart, half-open sockets)","Ensure stale connections are evicted on disconnect or lease expiry","Prefer the newest connection deterministically when duplicates remain"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"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"}