apache/cassandra · critical · RuntimeException

Stop marker is older than start marker ({stopMarker}<{startM

Error message

Stop marker is older than start marker ({stopMarker}<{startMarker}) , so cannot assume we have a complete log of our votes in any consensus groups. Exiting.

What it means

Thrown by AccordService.localStartup() when the Accord journal's persisted stop marker is older than its start marker, meaning the journal of consensus-group votes appears incomplete. Because the journal cannot be trusted, the process exits (per accord.journal.stopMarkerFailurePolicy=EXIT) with a RuntimeException.

Source

Thrown at src/java/org/apache/cassandra/service/accord/AccordService.java:549

    }

    @Override
    public synchronized void localStartup()
    {
        if (state != State.INIT)
            return;

        boolean rebootstrap = false;
        {
            long startMarker = ReplayMarkers.readStartMarker();
            long stopMarker = ReplayMarkers.readStopMarker();
            if (stopMarker < startMarker)
            {
                switch (getAccord().journal.stopMarkerFailurePolicy)
                {
                    default: throw new UnhandledEnum(getAccord().journal.stopMarkerFailurePolicy);
                    case EXIT:
                        throw new RuntimeException("Stop marker is older than start marker (" + stopMarker + '<' + startMarker + ") , so cannot assume we have a complete log of our votes in any consensus groups. Exiting.");

                    case ALLOW_UNSAFE_STARTUP:
                    case UNSAFE_STARTUP:
                        logger.warn("Stop marker is older than start marker ({}<{}), so cannot assume we have a complete log of our votes in any consensus groups. Continuing to startup as configured.", stopMarker, startMarker);
                        break;

                    case REBOOTSTRAP:
                        logger.info("Stop marker is older than start marker ({}<{}). Rebootstrapping.", stopMarker, startMarker);
                        rebootstrap = true;
                }
            }
        }

        logger.info("Starting background compaction of system_accord");
        // We control this ourselves to ensure it starts when we need it, as especially commands_for_key
        // can accumulate a lot of state and degrade replay performance significantly
        scheduler.recurring(() -> {
            CompactionManager.instance.submitBackground(AccordColumnFamilyStores.commandsForKey);

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Treat as data-integrity alarm: stop and verify the node's data/journal files; restore from a known-good backup.
  2. If corruption is confirmed and acceptable, follow the recovery runbook (e.g. journal replay=RESET) after capturing diagnostics.
  3. If explicitly accepted as an unsafe recovery, set accord.journal.stopMarkerFailurePolicy to ALLOW_UNSAFE_STARTUP/UNSAFE_STARTUP and restart, understanding vote-log completeness is not guaranteed.
  4. Check underlying storage (SMART, filesystem errors) before returning the node to service.

Example fix

// before
-Dcassandra.accord.journal.stopMarkerFailurePolicy=EXIT
// after (only when unsafe startup is accepted)
-Dcassandra.accord.journal.stopMarkerFailurePolicy=ALLOW_UNSAFE_STARTUP
Defensive patterns

Strategy: fallback

Validate before calling

// before startup, if possible
assertJournalMarkersConsistent(dataDir); // stopMarker >= startMarker
assertFileSystemHealthy(dataDir);

Try / catch

catch (RuntimeException e) {
    if (e.getMessage().startsWith("Stop marker is older than start marker")) {
        captureDiagnostics(dataDir);   // never delete journal blindly
        followJournalRecoveryRunbook();
    } else throw e;
}

Prevention

When it happens

Trigger: Node startup where journal markers read from disk satisfy stopMarker < startMarker, and the stopMarkerFailurePolicy is EXIT (the default fail-closed behavior).

Common situations: Corrupted or partially truncated Accord journal (disk failure, incomplete flush), restoring a node from an inconsistent/incomplete backup, or manual tampering with journal data files.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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