#[non_exhaustive]pub enum BlockVerifyWarning {
UnrecognizedEcc {
table_id: TableId,
path: PathBuf,
},
ParityUnverifiable {
table_id: TableId,
path: PathBuf,
},
EccCodecSuspect {
table_id: TableId,
path: PathBuf,
},
EccDescriptorsUnreadable {
table_id: TableId,
path: PathBuf,
},
}Expand description
A non-fatal finding from a scrub run: the data is intact, but something about a table could not be fully checked.
Warnings do not fail BlockVerifyReport::is_ok, so any consumer that
renders a verdict (a CLI, an operator report) MUST surface them alongside
it: a bare “OK” over a non-empty warning list misreads “nothing broken
among what was checkable” as “everything verified”. The skipped surface
each variant names (an unverifiable parity trailer, an unwalkable ECC
section) is exactly where silent rot would otherwise hide.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
UnrecognizedEcc
The table’s descriptor#page_ecc decodes to an ECC scheme this build
cannot apply (an unimplemented scheme, page granularity, an unknown
kind, or a non-canonical descriptor). Block payloads still verify by
their own checksums, but the parity trailer length is not derivable
from a scheme, so the sequential block walk cannot size it and ECC
verification was skipped for this table. Recompaction re-stamps the
table with a supported scheme.
ParityUnverifiable
The table carries a RECOGNIZED Page-ECC scheme, but this build was
compiled without the ECC codecs (the page_ecc feature), so its parity
trailers were consumed for walk alignment but could NOT be verified.
Block payloads still verify by their own checksums — parity-only rot is
what stays invisible on this build. Verify on a page_ecc-enabled
build, or recompact (on this build the rewrite is parity-less) to leave
only verifiable bytes.
EccCodecSuspect
The parity mismatches reported for this table look like a MIS-IDENTIFIED ECC scheme rather than rot: the descriptor sizes every block correctly, yet reproduces the parity of none of them. Rot is scattered — it does not disagree with every trailer in every section at once.
The payloads still verified against their own checksums, so the data is readable either way and the table is graded on the mismatches alone. This only says which explanation to investigate first: recompact the table to re-stamp it under a scheme both meta mirrors agree on, rather than hunting failing hardware.
Raised only ALONGSIDE those mismatches, never on its own, so it cannot turn an otherwise-clean report into a degraded one.
EccDescriptorsUnreadable
NEITHER meta mirror holds a readable ECC descriptor, and the blocks were walked under a parity-less layout READ OFF THE FILE: they frame end to end with no trailer, which a parity-bearing table cannot do.
So this table verified completely — unlike Self::UnrecognizedEcc,
nothing was skipped — but what is on disk is still malformed, and only a
rewrite re-stamps a canonical descriptor. Until then the table has no
recorded scheme to recover under, and the next reader must infer the
layout again.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for BlockVerifyWarning
impl RefUnwindSafe for BlockVerifyWarning
impl Send for BlockVerifyWarning
impl Sync for BlockVerifyWarning
impl Unpin for BlockVerifyWarning
impl UnsafeUnpin for BlockVerifyWarning
impl UnwindSafe for BlockVerifyWarning
Blanket Implementations§
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> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more