apache/cassandra · warning
Partitioner mismatch from
Error message
Partitioner mismatch from {} {}!={} What it means
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.
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.
Example fix
// before: cassandra.yaml (restored legacy config) partitioner: org.apache.cassandra.dht.RandomPartitioner // after partitioner: org.apache.cassandra.dht.Murmur3Partitioner
Defensive patterns
Strategy: validation
Validate before calling
// provisioning check before node start
String expected = "org.apache.cassandra.dht.Murmur3Partitioner";
assert config.get("partitioner").equals(expected) : "partitioner mismatch with cluster"; Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- broadcast_address cannot be a wildcard address (
- ClusterName mismatch from
- Error while getting seed node list
- Invalid partitioner class
- Missing directive: partitioner
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/93ac455e296155e3.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java:63
InetAddressAndPort from = message.from();
logger.trace("Received a GossipDigestSynMessage from {}", from);
if (!Gossiper.instance.isEnabled() && !NewGossiper.instance.isInShadowRound())
{
logger.trace("Ignoring GossipDigestSynMessage because gossip is disabled");
return;
}
GossipDigestSyn gDigestMessage = message.payload;
/* If the message is from a different cluster throw it away. */
if (!gDigestMessage.clusterId.equals(DatabaseDescriptor.getClusterName()))
{
logger.warn("ClusterName mismatch from {} {}!={}", from, gDigestMessage.clusterId, DatabaseDescriptor.getClusterName());
return;
}
if (gDigestMessage.partioner != null && !gDigestMessage.partioner.equals(DatabaseDescriptor.getPartitionerName()))
{
logger.warn("Partitioner mismatch from {} {}!={}", from, gDigestMessage.partioner, DatabaseDescriptor.getPartitionerName());
return;
}
if (gDigestMessage.metadataId != ClusterMetadata.EMPTY_METADATA_IDENTIFIER
&& gDigestMessage.metadataId != ClusterMetadata.current().metadataIdentifier)
{
logger.warn("Cluster metadata identifier mismatch from {} {}!={}", from, gDigestMessage.metadataId, ClusterMetadata.current().metadataIdentifier);
return;
}
List<GossipDigest> gDigestList = gDigestMessage.getGossipDigests();
// if the syn comes from a peer performing a shadow round and this node is
// also currently in a shadow round, send back a minimal ack. This node must
// be in the sender's seed list and doing this allows the sender to
// differentiate between seeds from which it is partitioned and those which
// are in their shadow round
if (!Gossiper.instance.isEnabled() && NewGossiper.instance.isInShadowRound())
{View on GitHub (pinned to 88fd0f6a0e)