apache/cassandra · critical · CorruptSSTableException
Row entry indexInfo offset + width should match next block o
Error message
Row entry indexInfo offset + width should match next block offset:
What it means
Thrown during extended verification when the offset of an indexInfo block in the partition's row index does not equal the expected next offset derived from the previous block's offset+width. The serialized index blocks are non-contiguous or out of order, meaning the row index is corrupt.
Source
Thrown at src/java/org/apache/cassandra/io/sstable/format/big/BigTableVerifier.java:150
RowIndexEntry rowIndexEntry = it.rowIndexEntry();
if (outputHandler.isDebugEnabled()) outputHandler.debug("rowIndexEntry %s", rowIndexEntry.toString());
long partitionBase = it.dataPosition();
int blockCount = rowIndexEntry.blockCount();
if (options.extendedVerification && blockCount > 0)
{
long expectedNextOffset = 0;
RowIndexEntry.IndexInfoRetriever indexInfoRetriever = rowIndexEntry.openWithIndex(it.indexFile());
for (int blockIndex = 0; blockIndex < blockCount; blockIndex++)
{
IndexInfo indexInfo = indexInfoRetriever.columnsIndex(blockIndex);
if (outputHandler.isDebugEnabled()) outputHandler.debug("indexInfo %s", indexInfo.toString(sstable.metadata()));
long dataFileOffset = partitionBase + indexInfo.offset;
if (expectedNextOffset != 0)
{
if (expectedNextOffset != indexInfo.offset)
throw new CorruptSSTableException(new IOException("Row entry indexInfo offset + width should match next block offset:" + indexInfo.offset + " expected: " + expectedNextOffset), it.toString());
}
expectedNextOffset = indexInfo.offset + indexInfo.width;
dataFile.seek(dataFileOffset);
Unfiltered unfiltered = UnfilteredSerializer.serializer.deserialize(dataFile,
sstable.header,
deserializationHelper,
BTreeRow.sortedBuilder());
if (!Objects.equals(indexInfo.firstName, unfiltered.clustering()))
throw new CorruptSSTableException(new IOException("Unfiltered clustering in index does not match data:{info=" + indexInfo.toString(sstable.metadata()) + ", row:" + unfiltered.clustering().toString(sstable.metadata()) + "}"), it.toString());
if (comparator.compare(indexInfo.firstName, indexInfo.lastName) > 0)
throw new CorruptSSTableException(new IOException("First name is > Last name:{info=" + indexInfo.toString(sstable.metadata()) + "}"), it.toString());
}
}
}
// The verifier checks that the partition key/position in the index and data match, here we waant to verifyView on GitHub (pinned to 88fd0f6a0e)
Solutions
- Scrub or delete the affected SSTable and repair the range from other replicas
- Restore from snapshot/backup
- Run `nodetool verify` across the node to identify all affected SSTables
Defensive patterns
Strategy: validation
Try / catch
try { verifier.verify(); }
catch (CorruptSSTableException e) { logger.error("Row index corrupt in {}", e.getFilename()); scheduleScrub(descriptor); } Prevention
- Monitor and cap partition sizes to keep row indexes small
- Use checksummed/storage with data integrity features
- Verify SSTables after restores
- Restore from snapshots instead of trusting questionable files
When it happens
Trigger: `nodetool verify` with extendedVerification on an SSTable whose RowIndexEntry indexInfo blocks have gaps or overlaps (corrupted or truncated index data inside the Summary/Data components).
Common situations: Crash or disk error while writing large partitions with many index blocks; bit rot on disk; corrupted SSTable copied between nodes.
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
- First name is > Last name:{info=
- First partition does not match index
- Unfiltered clustering in index does not match data:{info=
- Last partition does not match index
- Corrupt flags value for clustering prefix (isStatic flag set
AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10).
Data as JSON: /api/errors/fbc393aeb2d514c5.
Report an issue: GitHub.