aeron-io/aeron · error · ConductorServiceTimeoutException

service interval exceeded: timeout=

Error message

service interval exceeded: timeout=<timeout>, interval=<interval>

What it means

ConductorServiceTimeoutException thrown when the interval between two successive services of the client conductor (its duty-cycle loop) exceeded the interServiceTimeoutNs. This means the application starved the conductor thread (or blocked it inside a callback) for so long the driver may have timed the client out; the conductor terminates itself to stay safe.

Solutions

  1. Keep callbacks fast: move heavy work off the conductor thread into a queue/worker
  2. Increase Context.interServiceTimeout if your workload legitimately pauses
  3. Check GC settings and container CPU limits for long pauses
  4. Never block (sleep, I/O, locks) inside Aeron client callbacks

Example fix

// before
subscription.onAvailableImage(img -> parseAndWriteToDisk(img)); // blocks conductor thread
// after
subscription.onAvailableImage(img -> workQueue.offer(img));
Defensive patterns

Strategy: try-catch

Try / catch

catch (ConductorServiceTimeoutException e) { recreateClient(); } // conductor self-terminated; a new Aeron instance is required

Prevention

When it happens

Trigger: Blocking for longer than interServiceTimeout (default 10s) inside an available-image handler or other client callback; the conductor thread descheduled (VM pause, container CPU throttling, debugger breakpoint); calling blocking operations from within callbacks.

Common situations: Long GC pauses or VM freezes; heavy work (parsing, I/O) done inside image-available callbacks on the conductor thread; cgroup CPU limits starving the thread; debuggers suspending the thread during development.

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/37b39107d5e42e3c. Report an issue: GitHub.

Appendix: source

Thrown at aeron-client/src/main/java/io/aeron/ClientConductor.java:1874

        if ((timeOfLastServiceNs + idleSleepDurationNs) - nowNs < 0)
        {
            checkServiceInterval(nowNs);
            timeOfLastServiceNs = nowNs;

            workCount += checkLiveness(nowNs);
            workCount += checkLingeringResources(nowNs);
        }

        return workCount;
    }

    private void checkServiceInterval(final long nowNs)
    {
        if ((timeOfLastServiceNs + interServiceTimeoutNs) - nowNs < 0)
        {
            terminateConductor();

            throw new ConductorServiceTimeoutException(
                "service interval exceeded: timeout=" + SystemUtil.formatDuration(interServiceTimeoutNs) +
                ", interval=" + SystemUtil.formatDuration(nowNs - timeOfLastServiceNs));
        }
    }

    private int checkLiveness(final long nowNs)
    {
        if ((timeOfLastKeepAliveNs + keepAliveIntervalNs) - nowNs < 0)
        {
            final long nowMs = epochClock.time();
            final long lastKeepAliveMs = driverProxy.timeOfLastDriverKeepaliveMs();

            if (nowMs > (lastKeepAliveMs + driverTimeoutMs))
            {
                terminateConductor();

                if (Aeron.NULL_VALUE == lastKeepAliveMs)
                {

View on GitHub (pinned to 6d60124e15)