{"record":{"id":"4b52ff2ce307c7be","repo":"aeron-io/aeron","slug":"failed-to-add-live-log-as-follower-channel","errorCode":null,"errorMessage":"failed to add live log as follower - ${channel}","messagePattern":"failed to add live log as follower - (.+?)","errorType":"exception","errorClass":"ClusterException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/Election.java","lineNumber":1156,"sourceCode":"        final Image image = logSubscription.imageBySessionId(logSessionId);\n        if (null != image)\n        {\n            verifyLogJoinPosition(\"followerLogAwait\", image.joinPosition());\n            if (consensusModuleAgent.tryJoinLogAsFollower(image, isLeaderStartup, nowNs))\n            {\n                updateRecordingLog(nowNs);\n                state(FOLLOWER_READY, nowNs, \"\");\n                workCount++;\n            }\n            else if (nowNs >= (timeOfLastStateChangeNs + ctx.leaderHeartbeatTimeoutNs()))\n            {\n                throw new TimeoutException(\"failed to join live log as follower\", AeronException.Category.WARN);\n            }\n        }\n        else if (ChannelEndpointStatus.ERRORED == logSubscription.channelStatus())\n        {\n            final String message = \"failed to add live log as follower - \" + logSubscription.channel();\n            throw new ClusterException(message, AeronException.Category.WARN);\n        }\n        else if (nowNs >= (timeOfLastStateChangeNs + ctx.leaderHeartbeatTimeoutNs()))\n        {\n            throw new TimeoutException(\"failed to join live log\", AeronException.Category.WARN);\n        }\n\n        return workCount;\n    }\n\n    private int followerReady(final long nowNs)\n    {\n        if (consensusPublisher.appendPosition(\n            leaderMember.publication(), leadershipTermId, logPosition, thisMember.id(), APPEND_POSITION_FLAG_NONE))\n        {\n            consensusModuleAgent.electionComplete(nowNs);\n            state(CLOSED, nowNs, \"\");\n        }\n        else if (nowNs >= (timeOfLastStateChangeNs + ctx.leaderHeartbeatTimeoutNs()))","sourceCodeStart":1138,"sourceCodeEnd":1174,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/Election.java#L1138-L1174","documentation":"ClusterException (WARN) thrown when the media driver reports the follower's live log subscription channel as ERRORED while waiting to join the leader's live log. The live log cannot be added, so this member cannot follow the newly elected leader.","triggerScenarios":"During FOLLOWER_LIVE_LOG_AWAIT, logSubscription.channelStatus() becomes ChannelEndpointStatus.ERRORED, e.g. the driver failed to resolve/bind or the channel URI is invalid for the live log stream.","commonSituations":"Bad log channel endpoints in cluster member config, port conflicts, unreachable multicast groups, driver-side network errors after leader change rewired channels.","solutions":["Read the media driver error logs for the exact channel failure cause","Correct the log/logical channel configuration (endpoints, interface, TTL for multicast)","Ensure ports are available and not firewalled between members","Restart the driver/node once the channel config is fixed"],"exampleFix":"// before\n.logChannel(\"aeron:udp?endpoint=224.20.30.39:20001\") // multicast unreachable\n// after\n.logChannel(\"aeron:udp?control-mode=manual|group=true&interface=eth0\") // fix interface/TTL per driver error","handlingStrategy":"validation","validationCode":"// validate live log channel config before cluster start\nChannelUri logUri = ChannelUri.parse(ctx.logChannel());\nif (\"udp\".equals(logUri.get(\"media\")) && !resolvable(logUri.get(\"endpoint\"))) {\n    throw new IllegalArgumentException(\"live log endpoint unresolvable\");\n}","typeGuard":null,"tryCatchPattern":"catch (ClusterException e) {\n    if (e.getMessage().startsWith(\"failed to add live log\")) {\n        // inspect driver error log; fix channel URI/interface; restart\n    }\n}","preventionTips":["Validate log channel URIs at startup","Avoid port conflicts across members","Verify network interfaces named in channel URIs exist"],"tags":["network","udp-channel","live-log"],"backgroundTag":"network-request-failed","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"}