{"record":{"id":"68c61b1ff142bcbe","repo":"alibaba/nacos","slug":"runtime-endpoint-projection-exceeds-1000-items","errorCode":null,"errorMessage":"Runtime Endpoint projection exceeds 1000 items","messagePattern":"Runtime Endpoint projection exceeds 1000 items","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"ai/src/main/java/com/alibaba/nacos/ai/service/agent/fingerprint/RuntimeEndpointRevision.java","lineNumber":88,"sourceCode":"        List<AgentDiscoveryEndpoint> endpoints) {\n        byte[] revisionBytes = revisionBytes(namespaceId, agentName, protocol, endpoints);\n        long[] hash = MurmurHash3.hash128x64(revisionBytes, 0, revisionBytes.length, MURMUR_SEED);\n        char[] value = new char[32];\n        appendHex(hash[0], value, 0);\n        appendHex(hash[1], value, 16);\n        return TOKEN_PREFIX + new String(value);\n    }\n    \n    static byte[] revisionBytes(String namespaceId, String agentName, String protocol,\n        List<AgentDiscoveryEndpoint> endpoints) {\n        AgentValidationUtils.validateNamespaceId(namespaceId);\n        AgentValidationUtils.validateAgentName(agentName);\n        AgentValidationUtils.validateProtocol(protocol);\n        if (endpoints == null) {\n            throw new IllegalArgumentException(\"Runtime Endpoint projection must not be null\");\n        }\n        if (endpoints.size() > MAX_ENDPOINTS) {\n            throw new IllegalArgumentException(\n                \"Runtime Endpoint projection exceeds \" + MAX_ENDPOINTS + \" items\");\n        }\n        Map<EndpointNaturalKey, AgentDiscoveryEndpoint> canonicalEndpoints =\n            new TreeMap<EndpointNaturalKey, AgentDiscoveryEndpoint>();\n        for (AgentDiscoveryEndpoint endpoint : endpoints) {\n            Endpoint canonicalEndpoint = EndpointCanonicalizer.canonicalize(endpoint);\n            AgentDiscoveryEndpoint canonical = copyEndpoint(canonicalEndpoint);\n            if (canonical.getHealthy() == null) {\n                throw new IllegalArgumentException(\"Runtime Endpoint healthy must not be null\");\n            }\n            canonical.setBindings(canonicalBindings(endpoint.getBindings()));\n            EndpointNaturalKey key = EndpointNaturalKey.of(namespaceId, agentName, protocol,\n                canonical);\n            if (canonicalEndpoints.put(key, canonical) != null) {\n                throw new IllegalArgumentException(\"Duplicate Runtime Endpoint: \" + key);\n            }\n        }\n        return frame(canonicalEndpoints);","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/ai/src/main/java/com/alibaba/nacos/ai/service/agent/fingerprint/RuntimeEndpointRevision.java#L70-L106","documentation":"The RuntimeEndpointRevision computer caps a single runtime Endpoint projection at 1000 endpoints (MAX_ENDPOINTS). This guard in revisionBytes runs before canonicalization and hashing, preventing unbounded projections from consuming excessive memory and CPU during revision computation.","triggerScenarios":"Calling RuntimeEndpointRevision.compute(namespaceId, agentName, protocol, endpoints) where endpoints.size() > 1000. This happens during RAD protocol runtime endpoint registration or heartbeat when an Agent reports more than 1000 endpoints in one protocol group.","commonSituations":"A large-scale deployment registers hundreds of runtime instances under one Agent. A misconfigured auto-scaling group floods the registry with endpoint registrations. A test or load generator submits unbounded endpoint lists.","solutions":["Reduce the endpoint count to 1000 or fewer per protocol group by sharding across multiple Agents or protocol tokens.","Filter endpoints to include only healthy/enabled instances before submitting.","Paginate or batch endpoint registration across multiple revision computations."],"exampleFix":"// before\nList<AgentDiscoveryEndpoint> all = findAllEndpoints(); // 5000 items\nString rev = RuntimeEndpointRevision.compute(ns, name, proto, all); // throws\n\n// after — shard or filter\nList<AgentDiscoveryEndpoint> batch = all.stream()\n    .filter(AgentDiscoveryEndpoint::getHealthy)\n    .limit(1000)\n    .collect(Collectors.toList());\nString rev = RuntimeEndpointRevision.compute(ns, name, proto, batch);","handlingStrategy":"validation","validationCode":"if (endpoints != null && endpoints.size() > 1000) {\n    throw new IllegalArgumentException(\"Endpoint projection exceeds 1000 items: \" + endpoints.size());\n}","typeGuard":"boolean withinEndpointLimit(List<?> endpoints) {\n    return endpoints == null || endpoints.size() <= 1000;\n}","tryCatchPattern":null,"preventionTips":["Cap endpoint batches at 1000 per protocol group before calling compute.","Shard large endpoint sets across multiple Agents or protocol tokens.","Filter to only healthy/enabled endpoints to reduce volume."],"tags":["agent","ai-registry","rad-protocol","runtime-endpoint","size-limit"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}