{"record":{"id":"c6c62b9d5de5a48d","repo":"aeron-io/aeron","slug":"local-control-channel-must-be-ipc-media-uri","errorCode":null,"errorMessage":"local control channel must be IPC media: uri=${localControlChannel}","messagePattern":"local control channel must be IPC media: uri=(.+?)","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-archive/src/main/java/io/aeron/archive/Archive.java","lineNumber":1232,"sourceCode":"            checkTermLength(controlTermBufferLength);\n\n            if (controlChannelEnabled)\n            {\n                if (null == controlChannel)\n                {\n                    throw new ConfigurationException(\"Archive.Context.controlChannel must be set\");\n                }\n\n                if (!controlChannel.startsWith(CommonContext.UDP_CHANNEL))\n                {\n                    throw new ConfigurationException(\n                        \"Archive.Context.controlChannel must be UDP media: uri=\" + controlChannel);\n                }\n            }\n\n            if (!localControlChannel.startsWith(CommonContext.IPC_CHANNEL))\n            {\n                throw new ConfigurationException(\"local control channel must be IPC media: uri=\" + localControlChannel);\n            }\n\n            if (null == replicationChannel)\n            {\n                throw new ConfigurationException(\"Archive.Context.replicationChannel must be set\");\n            }\n\n            if (recordingEventsEnabled() && null == recordingEventsChannel())\n            {\n                throw new ConfigurationException(\n                    \"Archive.Context.recordingEventsChannel must be set if \" +\n                    \"Archive.Context.recordingEventsEnabled is true\");\n            }\n\n            if (null != mediaDriverAgentInvoker && ArchiveThreadingMode.INVOKER != threadingMode)\n            {\n                throw new ConfigurationException(\n                    \"Archive.Context.threadingMode(ArchiveThreadingMode.INVOKER) must be set if \" +","sourceCodeStart":1214,"sourceCodeEnd":1250,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-archive/src/main/java/io/aeron/archive/Archive.java#L1214-L1250","documentation":"The archive's local control channel is used for same-host IPC communication and must be an aeron:ipc URI. conclude() throws this ConfigurationException when the provided URI is not IPC (e.g. a UDP URI was supplied).","triggerScenarios":"Setting localControlChannel to aeron:udp?endpoint=... instead of aeron:ipc; swapping the controlChannel and localControlChannel values when configuring the archive.","commonSituations":"Copy-paste of the remote control channel URI into the local one; operators changing the local channel to UDP expecting better tooling access; template configs with the fields in the wrong order.","solutions":["Set localControlChannel to \"aeron:ipc\"","Use UDP URIs only for controlChannel and replicationChannel","Check that controlChannel/localControlChannel were not swapped in your config"],"exampleFix":"// before\nctx.localControlChannel(\"aeron:udp?endpoint=localhost:8011\")\n// after\nctx.localControlChannel(\"aeron:ipc\")","handlingStrategy":"validation","validationCode":"if (!ctx.localControlChannel().startsWith(\"aeron:ipc\")) {\n    throw new IllegalArgumentException(\"localControlChannel must be aeron:ipc\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use the literal \"aeron:ipc\" for local control channels","Check for swapped controlChannel/localControlChannel values in configs","Add unit tests that conclude() the context with test defaults"],"tags":["configuration","aeron-archive","ipc-channel","uri-format"],"backgroundTag":"invalid-url-format","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"}