1#!/usr/bin/ksh -p
2
3#
4# This file and its contents are supplied under the terms of the
5# Common Development and Distribution License ("CDDL"), version 1.0.
6# You may only use this file in accordance with the terms of version
7# 1.0 of the CDDL.
8#
9# A full copy of the text of the CDDL should have accompanied this
10# source.  A copy of the CDDL is also available via the Internet at
11# http://www.illumos.org/license/CDDL.
12#
13
14#
15# Copyright (c) 2017, 2018 by Delphix. All rights reserved.
16#
17
18. $STF_SUITE/tests/functional/pool_checkpoint/pool_checkpoint.kshlib
19
20#
21# DESCRIPTION:
22#	The maximum address that can be described by a single-word
23#	space map entry limits the maximum allocatable space of any
24#	top-level vdev to 64PB whenever a vdev-wide space map is used.
25#
26#	Since a vdev-wide space map is introduced for the checkpoint
27#	we want to ensure that we cannot checkpoint a pool that does
28#	not use the new space map encoding (V2) and has a top-level
29#	vdev with more than 64PB of allocatable space.
30#
31#	Note: Since this is a pool created from file-based vdevs we
32#	      are guaranteed that vdev_ashift  is SPA_MINBLOCKSHIFT
33#	      [which is currently 9 and (1 << 9) = 512], so the numbers
34#	      work out for this test.
35#
36# STRATEGY:
37#	1. Create pool with a disk of exactly 64PB
38#	   (so ~63.5PB of allocatable space) and
39#	   ensure that has the checkpoint feature
40#	   enabled but not space map V2
41#	2. Ensure that you can checkpoint it
42#	3. Create pool with a disk of exactly 65PB
43#	   (so ~64.5PB of allocatable space) with
44#	   the same setup
45#	4. Ensure we fail trying to checkpoint it
46#
47# Note:
48# This test used to create the two pools and attempt to checkpoint
49# them at the same time, then destroy them. We later had to change
50# this to test one pool at a time as the metaslabs (even though empty)
51# consumed a lot of memory, especially on a machine that has been
52# running with debug enabled. To give an example, each metaslab
53# structure is ~1712 bytes (at the time of this writing), and each
54# vdev has 128K metaslabs, which means that just the structures
55# consume 131071 * 1712 = ~224M.
56#
57
58verify_runnable "global"
59
60TESTPOOL1=testpool1
61TESTPOOL2=testpool2
62
63DISK64PB=/$DISKFS/disk64PB
64DISK65PB=/$DISKFS/disk65PB
65
66function test_cleanup
67{
68	poolexists $TESTPOOL1 && destroy_pool $TESTPOOL1
69	poolexists $TESTPOOL2 && destroy_pool $TESTPOOL2
70	log_must rm -f $DISK64PB $DISK65PB
71	cleanup_test_pool
72}
73
74setup_test_pool
75log_onexit test_cleanup
76
77log_must zfs create $DISKFS
78log_must mkfile -n $((64 * 1024 * 1024))g $DISK64PB
79log_must mkfile -n $((65 * 1024 * 1024))g $DISK65PB
80
81log_must zpool create -d $TESTPOOL1 $DISK64PB
82log_must zpool set feature@zpool_checkpoint=enabled $TESTPOOL1
83log_must zpool checkpoint $TESTPOOL1
84destroy_pool $TESTPOOL1
85
86log_must zpool create -d $TESTPOOL2 $DISK65PB
87log_must zpool set feature@zpool_checkpoint=enabled $TESTPOOL2
88log_mustnot zpool checkpoint $TESTPOOL2
89destroy_pool $TESTPOOL2
90
91log_pass "Fail to checkpoint pool with old spacemap encoding" \
92    " and a vdev that's more than 64PB."
93