pub enum VerifyErrorClass {
Show 17 variants
MissingComponent,
DigestMismatch,
CompressionInfoCorrupt,
ChunkOffsetOutOfBounds,
ChunkDecompressionError,
UnsupportedCompressionFeature,
UncompressedChunkCrcMismatch,
UnexpectedEof,
IndexEntryCorrupt,
StatisticsHeaderCorrupt,
SummaryCorrupt,
BtiRootPointerCorrupt,
BtiTrieCorrupt,
RowScanFailed,
OutOfOrderKeyOrRow,
InvalidLocalDeletionTime,
FilterFalseNegative,
}Expand description
Stable classification of a verification failure.
The variant is the machine-checkable “error code”; the VerifyFinding
carries the human-readable context. These names are part of the verifier
contract — callers (and CI) may match on them, so they must remain stable.
Variants§
MissingComponent
A TOC.txt-listed component (or a structurally-required component) is
absent from disk.
DigestMismatch
Digest.crc32 does not match the computed CRC32 of Data.db.
CompressionInfoCorrupt
CompressionInfo.db failed to parse, named an unsupported algorithm, or
otherwise malformed (#1001).
ChunkOffsetOutOfBounds
A CompressionInfo.db chunk offset points outside Data.db.
ChunkDecompressionError
An inline Data.db chunk CRC32 did not match, or a chunk could not be
read / decompressed (truncation, bit flip).
UnsupportedCompressionFeature
A chunk is compressed with a valid but UNSUPPORTED compression feature —
distinct from truncation/bit-flip (ChunkDecompressionError) and from a
checksum mismatch (DigestMismatch) (issue #1414). The canonical case is
a zstd dictionary-compressed chunk: the frame is well-formed and its
inline chunk CRC is valid, but CQLite ships no-dictionary zstd only, so the
frame cannot be decoded. The reader fails closed with
Error::UnsupportedFormat naming the feature (e.g. the Dictionary_ID);
this class makes the verify report say “unsupported feature”, never
“corruption”.
UncompressedChunkCrcMismatch
An uncompressed BIG Data.db chunk did not match its stored CRC.db
per-chunk CRC32 (issue #1396) — the uncompressed analogue of the compressed
path’s inline chunk-CRC finding (ChunkDecompressionError). Cassandra
writes a CRC.db for every uncompressed BIG SSTable and verifies reads
against it; a bit flip inside an uncompressed chunk is detected here (and,
default-on, on every read). Also covers a truncated / short CRC.db (fewer
per-chunk CRC entries than the Data.db has chunks). Reported via a
VerifyFinding naming the failing chunk and the CRC.db/Data.db
component.
UnexpectedEof
A component was truncated and a required read hit end-of-file.
IndexEntryCorrupt
Index.db (BIG) is structurally corrupt.
StatisticsHeaderCorrupt
Statistics.db header / body is corrupt.
SummaryCorrupt
Summary.db is truncated / unreadable.
BtiRootPointerCorrupt
BTI Partitions.db root pointer / node is corrupt.
BtiTrieCorrupt
BTI Rows.db trie is truncated / corrupt.
RowScanFailed
A full row scan failed for a reason not otherwise classified above.
OutOfOrderKeyOrRow
Partition keys are not in ascending on-disk (Murmur3 token) order, or
clustering rows within a partition are not in ascending clustering order
(issue #1282). Cassandra requires strictly ordered keys/rows; its
sstableverify (SSTableIdentityIterator / Verifier) rejects an
out-of-order key or row as corrupt.
InvalidLocalDeletionTime
A partition-level localDeletionTime is negative (invalid) on the legacy
signed (nb) DeletionTime form (issue #1282). localDeletionTime is
seconds since the Unix epoch; the only non-negative “special” value is the
live sentinel i32::MAX (0x7FFFFFFF). A negative value cannot be a valid
deletion time — Cassandra’s DeletionTime/Verifier treats it as corrupt.
(The unsigned oa/da form legitimately represents far-future times in
[2^31, 2^32), so those are NOT flagged — the on-disk format, not a
heuristic, decides.)
FilterFalseNegative
A parseable BIG Filter.db reports “not present” (might_contain == false)
for a partition key that IS present in the SSTable (its raw key bytes are
enumerated from the authoritative Index.db) — a Bloom-filter FALSE
NEGATIVE (issue #1398). Cassandra’s Filter.db carries no checksum, so a
bit flipped from 1→0 inside the bit array is not detected on load and makes
a live partition silently invisible on the BIG point-lookup path
(partition_lookup.rs returns Ok(None) when the bloom says “miss”). Full
scans and BTI (da) lookups are UNAFFECTED (they never gate on this bloom),
so this is a detection tool Cassandra’s sstableverify lacks — Cassandra
does not verify Filter.db contents and would report the same fixture clean.
Implementations§
Trait Implementations§
Source§impl Clone for VerifyErrorClass
impl Clone for VerifyErrorClass
Source§fn clone(&self) -> VerifyErrorClass
fn clone(&self) -> VerifyErrorClass
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for VerifyErrorClass
Source§impl Debug for VerifyErrorClass
impl Debug for VerifyErrorClass
Source§impl Display for VerifyErrorClass
impl Display for VerifyErrorClass
impl Eq for VerifyErrorClass
Source§impl Hash for VerifyErrorClass
impl Hash for VerifyErrorClass
Source§impl PartialEq for VerifyErrorClass
impl PartialEq for VerifyErrorClass
impl StructuralPartialEq for VerifyErrorClass
Auto Trait Implementations§
impl Freeze for VerifyErrorClass
impl RefUnwindSafe for VerifyErrorClass
impl Send for VerifyErrorClass
impl Sync for VerifyErrorClass
impl Unpin for VerifyErrorClass
impl UnsafeUnpin for VerifyErrorClass
impl UnwindSafe for VerifyErrorClass
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.