{"record":{"id":"84b54f7e28a4d33c","repo":"aeron-io/aeron","slug":"expected-schemaid-messageheaderdecoder-schema-id-actual-84b54f","errorCode":null,"errorMessage":"expected schemaId=<MessageHeaderDecoder.SCHEMA_ID>, actual=<schemaId>","messagePattern":"expected schemaId=<MessageHeaderDecoder\\.SCHEMA_ID>, actual=<schemaId>","errorType":"exception","errorClass":"ClusterException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/client/ControlledEgressAdapter.java","lineNumber":122,"sourceCode":"    {\n        messageHeaderDecoder.wrap(buffer, offset);\n\n        final int templateId = messageHeaderDecoder.templateId();\n        final int schemaId = messageHeaderDecoder.schemaId();\n        if (schemaId != MessageHeaderDecoder.SCHEMA_ID)\n        {\n            if (listenerExtension != null)\n            {\n                return listenerExtension.onExtensionMessage(\n                    messageHeaderDecoder.blockLength(),\n                    templateId,\n                    schemaId,\n                    messageHeaderDecoder.version(),\n                    buffer,\n                    offset + MessageHeaderDecoder.ENCODED_LENGTH,\n                    length - MessageHeaderDecoder.ENCODED_LENGTH);\n            }\n            throw new ClusterException(\"expected schemaId=\" +\n                MessageHeaderDecoder.SCHEMA_ID + \", actual=\" + schemaId);\n        }\n\n        switch (templateId)\n        {\n            case SessionMessageHeaderDecoder.TEMPLATE_ID:\n            {\n                sessionMessageHeaderDecoder.wrap(\n                    buffer,\n                    offset + MessageHeaderDecoder.ENCODED_LENGTH,\n                    messageHeaderDecoder.blockLength(),\n                    messageHeaderDecoder.version());\n\n                final long sessionId = sessionMessageHeaderDecoder.clusterSessionId();\n                if (sessionId == clusterSessionId)\n                {\n                    return listener.onMessage(\n                        sessionId,","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/client/ControlledEgressAdapter.java#L104-L140","documentation":"ControlledEgressAdapter.onFragment decoded the SBE MessageHeader of an egress fragment and found a schemaId that does not match the cluster egress schema (MessageHeaderDecoder.SCHEMA_ID). The library throws ClusterException because it cannot safely decode the message body with the compiled codecs.","triggerScenarios":"Feeding the adapter a fragment from a stream carrying a different SBE schema (wrong stream/subscription wiring); cluster and client built against different aeron-cluster versions with mismatched schema IDs.","commonSituations":"Client pointing at the wrong image/publication; mixed Aeron versions between cluster and client after an upgrade; custom messages published onto the egress channel.","solutions":["Ensure client and cluster use the same aeron-cluster version so SBE schema IDs match","Verify the subscription is bound to the cluster's egress channel/stream, not an unrelated stream","Regenerate SBE codecs from the matching aeron-cluster-schema.xml if schemas were customized","Log the actual schemaId to identify which schema produced the fragment"],"exampleFix":"// before: mixed versions\n// client: aeron-cluster 1.40.0, cluster: 1.44.0\n// after: align versions\n// client and cluster both on aeron-cluster 1.44.0","handlingStrategy":"validation","validationCode":"// Check header schemaId before offering fragment to the adapter\nMessageHeaderDecoder h = new MessageHeaderDecoder().wrap(buffer, offset);\nif (h.schemaId() != MessageHeaderDecoder.SCHEMA_ID) {\n    // skip/log instead of calling adapter\n}","typeGuard":null,"tryCatchPattern":"try {\n    adapter.onFragment(buffer, offset, length, header);\n} catch (ClusterException ex) {\n    // log schema mismatch, investigate version skew\n}","preventionTips":["Pin identical aeron-cluster versions on client and cluster","Never publish non-cluster messages on the egress stream","Verify streamId/channel wiring in tests"],"tags":["aeron","sbe","schema","cluster-client"],"backgroundTag":"schema-validation-failed","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"}