{"record":{"id":"41811fb2d18f6fbd","repo":"aeron-io/aeron","slug":"untetheredwindowlimittimeoutns","errorCode":null,"errorMessage":"untetheredWindowLimitTimeoutNs=${untetheredWindowLimitTimeoutNs} <= timerIntervalNs=${timerIntervalNs}","messagePattern":"untetheredWindowLimitTimeoutNs=(.+?) <= timerIntervalNs=(.+?)","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-driver/src/main/java/io/aeron/driver/Configuration.java","lineNumber":2628,"sourceCode":"\n    /**\n     * Validate that the timeouts for untethered subscriptions are greater than timer interval.\n     *\n     * @param untetheredWindowLimitTimeoutNs after which an active untethered subscription will be lingered.\n     * @param untetheredLingerTimeoutNs      after which a lingering untethered subscription will transition to resting.\n     * @param untetheredRestingTimeoutNs     after which a resting untethered subscription will become active again.\n     * @param timerIntervalNs                interval at which the driver will check timeouts.\n     * @throws ConfigurationException if the values are not valid.\n     */\n    public static void validateUntetheredTimeouts(\n        final long untetheredWindowLimitTimeoutNs,\n        final long untetheredLingerTimeoutNs,\n        final long untetheredRestingTimeoutNs,\n        final long timerIntervalNs)\n    {\n        if (untetheredWindowLimitTimeoutNs <= timerIntervalNs)\n        {\n            throw new ConfigurationException(\n                \"untetheredWindowLimitTimeoutNs=\" + untetheredWindowLimitTimeoutNs +\n                \" <= timerIntervalNs=\" + timerIntervalNs);\n        }\n\n        if (untetheredRestingTimeoutNs <= timerIntervalNs)\n        {\n            throw new ConfigurationException(\n                \"untetheredRestingTimeoutNs=\" + untetheredRestingTimeoutNs +\n                \" <= timerIntervalNs=\" + timerIntervalNs);\n        }\n\n        if (Aeron.NULL_VALUE != untetheredLingerTimeoutNs && untetheredLingerTimeoutNs <= timerIntervalNs)\n        {\n            throw new ConfigurationException(\n                \"untetheredLingerTimeoutNs=\" + untetheredLingerTimeoutNs +\n                    \" <= timerIntervalNs=\" + timerIntervalNs);\n        }\n    }","sourceCodeStart":2610,"sourceCodeEnd":2646,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-driver/src/main/java/io/aeron/driver/Configuration.java#L2610-L2646","documentation":"Configuration.validateUntetheredTimeouts checks that the untethered window limit timeout is strictly greater than the driver timer interval, so untethered subscriptions are managed on a timescale meaningful relative to driver housekeeping ticks. A ConfigurationException is thrown when untetheredWindowLimitTimeoutNs <= timerIntervalNs.","triggerScenarios":"Calling validateUntetheredTimeouts with aeron.untethered.window.limit.timeout <= aeron.timer.interval, e.g. windowLimitTimeout=100ms with timerInterval=1s.","commonSituations":"Shrinking untethered timeouts to reclaim subscriptions quickly while leaving the timer interval at its default; bulk-copying timeout values without checking interdependencies.","solutions":["Raise aeron.untethered.window.limit.timeout so it is strictly greater than aeron.timer.interval","Or lower aeron.timer.interval","Audit all untethered timeouts together against the timer interval"],"exampleFix":"// before\nctx.timerIntervalNs(TimeUnit.SECONDS.toNanos(1));\nctx.untetheredWindowLimitTimeoutNs(TimeUnit.MILLISECONDS.toNanos(100));\n// after\nctx.timerIntervalNs(TimeUnit.SECONDS.toNanos(1));\nctx.untetheredWindowLimitTimeoutNs(TimeUnit.SECONDS.toNanos(5)); // > timerInterval","handlingStrategy":"validation","validationCode":"long timer = TimeUnit.MILLISECONDS.toNanos(100);\nlong windowLimit = TimeUnit.SECONDS.toNanos(5);\nif (windowLimit <= timer) throw new IllegalStateException(\"untetheredWindowLimitTimeout must be > timerInterval\");\nio.aeron.driver.Configuration.validateUntetheredTimeouts(windowLimit, restingTimeout, lingerTimeout, timer);","typeGuard":null,"tryCatchPattern":"try {\n    ctx.conclude();\n} catch (ConfigurationException e) {\n    if (e.getMessage().contains(\"untetheredWindowLimitTimeoutNs\")) {\n        ctx.untetheredWindowLimitTimeoutNs(ctx.timerIntervalNs() * 10);\n        ctx.conclude();\n    } else { throw e; }\n}","preventionTips":["Treat aeron.timer.interval as the base unit and derive untethered timeouts as multiples of it","Validate untethered timeouts whenever the timer interval changes","Keep untethered defaults unless you have measured a need to change them"],"tags":["aeron","configuration","timeout","untethered-subscription"],"backgroundTag":"conflicting-config-options","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}