apache/cassandra · warning

Gossip not settled but startup forced by cassandra.skip_wait

Error message

Gossip not settled but startup forced by cassandra.skip_wait_for_gossip_to_settle. Gossip total polls: {}

What it means

Before declaring itself ready, Gossiper polls the cluster until gossip 'settles' (endpoint count stable across required successful polls). If cassandra.skip_wait_for_gossip_to_settle forces startup after a threshold of polls while gossip is still unsettled, it warns that startup proceeded against the operator's explicit override.

Source

Thrown at src/java/org/apache/cassandra/gms/Gossiper.java:2090

        while (numOkay < GOSSIP_SETTLE_POLL_SUCCESSES_REQUIRED)
        {
            Uninterruptibles.sleepUninterruptibly(GOSSIP_SETTLE_POLL_INTERVAL_MS, TimeUnit.MILLISECONDS);
            int currentSize = Gossiper.instance.getEndpointCount();
            totalPolls++;
            if (currentSize == epSize)
            {
                logger.debug("Gossip looks settled. {}", Gossiper.instance.endpointStateMap);
                numOkay++;
            }
            else
            {
                logger.info("Gossip not settled after {} polls.", totalPolls);
                numOkay = 0;
            }
            epSize = currentSize;
            if (forceAfter > 0 && totalPolls > forceAfter)
            {
                logger.warn("Gossip not settled but startup forced by cassandra.skip_wait_for_gossip_to_settle. Gossip total polls: {}",
                            totalPolls);
                break;
            }
        }
        if (totalPolls > GOSSIP_SETTLE_POLL_SUCCESSES_REQUIRED)
            logger.info("Gossip settled after {} extra polls; proceeding", totalPolls - GOSSIP_SETTLE_POLL_SUCCESSES_REQUIRED);
        else
            logger.info("No gossip backlog; proceeding");
    }

    /**
     * Blockingly wait for all live nodes to agree on the current schema version.
     *
     * @param maxWait maximum time to wait for schema agreement
     * @param unit TimeUnit of maxWait
     * @return true if agreement was reached, false if not
     */
    // TODO: (TM/alexp): we do not need to wait for schema convergence for the purpose of view building;

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Remove cassandra.skip_wait_for_gossip_to_settle for normal startups; let gossip settle naturally.
  2. If used intentionally during recovery, verify ring stability after startup with nodetool status before serving traffic.
  3. Reduce cluster churn (avoid restarting many nodes simultaneously) so gossip settles quickly.
  4. Set a larger forceAfter value (e.g., 30) rather than 0 to give gossip a bounded chance to settle.

Example fix

// before
JVM_OPTS="$JVM_OPTS -Dcassandra.skip_wait_for_gossip_to_settle=0"
// after
# remove the property entirely, or allow bounded forcing:
JVM_OPTS="$JVM_OPTS -Dcassandra.skip_wait_for_gossip_to_settle=30"
Defensive patterns

Strategy: fallback

Validate before calling

// start without the skip flag unless recovering
if (System.getProperty("cassandra.skip_wait_for_gossip_to_settle") != null && !recoveryMode) logger.warn("skip_wait_for_gossip_to_settle set outside recovery");

Prevention

When it happens

Trigger: Waiting for gossip settlement with forceAfter configured; totalPolls exceeds forceAfter while the endpoint set is still changing, so the loop breaks and startup continues.

Common situations: Setting -Dcassandra.skip_wait_for_gossip_to_settle=0/30 to speed up restarts of large clusters; doing rolling restarts with heavy membership churn; emergency restarts during incident recovery.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


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