| #!/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." |