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
- 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.
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
- 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.
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
- clusterMembers and endpoints differ
- not found in
- invalid member value
- ConsensusModule.Context.clusterMembers must be set
- incompatible time unit
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)