{"record":{"id":"f2a7195c092564d2","repo":"aeron-io/aeron","slug":"explicit-control-expected-with-dynamic-control-mode","errorCode":null,"errorMessage":"explicit control expected with dynamic control mode: ","messagePattern":"explicit control expected with dynamic control mode: ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"aeron-driver/src/main/java/io/aeron/driver/media/UdpChannel.java","lineNumber":168,"sourceCode":"            final String tagIdStr = channelUri.channelTag();\n            final ControlMode controlMode = parseControlMode(channelUri);\n\n            final int socketRcvbufLength = parseBufferLength(channelUri, SOCKET_RCVBUF_PARAM_NAME);\n            final int socketSndbufLength = parseBufferLength(channelUri, SOCKET_SNDBUF_PARAM_NAME);\n            final int receiverWindowLength = parseBufferLength(\n                channelUri, RECEIVER_WINDOW_LENGTH_PARAM_NAME);\n\n            final boolean requiresAdditionalSuffix = !isDestination &&\n                (null == endpointAddress && null == controlAddress ||\n                (null != endpointAddress && endpointAddress.getPort() == 0) ||\n                (null != controlAddress && controlAddress.getPort() == 0));\n\n            final boolean hasNoDistinguishingCharacteristic =\n                null == endpointAddress && null == controlAddress && null == tagIdStr;\n\n            if (ControlMode.DYNAMIC == controlMode && null == controlAddress)\n            {\n                throw new IllegalArgumentException(\n                    \"explicit control expected with dynamic control mode: \" + channelUriString);\n            }\n\n            if (hasNoDistinguishingCharacteristic && ControlMode.MANUAL != controlMode &&\n                ControlMode.RESPONSE != controlMode)\n            {\n                throw new IllegalArgumentException(\n                    \"URIs for UDP must specify an endpoint, control, tags, or control-mode=manual/response: \" +\n                    channelUriString);\n            }\n\n            if (null != endpointAddress && endpointAddress.isUnresolved())\n            {\n                throw new UnknownHostException(\"could not resolve endpoint address: \" + endpointAddress);\n            }\n\n            if (null != controlAddress && controlAddress.isUnresolved())\n            {","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-driver/src/main/java/io/aeron/driver/media/UdpChannel.java#L150-L186","documentation":"UdpChannel.parse throws IllegalArgumentException when a channel URI sets control-mode=dynamic but provides no explicit control address. Dynamic multi-destination-cast requires a known control address for the receiver(s) to contact, so an explicitly configured control is mandatory in that mode.","triggerScenarios":"Parsing a URI such as aeron:udp?control-mode=dynamic (with no control= parameter) when creating a publication or subscription via Aeron.addPublication/addSubscription.","commonSituations":"MDC setups where the control= parameter was dropped or misspelled (e.g. control-adress typo); confusing control-mode with manual mode; partially edited URIs when switching from manual to dynamic mode.","solutions":["Add an explicit control address to the URI, e.g. aeron:udp?control-mode=dynamic|control=224.0.1.1:40456","Confirm the parameter name is exactly 'control' and the value parses as address:port (or [v6]:port)","If destinations are added manually at runtime, use control-mode=manual instead of dynamic"],"exampleFix":"// before\n\"aeron:udp?control-mode=dynamic\"\n// after\n\"aeron:udp?control-mode=dynamic|control=224.0.1.1:40456\"","handlingStrategy":"validation","validationCode":"boolean isDynamic = \"dynamic\".equals(params.get(\"control-mode\"));\nboolean hasControl = params.containsKey(\"control\") && !params.get(\"control\").isEmpty();\nif (isDynamic && !hasControl) throw new IllegalArgumentException(\"control-mode=dynamic requires control=<address:port>\");","typeGuard":null,"tryCatchPattern":"try {\n    UdpChannel.parse(uri, true, NameResolver.NULL_NAME_RESOLVER);\n} catch (IllegalArgumentException e) {\n    // reject/mend URI before configuring driver\n}","preventionTips":["Always pair control-mode=dynamic with an explicit control address","Centralize URI building and assert invariants there","Beware typos: unknown parameters are silently ignored"],"tags":["aeron","mdc","uri","configuration"],"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"}