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
- Remove cassandra.skip_wait_for_gossip_to_settle for normal startups; let gossip settle naturally.
- If used intentionally during recovery, verify ring stability after startup with nodetool status before serving traffic.
- Reduce cluster churn (avoid restarting many nodes simultaneously) so gossip settles quickly.
- 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
- Use skip_wait_for_gossip_to_settle only for controlled recovery, then remove it.
- After forced startup, always verify nodetool status before client traffic.
- Avoid mass concurrent restarts so gossip settles quickly by default.
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
- Starting gossip by operator request
- Configured ${configName} "${intf}" could not be found
- Configured ${configName} "${intf}" was found, but had no add
- Missing required directive CommitLogSync
- memtable_cleanup_threshold must be >= 0.01, but was ${conf.m
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/c2e6140ca173a154.
Report an issue: GitHub.