aeron-io/aeron · error · AeronEvent

could not re-resolve: control=

Error message

could not re-resolve: control={control}

What it means

Thrown during dynamic re-resolution of an existing channel's control address (MDC control param). The driver scheduled a DNS re-resolution, got a result back, but the address is still unresolved — the hostname cannot be resolved to an IP at re-resolution time.

Solutions

  1. Fix DNS so the control hostname resolves (dig/nslookup the name from the driver host).
  2. Replace the hostname in the control= parameter with a literal IP to avoid re-resolution.
  3. Configure a custom NameResolver (io.aeron.driver.NameResolver) with a resilient/ cached resolver.
  4. Catch AeronEvent and fall back to the previous address or restart the endpoint once DNS recovers.

Example fix

// before
Aeron.connect(new Aeron.Context()).addPublication("aeron:udp?control=mdc-host-1:40456", streamId);
// after
Aeron.connect(new Aeron.Context()).addPublication("aeron:udp?control=192.168.1.10:40456", streamId); // literal IP avoids re-resolution
Defensive patterns

Strategy: retry

Validate before calling

InetSocketAddress addr = new InetSocketAddress(controlHost, port);
if (addr.isUnresolved()) { /* fix DNS or use IP before creating channel */ }

Try / catch

try {
    configureControlAddress(control);
} catch (AeronEvent e) {
    if (e.getMessage().startsWith("could not re-resolve: control=")) {
        backoffAndRetryDnsResolution();
    } else { throw e; }
}

Prevention

When it happens

Trigger: A channel endpoint whose control-mode=manual/dynamic URI contains a hostname in the control= parameter; the driver's address resolver re-resolve task runs and the underlying resolver (DNS, NameResolver) returns an unresolved InetSocketAddress.

Common situations: DNS outage or resolver misconfiguration while a long-lived publication/subscription is active; hostname removed from /etc/hosts or DNS zone; using a name the JVM resolver cannot resolve in the current network (e.g. container networking changes).

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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

Appendix: source

Thrown at aeron-driver/src/main/java/io/aeron/driver/DriverConductor.java:3840

            final UdpChannel udpChannel,
            final ReceiveChannelEndpoint channelEndpoint,
            final InetSocketAddress address)
        {
            resolvedAddressResult = nativeResourceAgentProxy.reResolveAddress(control, MDC_CONTROL_PARAM_NAME);
            this.control = control;
            this.udpChannel = udpChannel;
            this.channelEndpoint = channelEndpoint;
            this.address = address;
        }

        boolean execute()
        {
            final InetSocketAddress newAddress = resolvedAddressResult.get();
            if (null != newAddress)
            {
                if (newAddress.isUnresolved())
                {
                    throw new AeronEvent("could not re-resolve: " + MDC_CONTROL_PARAM_NAME + "=" + control);
                }

                if (ChannelEndpointStatus.ACTIVE == channelEndpoint.status())
                {
                    if (!Objects.equals(address, newAddress))
                    {
                        receiverProxy.onResolutionChange(channelEndpoint, udpChannel, newAddress);
                    }
                }
                return true;
            }
            return false;
        }
    }

    private final class ReResolveEndpointAddress extends Command
    {
        private final String endpoint;

View on GitHub (pinned to 6d60124e15)