apache/cassandra · warning

Not able to construct initial cluster metadata from gossip,

Error message

Not able to construct initial cluster metadata from gossip, using system tables instead

What it means

During a node's bootstrap/startup, Cassandra attempts a gossip 'shadow round' to learn cluster metadata (endpoints, states) from live peers before loading persisted state. If the shadow round gets no usable responses after maxTries, the node logs this warning and falls back to reading cluster metadata from the local system tables. It is a warning-level fallback, not a hard failure, but it means the node could not confirm cluster state via gossip.

Source

Thrown at src/java/org/apache/cassandra/gms/NewGossiper.java:91

        handler = shadowRoundHandler;

        int tries = 0;
        int maxTries = CassandraRelevantProperties.TCM_SHADOW_ROUND_MAX_ATTEMPTS.getInt();
        long timeout = CassandraRelevantProperties.TCM_SHADOW_ROUND_TIMEOUT.getLong();
        while (true)
        {
            try
            {
                return shadowRoundHandler.doShadowRound().get(timeout, TimeUnit.MILLISECONDS);
            }
            catch (InterruptedException | ExecutionException | TimeoutException e)
            {
                if (++tries >= maxTries)
                    break;
                logger.warn("Got no response for shadow round");
            }
        }
        logger.warn("Not able to construct initial cluster metadata from gossip, using system tables instead");
        // Mark done here so that future gossip messages don't get routed to the shadow round handler (see
        // GossipDigestSynVerbHandler & GossipDigestAckVerbHandler)
        handler.markDone();
        return GossipHelper.storedEpstate();
    }

    public boolean isInShadowRound()
    {
        ShadowRoundHandler srh = handler;
        return srh != null && !srh.isDone();
    }

    void onAck(InetAddressAndPort from, Map<InetAddressAndPort, EndpointState> epStateMap)
    {
        ShadowRoundHandler srh = handler;
        if (srh != null && !srh.isDone())
            srh.onAck(from, epStateMap);
    }

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Verify seeds are correct and at least one seed node is reachable before starting this node
  2. Check network/firewall rules so the gossip port is open between nodes
  3. If it is a full-cluster cold start, start seed nodes first
  4. If single-node/dev, the fallback to system tables is acceptable and can be ignored

Example fix

// before: starting node with unreachable seed
cluster_name: 'MyCluster'
seeds: '10.0.0.99:7000'  // host down
// after
seeds: '10.0.0.1:7000,10.0.0.2:7000'  // live, reachable seeds
Defensive patterns

Strategy: fallback

Validate before calling

// before startup, verify at least one seed is reachable
for (String seed : seeds) {
  try (Socket s = new Socket()) {
    s.connect(new InetSocketAddress(host(seed), gossipPort(seed)), 3000);
    return true; // at least one seed reachable
  } catch (IOException ignored) {}
}
return false;

Prevention

When it happens

Trigger: Node starts while all other nodes are down or unreachable; firewall/network blocks the gossip port; maxTries exhausted with 'Got no response for shadow round'; single-node cluster starting for the first time.

Common situations: Full cluster cold start where no peer is up yet; misconfigured seeds; network partition or security group blocking port 7000/7001; node restarted in isolation in dev environments.

Understand the failure class

Background: ECONNREFUSED and "connection refused" / "could not connect to server" errors: what they mean and how to fix them — this error's family across 44 libraries.

Related errors


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