aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--module/zfs/vdev.c14
-rwxr-xr-xtests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh44
2 files changed, 40 insertions, 18 deletions
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index 26ef5b4c5..cf49172d5 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -3804,13 +3804,17 @@ vdev_get_child_stat_ex(vdev_t *cvd, vdev_stat_ex_t *vsx, vdev_stat_ex_t *cvsx)
boolean_t
vdev_is_spacemap_addressable(vdev_t *vd)
{
+ if (spa_feature_is_active(vd->vdev_spa, SPA_FEATURE_SPACEMAP_V2))
+ return (B_TRUE);
+
/*
- * Assuming 47 bits of the space map entry dedicated for the entry's
- * offset (see description in space_map.h), we calculate the maximum
- * address that can be described by a space map entry for the given
- * device.
+ * If double-word space map entries are not enabled we assume
+ * 47 bits of the space map entry are dedicated to the entry's
+ * offset (see SM_OFFSET_BITS in space_map.h). We then use that
+ * to calculate the maximum address that can be described by a
+ * space map entry for the given device.
*/
- uint64_t shift = vd->vdev_ashift + 47;
+ uint64_t shift = vd->vdev_ashift + SM_OFFSET_BITS;
if (shift >= 63) /* detect potential overflow */
return (B_TRUE);
diff --git a/tests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh b/tests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh
index 5247d6007..e24c4eb55 100755
--- a/tests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh
+++ b/tests/zfs-tests/tests/functional/pool_checkpoint/checkpoint_sm_scale.ksh
@@ -12,21 +12,21 @@
#
#
-# Copyright (c) 2017 by Delphix. All rights reserved.
+# Copyright (c) 2017, 2018 by Delphix. All rights reserved.
#
. $STF_SUITE/tests/functional/pool_checkpoint/pool_checkpoint.kshlib
#
# DESCRIPTION:
-# The maximum address that can be described by the current space
-# map design (assuming the minimum 512-byte addressable storage)
-# limits the maximum allocatable space of any top-level vdev to
-# 64PB whenever a vdev-wide space map is used.
+# The maximum address that can be described by a single-word
+# space map entry limits the maximum allocatable space of any
+# top-level vdev to 64PB whenever a vdev-wide space map is used.
#
# Since a vdev-wide space map is introduced for the checkpoint
-# we want to ensure that we cannot checkpoint a pool that has a
-# top-level vdev with more than 64PB of allocatable space.
+# we want to ensure that we cannot checkpoint a pool that does
+# not use the new space map encoding (V2) and has a top-level
+# vdev with more than 64PB of allocatable space.
#
# Note: Since this is a pool created from file-based vdevs we
# are guaranteed that vdev_ashift is SPA_MINBLOCKSHIFT
@@ -35,12 +35,25 @@
#
# STRATEGY:
# 1. Create pool with a disk of exactly 64PB
-# (so ~63.5PB of allocatable space)
+# (so ~63.5PB of allocatable space) and
+# ensure that has the checkpoint feature
+# enabled but not space map V2
# 2. Ensure that you can checkpoint it
# 3. Create pool with a disk of exactly 65PB
-# (so ~64.5PB of allocatable space)
+# (so ~64.5PB of allocatable space) with
+# the same setup
# 4. Ensure we fail trying to checkpoint it
#
+# Note:
+# This test used to create the two pools and attempt to checkpoint
+# them at the same time, then destroy them. We later had to change
+# this to test one pool at a time as the metaslabs (even though empty)
+# consumed a lot of memory, especially on a machine that has been
+# running with debug enabled. To give an example, each metaslab
+# structure is ~1712 bytes (at the time of this writing), and each
+# vdev has 128K metaslabs, which means that just the structures
+# consume 131071 * 1712 = ~224M.
+#
verify_runnable "global"
@@ -65,10 +78,15 @@ log_must zfs create $DISKFS
log_must mkfile -n $((64 * 1024 * 1024))g $DISK64PB
log_must mkfile -n $((65 * 1024 * 1024))g $DISK65PB
-log_must zpool create $TESTPOOL1 $DISK64PB
-log_must zpool create $TESTPOOL2 $DISK65PB
-
+log_must zpool create -d $TESTPOOL1 $DISK64PB
+log_must zpool set feature@zpool_checkpoint=enabled $TESTPOOL1
log_must zpool checkpoint $TESTPOOL1
+destroy_pool $TESTPOOL1
+
+log_must zpool create -d $TESTPOOL2 $DISK65PB
+log_must zpool set feature@zpool_checkpoint=enabled $TESTPOOL2
log_mustnot zpool checkpoint $TESTPOOL2
+destroy_pool $TESTPOOL2
-log_pass "Attempting to checkpoint a pool with a vdev that's more than 64PB."
+log_pass "Fail to checkpoint pool with old spacemap encoding" \
+ " and a vdev that's more than 64PB."