{"record":{"id":"93ac455e296155e3","repo":"apache/cassandra","slug":"partitioner-mismatch-from","errorCode":null,"errorMessage":"Partitioner mismatch from {} {}!={}","messagePattern":"Partitioner mismatch from (.+?) (.+?)!=(.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java","lineNumber":63,"sourceCode":"        InetAddressAndPort from = message.from();\n        logger.trace(\"Received a GossipDigestSynMessage from {}\", from);\n        if (!Gossiper.instance.isEnabled() && !NewGossiper.instance.isInShadowRound())\n        {\n            logger.trace(\"Ignoring GossipDigestSynMessage because gossip is disabled\");\n            return;\n        }\n\n        GossipDigestSyn gDigestMessage = message.payload;\n        /* If the message is from a different cluster throw it away. */\n        if (!gDigestMessage.clusterId.equals(DatabaseDescriptor.getClusterName()))\n        {\n            logger.warn(\"ClusterName mismatch from {} {}!={}\", from, gDigestMessage.clusterId, DatabaseDescriptor.getClusterName());\n            return;\n        }\n\n        if (gDigestMessage.partioner != null && !gDigestMessage.partioner.equals(DatabaseDescriptor.getPartitionerName()))\n        {\n            logger.warn(\"Partitioner mismatch from {} {}!={}\", from, gDigestMessage.partioner, DatabaseDescriptor.getPartitionerName());\n            return;\n        }\n\n        if (gDigestMessage.metadataId != ClusterMetadata.EMPTY_METADATA_IDENTIFIER\n            && gDigestMessage.metadataId != ClusterMetadata.current().metadataIdentifier)\n        {\n            logger.warn(\"Cluster metadata identifier mismatch from {} {}!={}\", from, gDigestMessage.metadataId, ClusterMetadata.current().metadataIdentifier);\n            return;\n        }\n\n        List<GossipDigest> gDigestList = gDigestMessage.getGossipDigests();\n        // if the syn comes from a peer performing a shadow round and this node is\n        // also currently in a shadow round, send back a minimal ack. This node must\n        // be in the sender's seed list and doing this allows the sender to\n        // differentiate between seeds from which it is partitioned and those which\n        // are in their shadow round\n        if (!Gossiper.instance.isEnabled() && NewGossiper.instance.isInShadowRound())\n        {","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java#L45-L81","documentation":"A logger.warn (not an exception): GossipDigestSynVerbHandler.doVerb drops the gossip SYN when the sender's partitioner name does not match the local partitioner (DatabaseDescriptor.getPartitionerName()). Mixing partitioners across a cluster would corrupt ring/token arithmetic, so gossip between such nodes is refused before any state is exchanged.","triggerScenarios":"A node whose cassandra.yaml partitioner (e.g., Murmur3Partitioner vs RandomPartitioner/old ByteOrderedPartitioner) differs from the recipient sends a gossip SYN. Typically seen when restoring old configs (pre-1.2 clusters used RandomPartitioner) or hand-edited configs on new nodes.","commonSituations":"Restoring data/configs from a very old Cassandra version into a modern cluster; copy-pasting cassandra.yaml from legacy nodes; provisioning tools templating the wrong partitioner for some nodes.","solutions":["Set partitioner in cassandra.yaml on the offending node to match the cluster (almost always org.apache.cassandra.dht.Murmur3Partitioner).","Confirm the cluster's partitioner via `nodetool describecluster` or system.local, then align the node and restart.","Never attempt to change partitioner on an existing node with data — wipe and re-bootstrap with the correct partitioner instead.","Fix provisioning/config templates so all nodes get the cluster's standard partitioner."],"exampleFix":"// before: cassandra.yaml (restored legacy config)\npartitioner: org.apache.cassandra.dht.RandomPartitioner\n// after\npartitioner: org.apache.cassandra.dht.Murmur3Partitioner","handlingStrategy":"validation","validationCode":"// provisioning check before node start\nString expected = \"org.apache.cassandra.dht.Murmur3Partitioner\";\nassert config.get(\"partitioner\").equals(expected) : \"partitioner mismatch with cluster\";","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Standardize on Murmur3Partitioner in all config templates.","Diff restored/legacy cassandra.yaml files against current cluster config before use.","Wipe-and-rebootstrap rather than editing partitioner on a data-bearing node.","Verify with `nodetool describecluster` that all nodes report the same partitioner."],"tags":["gossip","partitioner","configuration"],"backgroundTag":"cluster-name-mismatch","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}