apache/cassandra · warning

invalid, recoverable CRC mismatch detected while reading a…

Error message

{} invalid, recoverable CRC mismatch detected while reading a large message

What it means

Warns that a CRC mismatch occurred on a subsequent frame of a large (multi-frame) message. Because prior frames were already accepted, the handler treats this frame as recoverable: the message is dropped and the connection continues, but the large message never completes.

Solutions

  1. Diagnose physical/network path between the nodes (errors counters, packet drops).
  2. Retry the operation that triggered the large message (it will be re-sent on a healthy path).
  3. Check for MTU mismatches or fragmentation issues between the hosts.
  4. Monitor corruptFramesRecovered metrics and correlate with specific node pairs to localize bad hardware.
  5. Reduce large-message frequency (e.g. avoid giant batches/schema storms) while hardware is fixed.
Defensive patterns

Strategy: retry

Try / catch

// Detected via logs/metrics only:
// grep 'invalid, recoverable CRC mismatch' /var/log/cassandra/system.log
// Then re-run the operation that sent the large message.

Prevention

When it happens

Trigger: processCorruptFrame encounters a CRC mismatch on any frame after the first frame of a large message being streamed.

Common situations: Same root causes as frame corruption generally: flaky network hardware, bit flips, unstable links between datacenters; more likely for large messages (schema migrations, repairs streaming large payloads) since they occupy the wire longer.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at src/java/org/apache/cassandra/net/InboundMessageHandler.java:272

        }
        else if (frame.isSelfContained)
        {
            receivedBytes += frame.frameSize;
            corruptFramesRecovered++;
            noSpamLogger.warn("{} invalid, recoverable CRC mismatch detected while reading messages (corrupted self-contained frame)", id());
        }
        else if (null == largeMessage) // first frame of a large message
        {
            receivedBytes += frame.frameSize;
            corruptFramesUnrecovered++;
            noSpamLogger.error("{} invalid, unrecoverable CRC mismatch detected while reading messages (corrupted first frame of a large message)", id());
            throw new Crc.InvalidCrc(frame.readCRC, frame.computedCRC);
        }
        else // subsequent frame of a large message
        {
            processSubsequentFrameOfLargeMessage(frame);
            corruptFramesRecovered++;
            noSpamLogger.warn("{} invalid, recoverable CRC mismatch detected while reading a large message", id());
        }
    }

    String id(boolean includeReal)
    {
        if (!includeReal)
            return id();

        return SocketFactory.channelId(peer, (InetSocketAddress) channel.remoteAddress(),
                                       self, (InetSocketAddress) channel.localAddress(),
                                       type, channel.id().asShortText());
    }

    protected String id()
    {
        return SocketFactory.channelId(peer, self, type, channel.id().asShortText());
    }

View on GitHub (pinned to 88fd0f6a0e)