aeron-io/aeron · error · ConfigurationException

endpoint missing '=' separator:

Error message

endpoint missing '=' separator: 

What it means

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.

Solutions

  1. Fix the ingress endpoints string to the required form "0=host:port,1=host:port,..." with '=' between id and endpoint.
  2. Validate the endpoints configuration before passing it to the Context.
  3. If generating endpoints programmatically, ensure the endpoint value is non-empty and joined with '='.
  4. Check for whitespace or encoding issues that may have removed the '=' character during config templating.

Example fix

// before
ctx.ingressEndpoints("0localhost:20000,1localhost:20001");
// after
ctx.ingressEndpoints("0=localhost:20000,1=localhost:20001");
Defensive patterns

Strategy: validation

Validate before calling

final String endpoints = ctx.ingressEndpoints();
for (final String ep : endpoints.split(",")) {
  if (!ep.contains("=")) throw new IllegalArgumentException("bad ingress endpoint: " + ep);
}
AeronCluster.connect(ctx);

Try / catch

try { AeronCluster.connect(ctx); } catch (ConfigurationException e) { if (e.getMessage().startsWith("endpoint missing '='")) { fixIngressEndpointsConfig(); } }

Prevention

When it happens

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

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

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/32069b331cceb8a1. Report an issue: GitHub.

Appendix: source

Thrown at aeron-cluster/src/main/java/io/aeron/cluster/client/AeronCluster.java:747

            if (0 < result)
            {
                state(State.CONNECTED, 0);
            }
        }
    }

    static Int2ObjectHashMap<MemberIngress> parseIngressEndpoints(final Context ctx, final String endpoints)
    {
        final Int2ObjectHashMap<MemberIngress> endpointByIdMap = new Int2ObjectHashMap<>();

        if (null != endpoints)
        {
            for (final String endpoint : endpoints.split(","))
            {
                final int i = endpoint.indexOf('=');
                if (-1 == i)
                {
                    throw new ConfigurationException("endpoint missing '=' separator: " + endpoints);
                }

                final int memberId = AsciiEncoding.parseIntAscii(endpoint, 0, i);
                endpointByIdMap.put(memberId, new MemberIngress(ctx, memberId, endpoint.substring(i + 1)));
            }
        }

        return endpointByIdMap;
    }

    private Publication addNewLeaderIngressPublication(final Context ctx, final String channel, final int streamId)
    {
        long registrationId = asyncAddIngressPublication(ctx, channel, streamId);
        final long deadlineNs = nanoClock.nanoTime() + ctx.messageTimeoutNs();
        do
        {
            if (NULL_VALUE == registrationId)
            {

View on GitHub (pinned to 6d60124e15)