apache/cassandra · critical · RuntimeException
Could not perform startup sequence and join cluster
Error message
Could not perform startup sequence and join cluster
What it means
initServer performs the startup sequence (prepareToJoin, local setup, joining the ring) which may perform disk/network I/O. If an IOException escapes that sequence, it is wrapped in a RuntimeException with this message so the node fails to start rather than half-joining the ring.
Solutions
- Inspect the cause (getCause) — the underlying IOException names the real failure
- Check data/commitlog/hints directory permissions and disk space
- Fix or restore corrupt system keyspace files, then restart
- Run nodetool/filesystem checks on the volumes before restarting
Defensive patterns
Strategy: try-catch
Validate before calling
// pre-start checks assert readable(dataDir) && readable(commitlogDir) && freeDiskAbove(threshold);
Try / catch
try { ss.initServer(); } catch (RuntimeException e) { log.error("startup failed: {}", e.getCause(), e); throw e; } Prevention
- Check disk space and directory permissions before node start
- Fix root-cause IOExceptions surfaced by getCause
- Monitor filesystems on data/commitlog volumes
When it happens
Trigger: An IOException thrown during initServer's startup steps — e.g. failures touching system tables, SSTable/directory I/O during startup tasks, or schema/disk errors while preparing to join.
Common situations: Unreadable or corrupt data directories; disk full; permission problems on commitlog/data paths; filesystem errors during node bring-up.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/fde53b25e9ed2f32.
Report an issue: GitHub.
Appendix: source
Thrown at src/java/org/apache/cassandra/service/StorageService.java:879
if (CassandraRelevantProperties.SYNC_SYSTEM_PEERS_TABLES_AT_STARTUP.getBoolean())
SystemPeersValidator.validateAndRepair(ClusterMetadata.current());
try
{
if (joinRing)
joinRing();
else
{
ClusterMetadata metadata = ClusterMetadata.current();
if (metadata.myNodeState() == JOINED)
BootstrapAndReplace.gossipStateToHibernate(metadata, metadata.myNodeId());
logger.info("Not joining ring as requested. Use JMX (StorageService->joinRing()) to initiate ring joining");
}
}
catch (IOException e)
{
throw new RuntimeException("Could not perform startup sequence and join cluster", e);
}
maybeInitializeServices();
completeInitialization();
}
private void completeInitialization()
{
initialized = true;
}
public static boolean cancelInProgressSequences(NodeId sequenceOwner)
{
return ClusterMetadataService.instance()
.commit(new CancelInProgressSequence(sequenceOwner),
metadata -> true,
(code, message) -> {
logger.warn(String.format("Could not cancel in-progress sequence: %s", message));View on GitHub (pinned to 88fd0f6a0e)