]> granicus.if.org Git - zfs/commitdiff
Illumos 5661 - ZFS: "compression = on" should use lz4 if feature is enabled
authorJustin T. Gibbs <justing@spectralogic.com>
Mon, 6 Jul 2015 01:55:32 +0000 (03:55 +0200)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Fri, 10 Jul 2015 19:11:45 +0000 (12:11 -0700)
5661 ZFS: "compression = on" should use lz4 if feature is enabled
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
Reviewed by: Xin LI <delphij@freebsd.org>
Approved by: Robert Mustacchi <rm@joyent.com>

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 <behlendorf1@llnl.gov>
Closes #3571

include/sys/zio.h
man/man8/zfs.8
module/zfs/dmu.c
module/zfs/dmu_objset.c
module/zfs/zio_compress.c

index d31b2acdda384bf084fcf79504c0cd7a1205f969..278b6e0868a9038fa27afc1aee185229bc4b071c 100644 (file)
@@ -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);
index 83fd1aeb9a71ba5757eea846d05bdcefd4e89660..014ed81032b11fbf6213a2195d28c702393c6594 100644 (file)
@@ -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
index 7e8328e770a56b7ebc82e13b825587a07bb4fd35..7d3945433bb382775a014d51dfbd1b85f8191035 100644 (file)
@@ -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) :
index 823a15677713e083e4c923db8eec4ee02f4bb23e..bd953dc3606a0828703d71805977e78d575d7866 100644 (file)
@@ -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;
index 07446234922b63e92d1214483b0251ef0230d417..6b8d6c39bd912b98e5e19f4e58bc43a15afb6447 100644 (file)
@@ -34,6 +34,7 @@
 #include <sys/zfs_context.h>
 #include <sys/compress.h>
 #include <sys/spa.h>
+#include <sys/zfeature.h>
 #include <sys/zio.h>
 #include <sys/zio_compress.h>
 
@@ -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