• Michael Niewöhner's avatar
    Add zstd support to zfs · 10b3c7f5
    Michael Niewöhner authored
    
    
    This PR adds two new compression types, based on ZStandard:
    
    - zstd: A basic ZStandard compression algorithm Available compression.
      Levels for zstd are zstd-1 through zstd-19, where the compression
      increases with every level, but speed decreases.
    
    - zstd-fast: A faster version of the ZStandard compression algorithm
      zstd-fast is basically a "negative" level of zstd. The compression
      decreases with every level, but speed increases.
    
      Available compression levels for zstd-fast:
       - zstd-fast-1 through zstd-fast-10
       - zstd-fast-20 through zstd-fast-100 (in increments of 10)
       - zstd-fast-500 and zstd-fast-1000
    
    For more information check the man page.
    
    Implementation details:
    
    Rather than treat each level of zstd as a different algorithm (as was
    done historically with gzip), the block pointer `enum zio_compress`
    value is simply zstd for all levels, including zstd-fast, since they all
    use the same decompression function.
    
    The compress= property (a 64bit unsigned integer) uses the lower 7 bits
    to store the compression algorithm (matching the number of bits used in
    a block pointer, as the 8th bit was borrowed for embedded block
    pointers).  The upper bits are used to store the compression level.
    
    It is necessary to be able to determine what compression level was used
    when later reading a block back, so the concept used in LZ4, where the
    first 32bits of the on-disk value are the size of the compressed data
    (since the allocation is rounded up to the nearest ashift), was
    extended, and we store the version of ZSTD and the level as well as the
    compressed size. This value is returned when decompressing a block, so
    that if the block needs to be recompressed (L2ARC, nop-write, etc), that
    the same parameters will be used to result in the matching checksum.
    
    All of the internal ZFS code ( `arc_buf_hdr_t`, `objset_t`,
    `zio_prop_t`, etc.) uses the separated _compress and _complevel
    variables.  Only the properties ZAP contains the combined/bit-shifted
    value. The combined value is split when the compression_changed_cb()
    callback is called, and sets both objset members (os_compress and
    os_complevel).
    
    The userspace tools all use the combined/bit-shifted value.
    
    Additional notes:
    
    zdb can now also decode the ZSTD compression header (flag -Z) and
    inspect the size, version and compression level saved in that header.
    For each record, if it is ZSTD compressed, the parameters of the decoded
    compression header get printed.
    
    ZSTD is included with all current tests and new tests are added
    as-needed.
    
    Per-dataset feature flags now get activated when the property is set.
    If a compression algorithm requires a feature flag, zfs activates the
    feature when the property is set, rather than waiting for the first
    block to be born.  This is currently only used by zstd but can be
    extended as needed.
    
    Portions-Sponsored-By: The FreeBSD Foundation
    Co-authored-by: default avatarAllan Jude <allanjude@freebsd.org>
    Co-authored-by: default avatarBrian Behlendorf <behlendorf1@llnl.gov>
    Co-authored-by: default avatarSebastian Gottschall <s.gottschall@dd-wrt.com>
    Co-authored-by: default avatarKjeld Schouten-Lebbing <kjeld@schouten-lebbing.nl>
    Co-authored-by: default avatarMichael Niewöhner <foss@mniewoehner.de>
    Signed-off-by: default avatarAllan Jude <allan@klarasystems.com>
    Signed-off-by: default avatarAllan Jude <allanjude@freebsd.org>
    Signed-off-by: default avatarBrian Behlendorf <behlendorf1@llnl.gov>
    Signed-off-by: default avatarSebastian Gottschall <s.gottschall@dd-wrt.com>
    Signed-off-by: default avatarKjeld Schouten-Lebbing <kjeld@schouten-lebbing.nl>
    Signed-off-by: default avatarMichael Niewöhner <foss@mniewoehner.de>
    Closes #6247
    Closes #9024
    Closes #10277
    Closes #10278
    10b3c7f5
AUTHORS 12.2 KB