{"record":{"id":"da105ce6fa33f26f","repo":"aeron-io/aeron","slug":"control-mode-dynamic-requires-that-control-parameter-is-set-da105c","errorCode":null,"errorMessage":"'control-mode=dynamic' requires that 'control' parameter is set, channel={channel}","messagePattern":"'control-mode=dynamic' requires that 'control' parameter is set, channel=(.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"aeron-driver/src/main/java/io/aeron/driver/DriverConductor.java","lineNumber":2345,"sourceCode":"        {\n            throw new IllegalArgumentException(\n                ENDPOINT_PARAM_NAME + \" has port=0 for publication: channel=\" + udpChannel.originalUriString());\n        }\n    }\n\n    private static void validateControlForPublication(final UdpChannel udpChannel)\n    {\n        if (udpChannel.isDynamicControlMode() && !udpChannel.hasExplicitControl())\n        {\n            throw new IllegalArgumentException(\n                \"'control-mode=dynamic' requires that 'control' parameter is set, channel=\" +\n                    udpChannel.originalUriString());\n        }\n\n        if (udpChannel.hasExplicitControl() && !udpChannel.hasExplicitEndpoint() &&\n            ControlMode.NONE == udpChannel.controlMode())\n        {\n            throw new IllegalArgumentException(\n                \"'control' parameter requires that either 'endpoint' or 'control-mode' is specified, channel=\" +\n                    udpChannel.originalUriString());\n        }\n    }\n\n    private static void validateControlForSubscription(final UdpChannel udpChannel)\n    {\n        if (udpChannel.hasExplicitControl() &&\n            0 == udpChannel.localControl().getPort())\n        {\n            throw new IllegalArgumentException(MDC_CONTROL_PARAM_NAME + \" has port=0 for subscription: channel=\" +\n                udpChannel.originalUriString());\n        }\n    }\n\n    private static void validateTimestampConfiguration(final UdpChannel udpChannel)\n    {\n        if (null != udpChannel.channelUri().get(MEDIA_RCV_TIMESTAMP_OFFSET_PARAM_NAME))","sourceCodeStart":2327,"sourceCodeEnd":2363,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-driver/src/main/java/io/aeron/driver/DriverConductor.java#L2327-L2363","documentation":"When a publication URI specifies an explicit 'control' address but neither an 'endpoint' nor a 'control-mode', the driver cannot tell whether this is dynamic MDC or manual control, so it rejects the channel with this IllegalArgumentException. Specifying control alone is ambiguous and therefore invalid.","triggerScenarios":"addPublication with \"aeron:udp?control=localhost:40456\" and no endpoint and no control-mode parameter; migrating from an MDC URI by deleting control-mode but keeping control.","commonSituations":"URI trimming/refactoring removed control-mode=dynamic while control remained; hand-written URIs omitting control-mode assuming it is implied by control.","solutions":["Add control-mode=dynamic (or manual) to the URI when control is specified","Or add endpoint=host:port if a unicast publication with explicit control response was intended","Remove the control parameter if a plain endpoint-based publication was intended"],"exampleFix":"// before\naeron.addPublication(\"aeron:udp?control=localhost:40456\", 1001);\n// after\naeron.addPublication(\"aeron:udp?control=localhost:40456|control-mode=dynamic\", 1001);","handlingStrategy":"validation","validationCode":"if (uriParam(channel, \"control\", null) != null && uriParam(channel, \"endpoint\", null) == null\n    && uriParam(channel, \"control-mode\", null) == null) {\n    throw new IllegalArgumentException(\"control= requires endpoint= or control-mode=: \" + channel);\n}","typeGuard":null,"tryCatchPattern":"try { aeron.addPublication(channel, streamId); } catch (IllegalArgumentException e) { if (e.getMessage().contains(\"'control' parameter requires\")) { log.error(\"specify control-mode or endpoint for {}\", channel); } throw e; }","preventionTips":["Never emit a bare control= parameter in publication URIs","Keep control+control-mode as an atomic pair in URI builders","Review URI refactoring diffs for dropped control-mode params"],"tags":["aeron","uri","mdc","channel-config"],"backgroundTag":"missing-required-config-field","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}