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

  1. Set partitioner in cassandra.yaml on the offending node to match the cluster (almost always org.apache.cassandra.dht.Murmur3Partitioner).
  2. Confirm the cluster's partitioner via `nodetool describecluster` or system.local, then align the node and restart.
  3. Never attempt to change partitioner on an existing node with data — wipe and re-bootstrap with the correct partitioner instead.
  4. 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

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


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)