{"record":{"id":"334997dafc0d9d94","repo":"apache/cassandra","slug":"first-name-is-last-name-info","errorCode":null,"errorMessage":"First name is > Last name:{info=","messagePattern":"First name is > Last name:\\{info=","errorType":"exception","errorClass":"CorruptSSTableException","httpStatus":null,"severity":"critical","filePath":"src/java/org/apache/cassandra/io/sstable/format/big/BigTableVerifier.java","lineNumber":163,"sourceCode":"\n                        long dataFileOffset = partitionBase + indexInfo.offset;\n                        if (expectedNextOffset != 0)\n                        {\n                            if (expectedNextOffset != indexInfo.offset)\n                                throw new CorruptSSTableException(new IOException(\"Row entry indexInfo offset + width should match next block offset:\" + indexInfo.offset + \" expected: \" + expectedNextOffset), it.toString());\n                        }\n                        expectedNextOffset = indexInfo.offset + indexInfo.width;\n                        dataFile.seek(dataFileOffset);\n\n                        Unfiltered unfiltered = UnfilteredSerializer.serializer.deserialize(dataFile,\n                                                                                            sstable.header,\n                                                                                            deserializationHelper,\n                                                                                            BTreeRow.sortedBuilder());\n                        if (!Objects.equals(indexInfo.firstName, unfiltered.clustering()))\n                            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());\n\n                        if (comparator.compare(indexInfo.firstName, indexInfo.lastName) > 0)\n                            throw new CorruptSSTableException(new IOException(\"First name is > Last name:{info=\" + indexInfo.toString(sstable.metadata()) + \"}\"), it.toString());\n\n                    }\n                }\n            }\n            // The verifier checks that the partition key/position in the index and data match, here we waant to verify\n            // the entries clustering keys match.\n            while (it.advance()); // no-op, just check if index is readable\n\n            if (!Objects.equals(key, sstable.getLast().getKey()))\n                throw new CorruptSSTableException(new IOException(\"Last partition does not match index\"), it.toString());\n        }\n        if (options.extendedVerification)\n            dataFile.reset();\n    }\n\n    private void logDuplicates(DecoratedKey key, Row first, int duplicateRows, long minTimestamp, long maxTimestamp)\n    {\n        String keyString = sstable.metadata().partitionKeyType.getString(key.getKey());","sourceCodeStart":145,"sourceCodeEnd":181,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/io/sstable/format/big/BigTableVerifier.java#L145-L181","documentation":"Thrown during extended verification when the indexInfo's firstName (first clustering) is greater than its lastName (last clustering) according to the table's clustering comparator. Since first should be <= last, this indicates a corrupt row-index entry.","triggerScenarios":"`nodetool verify` (extendedVerification) reads an indexInfo block whose firstName/lastName fields are reversed or corrupted, e.g. after bit rot or a truncated write.","commonSituations":"Hardware/disk corruption; interrupted flush; corrupted SSTable transfer between nodes.","solutions":["Scrub or remove the affected SSTable and repair the range from replicas","Restore from snapshot/backup","Check storage subsystem for silent corruption (enable checksums/bitrot detection)"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { verifier.verify(); }\ncatch (CorruptSSTableException e) { logger.error(\"Corrupt indexInfo in {}\", e.getFilename()); scheduleScrub(descriptor); }","preventionTips":["Use ECC/storage with integrity checking","Verify SSTables post-restore and post-crash","Keep replicas healthy with scheduled repair"],"tags":["sstable","corruption","verifier","row-index"],"backgroundTag":"checksum-mismatch","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}