aeron-io/aeron · error · ClusterException

invalid member value

Error message

invalid member value: ${endpoints}

What it means

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.

Solutions

  1. Provide exactly 5 comma-separated endpoints: clientFacing,member,log,archive,replication
  2. Do not prepend the member id when calling parseEndpoints
  3. Use ClusterMember.parse (6-8 fields) for full member strings instead
  4. Print the split count when debugging the offending string

Example fix

// before
parseEndpoints(0, "0,localhost:20000,localhost:20001,localhost:20002,localhost:20003") // 6 fields
// after
parseEndpoints(0, "localhost:20000,localhost:20001,localhost:20002,localhost:20003,localhost:20004") // 5 fields
Defensive patterns

Strategy: validation

Validate before calling

boolean hasFiveEndpoints(String endpoints) {
    return endpoints.split(",").length == 5;
}

Try / catch

try {
    ClusterMember.parseEndpoints(id, endpoints);
} catch (ClusterException e) {
    log.error("endpoints must have exactly 5 fields, got: " + endpoints, e);
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.

Related errors


AI-assisted analysis of aeron-io/aeron@6d60124e15 (2026-09-12). Data as JSON: /api/errors/902f3d6ed9c3f3d6. Report an issue: GitHub.

Appendix: source

Thrown at aeron-cluster/src/main/java/io/aeron/cluster/ClusterMember.java:625

        }

        return members;
    }

    /**
     * Parse a string containing the endpoints for a cluster node and passing to
     * {@link #ClusterMember(int, String, String, String, String, String, String)}.
     *
     * @param id        of the member node.
     * @param endpoints comma separated.
     * @return the {@link ClusterMember} with the endpoints set.
     */
    public static ClusterMember parseEndpoints(final int id, final String endpoints)
    {
        final String[] memberAttributes = endpoints.split(",");
        if (memberAttributes.length != 5)
        {
            throw new ClusterException("invalid member value: " + endpoints);
        }

        return new ClusterMember(
            id,
            memberAttributes[0],
            memberAttributes[1],
            memberAttributes[2],
            memberAttributes[3],
            memberAttributes[4],
            endpoints);
    }

    /**
     * Encode member endpoints from a cluster members array to a String.
     *
     * @param clusterMembers to fill the details from.
     * @return String representation suitable for use with {@link #parse(String)}.
     */

View on GitHub (pinned to 6d60124e15)