Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scrub mirror children without BPs #13555

Merged
merged 1 commit into from
Jun 23, 2022
Merged

Commits on Jun 21, 2022

  1. Scrub mirror children without BPs

    When scrubbing a raidz/draid pool, which contains a replacing or
    sparing mirror with multiple online children, only one child will
    be read.  This is not normally a serious concern because the DTL
    records are used to determine where a good copy of the data is.
    As long as the data can be read from one child the mirror vdev
    will use it to repair gaps in any of its children.  Furthermore,
    even if the data which was read is corrupt the raidz code will
    detect this and issue its own repair I/O to correct the damage
    in the mirror vdev.
    
    However, in the scenario where the DTL is wrong due to silent
    data corruption (say due to overwritting one child) and the scrub
    happens to read from a child with good data, then the other damaged
    mirror child will not be detected nor repaired.
    
    While this is possible for both raidz and draid vdevs, it's most
    pronouced when using draid.  This is because by default the zed
    will sequentially rebuild a draid pool to a distributed spare,
    and the distributed spare half of the mirror is always preferred
    since it delievers better performance.  This means the damaged
    half of the mirror will go undetected even after scrubbing.
    
    For system administrations this behavior is non-intuitive and in
    a worst case scenario could result in the only good copy of the
    data being unknowingly detached from the mirror.
    
    This change resolves the issue by reading all replacing/sparing
    mirror children when scrubbing.  When the BP isn't available for
    verification, then compare the data buffers from each child.  They
    must all be indentical, if not there's silent damage and an error
    is returned to prompt the top-level vdev to issue a repair I/O to
    rewrite the data on all of the mirror children.  Since we can't
    tell which child was wrong a checksum error is logged against the
    replacing or sparing mirror vdev.
    
    Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
    Brian D. Behlendorf authored and behlendorf committed Jun 21, 2022
    Configuration menu
    Copy the full SHA
    f3567bd View commit details
    Browse the repository at this point in the history