Skip to content

Commit

Permalink
4924 LZ4 Compression for metadata
Browse files Browse the repository at this point in the history
Reviewed by Matthew Ahrens <[email protected]>
Reviewed by Saso Kiselkov <[email protected]>
Approved by: Christopher Siden <[email protected]>
  • Loading branch information
DKOI authored and Christopher Siden committed Jun 27, 2014
1 parent 58d0718 commit b8289d2
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 42 deletions.
3 changes: 2 additions & 1 deletion usr/src/common/zfs/zfeature_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
* Copyright (c) 2013, Joyent, Inc. All rights reserved.
* Copyright (c) 2014, Nexenta Systems, Inc. All rights reserved.
*/

#ifdef _KERNEL
Expand Down Expand Up @@ -169,7 +170,7 @@ zpool_feature_init(void)
zfeature_register(SPA_FEATURE_LZ4_COMPRESS,
"org.illumos:lz4_compress", "lz4_compress",
"LZ4 compression algorithm support.", B_FALSE, B_FALSE,
B_FALSE, NULL);
B_TRUE, NULL);

zfeature_register(SPA_FEATURE_MULTI_VDEV_CRASH_DUMP,
"com.joyent:multi_vdev_crash_dump", "multi_vdev_crash_dump",
Expand Down
15 changes: 8 additions & 7 deletions usr/src/man/man5/zpool-features.5
Original file line number Diff line number Diff line change
Expand Up @@ -243,13 +243,14 @@ giving approximately 10% better compression ratio.

When the \fBlz4_compress\fR feature is set to \fBenabled\fR, the
administrator can turn on \fBlz4\fR compression on any dataset on the
pool using the \fBzfs\fR(1M) command. Please note that doing so will
immediately activate the \fBlz4_compress\fR feature on the underlying
pool (even before any data is written), and the feature will not be
deactivated. Since this feature is not read-only compatible, this
operation will render the pool unimportable on systems without support
for the \fBlz4_compress\fR feature. Booting off of \fBlz4\fR-compressed
root pools is supported.
pool using the \fBzfs\fR(1M) command. Also, all newly written metadata
will be compressed with \fBlz4\fR algorithm. Since this feature is not
read-only compatible, this operation will render the pool unimportable
on systems without support for the \fBlz4_compress\fR feature. Booting
off of \fBlz4\fR-compressed root pools is supported.

This feature becomes \fBactive\fR as soon as it is enabled and will
never return to being \fBenabled\fB.
.RE

.sp
Expand Down
14 changes: 12 additions & 2 deletions usr/src/uts/common/fs/zfs/dmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
*/
/* Copyright (c) 2013 by Saso Kiselkov. All rights reserved. */
/* Copyright (c) 2013, Joyent, Inc. All rights reserved. */
/* Copyright (c) 2014, Nexenta Systems, Inc. All rights reserved. */

#include <sys/dmu.h>
#include <sys/dmu_impl.h>
Expand All @@ -44,6 +45,7 @@
#include <sys/zio_checksum.h>
#include <sys/zio_compress.h>
#include <sys/sa.h>
#include <sys/zfeature.h>
#ifdef _KERNEL
#include <sys/vmsystm.h>
#include <sys/zfs_znode.h>
Expand Down Expand Up @@ -1635,8 +1637,16 @@ dmu_write_policy(objset_t *os, dnode_t *dn, int level, int wp, zio_prop_t *zp)
* XXX -- we should design a compression algorithm
* that specializes in arrays of bps.
*/
compress = zfs_mdcomp_disable ? ZIO_COMPRESS_EMPTY :
ZIO_COMPRESS_LZJB;
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;
}

/*
* Metadata always gets checksummed. If the data
Expand Down
18 changes: 17 additions & 1 deletion usr/src/uts/common/fs/zfs/spa.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
/*
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2014 by Delphix. All rights reserved.
* Copyright 2013 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013, 2014, Nexenta Systems, Inc. All rights reserved.
*/

/*
Expand Down Expand Up @@ -6106,6 +6106,22 @@ spa_sync_upgrades(spa_t *spa, dmu_tx_t *tx)
spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) {
spa_feature_create_zap_objects(spa, tx);
}

/*
* LZ4_COMPRESS feature's behaviour was changed to activate_on_enable
* when possibility to use lz4 compression for metadata was added
* Old pools that have this feature enabled must be upgraded to have
* this feature active
*/
if (spa->spa_uberblock.ub_version >= SPA_VERSION_FEATURES) {
boolean_t lz4_en = spa_feature_is_enabled(spa,
SPA_FEATURE_LZ4_COMPRESS);
boolean_t lz4_ac = spa_feature_is_active(spa,
SPA_FEATURE_LZ4_COMPRESS);

if (lz4_en && !lz4_ac)
spa_feature_incr(spa, SPA_FEATURE_LZ4_COMPRESS, tx);
}
rrw_exit(&dp->dp_config_rwlock, FTAG);
}

Expand Down
32 changes: 1 addition & 31 deletions usr/src/uts/common/fs/zfs/zfs_ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
* Copyright (c) 2013 by Delphix. All rights reserved.
* Copyright (c) 2013 by Saso Kiselkov. All rights reserved.
* Copyright (c) 2013 Steven Hartland. All rights reserved.
* Copyright (c) 2014, Nexenta Systems, Inc. All rights reserved.
*/

/*
Expand Down Expand Up @@ -2453,37 +2454,6 @@ zfs_prop_set_special(const char *dsname, zprop_source_t source,
}
break;
}
case ZFS_PROP_COMPRESSION:
{
if (intval == ZIO_COMPRESS_LZ4) {
spa_t *spa;

if ((err = spa_open(dsname, &spa, FTAG)) != 0)
return (err);

/*
* Setting the LZ4 compression algorithm activates
* the feature.
*/
if (!spa_feature_is_active(spa,
SPA_FEATURE_LZ4_COMPRESS)) {
if ((err = zfs_prop_activate_feature(spa,
SPA_FEATURE_LZ4_COMPRESS)) != 0) {
spa_close(spa, FTAG);
return (err);
}
}

spa_close(spa, FTAG);
}
/*
* We still want the default set action to be performed in the
* caller, we only performed zfeature settings here.
*/
err = -1;
break;
}

default:
err = -1;
}
Expand Down

0 comments on commit b8289d2

Please sign in to comment.