#!/usr/bin/ksh -p # # This file and its contents are supplied under the terms of the # Common Development and Distribution License ("CDDL"), version 1.0. # You may only use this file in accordance with the terms of version # 1.0 of the CDDL. # # A full copy of the text of the CDDL should have accompanied this # source. A copy of the CDDL is also available via the Internet at # http://www.illumos.org/license/CDDL. # # # 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 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 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 # [which is currently 9 and (1 << 9) = 512], so the numbers # work out for this test. # # STRATEGY: # 1. Create pool with a disk of exactly 64PB # (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) 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" TESTPOOL1=testpool1 TESTPOOL2=testpool2 DISK64PB=/$DISKFS/disk64PB DISK65PB=/$DISKFS/disk65PB function test_cleanup { poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1 poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2 log_must rm -f $DISK64PB $DISK65PB cleanup_test_pool } setup_test_pool log_onexit test_cleanup 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 -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 "Fail to checkpoint pool with old spacemap encoding" \ " and a vdev that's more than 64PB."