{"record":{"id":"902f3d6ed9c3f3d6","repo":"aeron-io/aeron","slug":"invalid-member-value-endpoints","errorCode":null,"errorMessage":"invalid member value: ${endpoints}","messagePattern":"invalid member value: (.+?)","errorType":"validation","errorClass":"ClusterException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/ClusterMember.java","lineNumber":625,"sourceCode":"        }\n\n        return members;\n    }\n\n    /**\n     * Parse a string containing the endpoints for a cluster node and passing to\n     * {@link #ClusterMember(int, String, String, String, String, String, String)}.\n     *\n     * @param id        of the member node.\n     * @param endpoints comma separated.\n     * @return the {@link ClusterMember} with the endpoints set.\n     */\n    public static ClusterMember parseEndpoints(final int id, final String endpoints)\n    {\n        final String[] memberAttributes = endpoints.split(\",\");\n        if (memberAttributes.length != 5)\n        {\n            throw new ClusterException(\"invalid member value: \" + endpoints);\n        }\n\n        return new ClusterMember(\n            id,\n            memberAttributes[0],\n            memberAttributes[1],\n            memberAttributes[2],\n            memberAttributes[3],\n            memberAttributes[4],\n            endpoints);\n    }\n\n    /**\n     * Encode member endpoints from a cluster members array to a String.\n     *\n     * @param clusterMembers to fill the details from.\n     * @return String representation suitable for use with {@link #parse(String)}.\n     */","sourceCodeStart":607,"sourceCodeEnd":643,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/ClusterMember.java#L607-L643","documentation":"ClusterMember.parseEndpoints requires an endpoints string with exactly 5 comma-separated attributes (client-facing, member, log, archive, replication endpoints). Any other count is rejected with this exception.","triggerScenarios":"Calling ClusterMember.parseEndpoints(id, endpoints) where endpoints.split(\",\").length != 5, e.g. passing a full member string with id and 8 fields instead of a 5-endpoint string.","commonSituations":"Confusing the full member list format with the single-member endpoints format in tooling or config, missing endpoints in aeron.cluster.member.endpoints-style settings.","solutions":["Provide exactly 5 comma-separated endpoints: clientFacing,member,log,archive,replication","Do not prepend the member id when calling parseEndpoints","Use ClusterMember.parse (6-8 fields) for full member strings instead","Print the split count when debugging the offending string"],"exampleFix":"// before\nparseEndpoints(0, \"0,localhost:20000,localhost:20001,localhost:20002,localhost:20003\") // 6 fields\n// after\nparseEndpoints(0, \"localhost:20000,localhost:20001,localhost:20002,localhost:20003,localhost:20004\") // 5 fields","handlingStrategy":"validation","validationCode":"boolean hasFiveEndpoints(String endpoints) {\n    return endpoints.split(\",\").length == 5;\n}","typeGuard":null,"tryCatchPattern":"try {\n    ClusterMember.parseEndpoints(id, endpoints);\n} catch (ClusterException e) {\n    log.error(\"endpoints must have exactly 5 fields, got: \" + endpoints, e);\n}","preventionTips":["Use parse() for full member strings (id + 6-8 fields) and parseEndpoints() only for the 5-endpoint form","Keep a canonical example of the endpoints format in your config tooling","Validate endpoints strings in CI before deployment"],"tags":["aeron","config","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"}