{"record":{"id":"5bde0cea2d3ea090","repo":"aeron-io/aeron","slug":"logchannel-must-not-contain-termid-param-name","errorCode":null,"errorMessage":"logChannel must not contain: <termId param name>","messagePattern":"logChannel must not contain: <termId param name>","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModule.java","lineNumber":4618,"sourceCode":"            }\n            else if (PriorityHeapTimerServiceSupplier.class.getName().equals(timeServiceClassName))\n            {\n                return new PriorityHeapTimerServiceSupplier();\n            }\n\n            throw new ClusterException(\"invalid TimerServiceSupplier: \" + timeServiceClassName);\n        }\n\n        private void validateLogChannel()\n        {\n            final ChannelUri logChannelUri = parse(logChannel);\n            if (logChannelUri.containsKey(INITIAL_TERM_ID_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + INITIAL_TERM_ID_PARAM_NAME);\n            }\n            if (logChannelUri.containsKey(TERM_ID_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + TERM_ID_PARAM_NAME);\n            }\n            if (logChannelUri.containsKey(TERM_OFFSET_PARAM_NAME))\n            {\n                throw new ConfigurationException(\"logChannel must not contain: \" + TERM_OFFSET_PARAM_NAME);\n            }\n        }\n\n        /**\n         * {@inheritDoc}\n         */\n        @Override\n        public String toString()\n        {\n            return \"ConsensusModule.Context\" +\n                \"\\n{\" +\n                \"\\n    isConcluded=\" + isConcluded() +\n                \"\\n    ownsAeronClient=\" + ownsAeronClient +\n                \"\\n    aeronDirectoryName='\" + aeronDirectoryName + '\\'' +","sourceCodeStart":4600,"sourceCodeEnd":4636,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/ConsensusModule.java#L4600-L4636","documentation":"Part of the same validateLogChannel() check: the logChannel URI must not contain termId, since cluster members must agree on the log's term identity and a pinned termId would break replication/recovery. A ConfigurationException naming the parameter is thrown.","triggerScenarios":"logChannel URI includes termId, e.g. 'aeron:udp?endpoint=...|termId=100'.","commonSituations":"Copying a channel string from a standalone Aeron publication config; hand-crafted URI including term positioning params.","solutions":["Remove termId from the logChannel URI.","If term positioning is needed for other streams, configure it there, not on the cluster log channel.","Let the cluster manage term parameters during election and replay."],"exampleFix":"// before\nctx.logChannel(\"aeron:udp?endpoint=localhost:20000|termId=100\");\n// after\nctx.logChannel(\"aeron:udp?endpoint=localhost:20000\");","handlingStrategy":"validation","validationCode":"ChannelUri uri = ChannelUri.parse(logChannel);\nif (uri.containsKey(\"termId\")) {\n    throw new IllegalArgumentException(\"logChannel must not contain termId\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never pin termId on the cluster log channel","Diff configured channels against known-good cluster samples","Parse and whitelist allowed URI params before launch"],"tags":["aeron-cluster","configuration","channel-uri","log-channel"],"backgroundTag":"invalid-config-value","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"}