From 99197f034ea0a7e227116e0cec00fe55061bffa7 Mon Sep 17 00:00:00 2001 From: "Justin T. Gibbs" Date: Mon, 6 Jul 2015 03:55:32 +0200 Subject: [PATCH] Illumos 5661 - ZFS: "compression = on" should use lz4 if feature is enabled 5661 ZFS: "compression = on" should use lz4 if feature is enabled Reviewed by: Matthew Ahrens Reviewed by: Josef 'Jeff' Sipek Reviewed by: Xin LI Approved by: Robert Mustacchi References: https://github.com/illumos/illumos-gate/commit/db1741f https://www.illumos.org/issues/5661 Ported-by: kernelOfTruth kerneloftruth@gmail.com Signed-off-by: Brian Behlendorf Closes #3571 --- include/sys/zio.h | 17 +++++++++++------ man/man8/zfs.8 | 28 +++++++++++++++++++++++----- module/zfs/dmu.c | 19 ++++++++----------- module/zfs/dmu_objset.c | 5 +++-- module/zfs/zio_compress.c | 23 ++++++++++++++++------- 5 files changed, 61 insertions(+), 31 deletions(-) diff --git a/include/sys/zio.h b/include/sys/zio.h index d31b2acdda38..278b6e0868a9 100644 --- a/include/sys/zio.h +++ b/include/sys/zio.h @@ -123,14 +123,19 @@ enum zio_compress { */ #define ZIO_COMPRESS_LEGACY_FUNCTIONS ZIO_COMPRESS_LZ4 -#define ZIO_COMPRESS_ON_VALUE ZIO_COMPRESS_LZJB -#define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF +/* + * The meaning of "compress = on" selected by the compression features enabled + * on a given pool. + */ +#define ZIO_COMPRESS_LEGACY_ON_VALUE ZIO_COMPRESS_LZJB +#define ZIO_COMPRESS_LZ4_ON_VALUE ZIO_COMPRESS_LZ4 + +#define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF #define BOOTFS_COMPRESS_VALID(compress) \ ((compress) == ZIO_COMPRESS_LZJB || \ (compress) == ZIO_COMPRESS_LZ4 || \ - ((compress) == ZIO_COMPRESS_ON && \ - ZIO_COMPRESS_ON_VALUE == ZIO_COMPRESS_LZJB) || \ + (compress) == ZIO_COMPRESS_ON || \ (compress) == ZIO_COMPRESS_OFF) /* @@ -543,8 +548,8 @@ extern enum zio_checksum zio_checksum_select(enum zio_checksum child, enum zio_checksum parent); extern enum zio_checksum zio_checksum_dedup_select(spa_t *spa, enum zio_checksum child, enum zio_checksum parent); -extern enum zio_compress zio_compress_select(enum zio_compress child, - enum zio_compress parent); +extern enum zio_compress zio_compress_select(spa_t *spa, + enum zio_compress child, enum zio_compress parent); extern void zio_suspend(spa_t *spa, zio_t *zio); extern int zio_resume(spa_t *spa); diff --git a/man/man8/zfs.8 b/man/man8/zfs.8 index 83fd1aeb9a71..014ed81032b1 100644 --- a/man/man8/zfs.8 +++ b/man/man8/zfs.8 @@ -840,15 +840,25 @@ Changing this property affects only newly-written data. .ne 2 .mk .na -\fBcompression\fR=\fBon\fR | \fBoff\fR | \fBlzjb\fR | \fBgzip\fR | \fBgzip-\fR\fIN\fR | \fBzle\fR | \fBlz4\fR +\fB\fBcompression\fR=\fBon\fR | \fBoff\fR | \fBlzjb\fR | \fBlz4\fR | +\fBgzip\fR | \fBgzip-\fR\fIN\fR | \fBzle\fR\fR .ad .sp .6 .RS 4n -Controls the compression algorithm used for this dataset. The \fBlzjb\fR compression algorithm is optimized for performance while providing decent data compression. Setting compression to \fBon\fR uses the \fBlzjb\fR compression algorithm. +Controls the compression algorithm used for this dataset. .sp -The \fBgzip\fR compression algorithm uses the same compression as the \fBgzip\fR(1) command. You can specify the \fBgzip\fR level by using the value \fBgzip-\fR\fIN\fR where \fIN\fR is an integer from 1 (fastest) to 9 (best compression ratio). Currently, \fBgzip\fR is equivalent to \fBgzip-6\fR (which is also the default for \fBgzip\fR(1)). +Setting compression to \fBon\fR indicates that the current default +compression algorithm should be used. The default balances compression +and decompression speed, with compression ratio and is expected to +work well on a wide variety of workloads. Unlike all other settings for +this property, \fBon\fR does not select a fixed compression type. As +new compression algorithms are added to ZFS and enabled on a pool, the +default compression algorithm may change. The current default compression +algorthm is either \fBlzjb\fR or, if the \fBlz4_compress\fR feature is +enabled, \fBlz4\fR. .sp -The \fBzle\fR (zero-length encoding) compression algorithm is a fast and simple algorithm to eliminate runs of zeroes. +The \fBlzjb\fR compression algorithm is optimized for performance while +providing decent data compression. .sp The \fBlz4\fR compression algorithm is a high-performance replacement for the \fBlzjb\fR algorithm. It features significantly faster @@ -858,7 +868,15 @@ the \fBlz4_compress\fR feature set to \fIenabled\fR. See \fBzpool-features\fR(5) for details on ZFS feature flags and the \fBlz4_compress\fR feature. .sp -This property can also be referred to by its shortened column name \fBcompress\fR. Changing this property affects only newly-written data. +The \fBgzip\fR compression algorithm uses the same compression as +the \fBgzip\fR(1) command. You can specify the \fBgzip\fR level by using the +value \fBgzip-\fR\fIN\fR where \fIN\fR is an integer from 1 (fastest) to 9 +(best compression ratio). Currently, \fBgzip\fR is equivalent to \fBgzip-6\fR +(which is also the default for \fBgzip\fR(1)). The \fBzle\fR compression +algorithm compresses runs of zeros. +.sp +This property can also be referred to by its shortened column name +\fBcompress\fR. Changing this property affects only newly-written data. .RE .sp diff --git a/module/zfs/dmu.c b/module/zfs/dmu.c index 7e8328e770a5..7d3945433bb3 100644 --- a/module/zfs/dmu.c +++ b/module/zfs/dmu.c @@ -1864,19 +1864,15 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp) * 3. all other level 0 blocks */ if (ismd) { - /* - * XXX -- we should design a compression algorithm - * that specializes in arrays of bps. - */ - boolean_t lz4_ac = spa_feature_is_active(os->os_spa, - SPA_FEATURE_LZ4_COMPRESS); - if (zfs_mdcomp_disable) { compress = ZIO_COMPRESS_EMPTY; - } else if (lz4_ac) { - compress = ZIO_COMPRESS_LZ4; } else { - compress = ZIO_COMPRESS_LZJB; + /* + * XXX -- we should design a compression algorithm + * that specializes in arrays of bps. + */ + compress = zio_compress_select(os->os_spa, + ZIO_COMPRESS_ON, ZIO_COMPRESS_ON); } /* @@ -1909,7 +1905,8 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp) compress = ZIO_COMPRESS_OFF; checksum = ZIO_CHECKSUM_OFF; } else { - compress = zio_compress_select(dn->dn_compress, compress); + compress = zio_compress_select(os->os_spa, dn->dn_compress, + compress); checksum = (dedup_checksum == ZIO_CHECKSUM_OFF) ? zio_checksum_select(dn->dn_checksum, checksum) : diff --git a/module/zfs/dmu_objset.c b/module/zfs/dmu_objset.c index 823a15677713..bd953dc3606a 100644 --- a/module/zfs/dmu_objset.c +++ b/module/zfs/dmu_objset.c @@ -163,7 +163,8 @@ compression_changed_cb(void *arg, uint64_t newval) */ ASSERT(newval != ZIO_COMPRESS_INHERIT); - os->os_compress = zio_compress_select(newval, ZIO_COMPRESS_ON_VALUE); + os->os_compress = zio_compress_select(os->os_spa, newval, + ZIO_COMPRESS_ON); } static void @@ -420,7 +421,7 @@ dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp, } else { /* It's the meta-objset. */ os->os_checksum = ZIO_CHECKSUM_FLETCHER_4; - os->os_compress = ZIO_COMPRESS_LZJB; + os->os_compress = ZIO_COMPRESS_ON; os->os_copies = spa_max_replication(spa); os->os_dedup_checksum = ZIO_CHECKSUM_OFF; os->os_dedup_verify = B_FALSE; diff --git a/module/zfs/zio_compress.c b/module/zfs/zio_compress.c index 07446234922b..6b8d6c39bd91 100644 --- a/module/zfs/zio_compress.c +++ b/module/zfs/zio_compress.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -61,19 +62,27 @@ zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS] = { }; enum zio_compress -zio_compress_select(enum zio_compress child, enum zio_compress parent) +zio_compress_select(spa_t *spa, enum zio_compress child, + enum zio_compress parent) { + enum zio_compress result; + ASSERT(child < ZIO_COMPRESS_FUNCTIONS); ASSERT(parent < ZIO_COMPRESS_FUNCTIONS); - ASSERT(parent != ZIO_COMPRESS_INHERIT && parent != ZIO_COMPRESS_ON); + ASSERT(parent != ZIO_COMPRESS_INHERIT); - if (child == ZIO_COMPRESS_INHERIT) - return (parent); + result = child; + if (result == ZIO_COMPRESS_INHERIT) + result = parent; - if (child == ZIO_COMPRESS_ON) - return (ZIO_COMPRESS_ON_VALUE); + if (result == ZIO_COMPRESS_ON) { + if (spa_feature_is_active(spa, SPA_FEATURE_LZ4_COMPRESS)) + result = ZIO_COMPRESS_LZ4_ON_VALUE; + else + result = ZIO_COMPRESS_LEGACY_ON_VALUE; + } - return (child); + return (result); } size_t