apache/cassandra · warning

Got no response for shadow round

Error message

Got no response for shadow round

What it means

NewGossiper's shadow round asks existing cluster members for gossip state to bootstrap initial cluster metadata. If the shadow round request times out or fails repeatedly and maxTries is exhausted, it warns for each failed attempt and then falls back to constructing metadata from system tables (local disk), marking the handler done so live gossip proceeds.

Source

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

            return GossipHelper.storedEpstate();

        ShadowRoundHandler shadowRoundHandler = new ShadowRoundHandler(peers);
        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;

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Verify seeds are reachable: check cassandra.yaml seeds, ping/telnet seed host on the gossip port (default 7000).
  2. Fix firewall/security-group rules to allow gossip traffic from the new node to seeds.
  3. Retry startup once the cluster/seeds are up; the fallback to system tables may leave stale ring data.
  4. If this is a fresh first node, ensure it is its own seed so no shadow round against others is needed.

Example fix

// before
telnet 10.0.0.1 7000   # connection refused — seed down/firewalled
// after
# fix security group to allow 7000/tcp, correct seeds in cassandra.yaml, restart
seed_provider:
  - seeds: "10.0.0.1,10.0.0.2"
Defensive patterns

Strategy: retry

Validate before calling

// before starting the node
for (String seed : seeds) { Socket s = new Socket(); try { s.connect(new InetSocketAddress(seed, 7000), 3000); s.close(); } catch (IOException e) { throw new IllegalStateException("Seed unreachable: " + seed); } }

Try / catch

try { shadowRound.doShadowRound().get(timeoutMs, MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { /* retry up to maxTries, then fall back to system tables */ }

Prevention

When it happens

Trigger: doShadowRound's future does not complete within the timeout for maxTries consecutive attempts (InterruptedException/ExecutionException/TimeoutException), typically when no configured seeds are reachable.

Common situations: Bootstrapping a node when all seed hosts are down or firewalled (gossip port 7000 blocked); wrong seed list in cassandra.yaml; starting a node while the entire cluster is down; network partition during startup.

Understand the failure class

Background: Request timed out: what client-side request timeouts mean across libraries (Request timed out, TIMED_OUT, APITimeoutError) — this error's family across 39 libraries.

Related errors


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