apache/cassandra · warning

ClusterName mismatch from

Error message

ClusterName mismatch from {} {}!={}

What it means

A logger.warn (not an exception): GossipDigestSynVerbHandler.doVerb silently drops an incoming gossip SYN message when the sender's cluster name (clusterId carried in GossipDigestSyn) does not match the local DatabaseDescriptor.getClusterName(). This prevents gossip state from ever being exchanged between nodes of different Cassandra clusters.

Solutions

  1. Set cluster_name in the offending node's cassandra.yaml to exactly match the cluster (verify with `nodetool describecluster`).
  2. Restart Cassandra on the misconfigured node so the new cluster name takes effect.
  3. If the node belongs to a different cluster entirely, firewall/separate the networks or remove it from gossip reach.
  4. Check for IP reuse: ensure the old owner of the IP was fully decommissioned before reusing the address.

Example fix

// before: cassandra.yaml (joining node)
cluster_name: 'Test Cluster'
// after
cluster_name: 'Production Cluster'  // must match existing nodes exactly
Defensive patterns

Strategy: validation

Validate before calling

// on the joining node, before start
cqlsh -e "describe cluster"  # or read cassandra.yaml
assert config.get("cluster_name").equals(expectedClusterName) : "Fix cluster_name in cassandra.yaml";

Prevention

When it happens

Trigger: A node with a mismatched cluster_name in cassandra.yaml sends a gossip SYN to this node; typically during cross-cluster IP reuse, stale node rejoining, or misconfigured cassandra.yaml when expanding/rebuilding a cluster.

Common situations: Bringing up a new node with the default cluster name ('Test Cluster') against an existing cluster with a custom name; re-adding a node from a decommissioned cluster with recycled IPs; Docker/Vagrant setups with copied configs.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/5f0193a931489f54. Report an issue: GitHub.

Appendix: source

Thrown at src/java/org/apache/cassandra/gms/GossipDigestSynVerbHandler.java:57

    public static final GossipDigestSynVerbHandler instance = new GossipDigestSynVerbHandler();

    private static final Logger logger = LoggerFactory.getLogger(GossipDigestSynVerbHandler.class);

    public void doVerb(Message<GossipDigestSyn> message)
    {
        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

View on GitHub (pinned to 88fd0f6a0e)