{"record":{"id":"32069b331cceb8a1","repo":"aeron-io/aeron","slug":"endpoint-missing-separator","errorCode":null,"errorMessage":"endpoint missing '=' separator: ","messagePattern":"endpoint missing '=' separator: ","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/client/AeronCluster.java","lineNumber":747,"sourceCode":"            if (0 < result)\n            {\n                state(State.CONNECTED, 0);\n            }\n        }\n    }\n\n    static Int2ObjectHashMap<MemberIngress> parseIngressEndpoints(final Context ctx, final String endpoints)\n    {\n        final Int2ObjectHashMap<MemberIngress> endpointByIdMap = new Int2ObjectHashMap<>();\n\n        if (null != endpoints)\n        {\n            for (final String endpoint : endpoints.split(\",\"))\n            {\n                final int i = endpoint.indexOf('=');\n                if (-1 == i)\n                {\n                    throw new ConfigurationException(\"endpoint missing '=' separator: \" + endpoints);\n                }\n\n                final int memberId = AsciiEncoding.parseIntAscii(endpoint, 0, i);\n                endpointByIdMap.put(memberId, new MemberIngress(ctx, memberId, endpoint.substring(i + 1)));\n            }\n        }\n\n        return endpointByIdMap;\n    }\n\n    private Publication addNewLeaderIngressPublication(final Context ctx, final String channel, final int streamId)\n    {\n        long registrationId = asyncAddIngressPublication(ctx, channel, streamId);\n        final long deadlineNs = nanoClock.nanoTime() + ctx.messageTimeoutNs();\n        do\n        {\n            if (NULL_VALUE == registrationId)\n            {","sourceCodeStart":729,"sourceCodeEnd":765,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/client/AeronCluster.java#L729-L765","documentation":"parseIngressEndpoints splits a comma-separated list of memberId=endpoint entries; each entry must contain '=' to separate the member id from its endpoint. When an entry lacks the separator, the library throws ConfigurationException because the ingress endpoints string cannot be parsed into the memberId map.","triggerScenarios":"Calling AeronCluster.parseIngressEndpoints() or connect()/map with ctx.ingressEndpoints() containing a malformed entry such as \"0localhost:20000\" or \"0=\"-free text — i.e. missing '=' between member id and endpoint.","commonSituations":"Hand-edited cluster ingress endpoints configuration; dynamically built endpoint strings where a member's endpoint was omitted but the id kept; copying endpoints from a different config format (space or ':' separated).","solutions":["Fix the ingress endpoints string to the required form \"0=host:port,1=host:port,...\" with '=' between id and endpoint.","Validate the endpoints configuration before passing it to the Context.","If generating endpoints programmatically, ensure the endpoint value is non-empty and joined with '='.","Check for whitespace or encoding issues that may have removed the '=' character during config templating."],"exampleFix":"// before\nctx.ingressEndpoints(\"0localhost:20000,1localhost:20001\");\n// after\nctx.ingressEndpoints(\"0=localhost:20000,1=localhost:20001\");","handlingStrategy":"validation","validationCode":"final String endpoints = ctx.ingressEndpoints();\nfor (final String ep : endpoints.split(\",\")) {\n  if (!ep.contains(\"=\")) throw new IllegalArgumentException(\"bad ingress endpoint: \" + ep);\n}\nAeronCluster.connect(ctx);","typeGuard":null,"tryCatchPattern":"try { AeronCluster.connect(ctx); } catch (ConfigurationException e) { if (e.getMessage().startsWith(\"endpoint missing '='\")) { fixIngressEndpointsConfig(); } }","preventionTips":["Template ingress endpoints as memberId=host:port pairs joined by commas.","Validate endpoint strings in config pipelines before startup.","Add a unit test that parses the configured endpoints string."],"tags":["cluster","configuration","parsing","endpoints"],"backgroundTag":"invalid-argument-format","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}