Corrective receives and quick scrubs pique my interest. How are they different from the regular receive and scrub?
Quick scrubs can be issued (with the "-e" flag) after you've completed a full pass with a normal scrub.
Only the "errors" in the pool's log (which point to particular data) will be re-read, inspected, and attempt a repair. This saves time for those of us who need only to run a scrub again (after bumping into an issue), whether to re-attempt a repair or clear a previous stagnant error.
Corrective receives (with the "-c" flag) work similar to an incremental zfs send. The difference is that they only attempt to transfer blocks to repair corruption on the destination. So only the blocks in question need to be transferred. (Only works on
data blocks at the moment; not
metadata.)
For example, say you have a source pool and a backup pool. After some time, the backup pool has a file or two corrupt. Maybe it lacks redundancy or it's unable to repair itself. The source pool, however, still has known good copies of these specific blocks.
Without having to destroy anything or start all over again, you can send a "corrective receive" to the backup pool, in which it will send good copies of those blocks from the source pool. (Correcting it "in-place" at the block-level.)
* I could be misinterpreting "corrective receives", in that it might work as a standard replication, with the
added feature of attempting a repair using the source's known good data. (It's not clear if invoking "-c" will
only transfer good blocks to replace corrupted ones; or if it will still transfer the
entire snapshot/delta again.)