Skip to content
Permalink
Browse files

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>
  • Loading branch information...
Justin T. Gibbs authored and rmustacc committed Feb 25, 2015
1 parent c029eaf commit db1741f555ec79def5e9846e6bfd132248514ffe
@@ -987,20 +987,25 @@ Changing this property affects only newly-written data.
.sp
.ne 2
.na
\fB\fBcompression\fR=\fBon\fR | \fBoff\fR | \fBlzjb\fR | \fBgzip\fR |
\fBgzip-\fR\fIN\fR | \fBzle\fR\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. 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.
Controls the compression algorithm used for this dataset.
.sp
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 \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
@@ -1010,6 +1015,13 @@ 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
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
@@ -1713,19 +1713,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);
}

/*
@@ -1758,7 +1754,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_NOPARITY;
} 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) :
@@ -151,7 +151,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
@@ -408,7 +409,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;
@@ -125,15 +125,19 @@ enum zio_compress {
*/
#define ZIO_COMPRESS_LEGACY_FUNCTIONS ZIO_COMPRESS_LZ4

/* N.B. when altering this value, also change BOOTFS_COMPRESS_VALID below */
#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)

#define ZIO_FAILURE_MODE_WAIT 0
@@ -538,8 +542,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);
@@ -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

0 comments on commit db1741f

Please sign in to comment.
You can’t perform that action at this time.