186714001SSerapheim Dimitropoulos#!/usr/bin/ksh -p
286714001SSerapheim Dimitropoulos
386714001SSerapheim Dimitropoulos#
486714001SSerapheim Dimitropoulos# This file and its contents are supplied under the terms of the
586714001SSerapheim Dimitropoulos# Common Development and Distribution License ("CDDL"), version 1.0.
686714001SSerapheim Dimitropoulos# You may only use this file in accordance with the terms of version
786714001SSerapheim Dimitropoulos# 1.0 of the CDDL.
886714001SSerapheim Dimitropoulos#
986714001SSerapheim Dimitropoulos# A full copy of the text of the CDDL should have accompanied this
1086714001SSerapheim Dimitropoulos# source.  A copy of the CDDL is also available via the Internet at
1186714001SSerapheim Dimitropoulos# http://www.illumos.org/license/CDDL.
1286714001SSerapheim Dimitropoulos#
1386714001SSerapheim Dimitropoulos
1486714001SSerapheim Dimitropoulos#
1586714001SSerapheim Dimitropoulos# Copyright (c) 2017 by Delphix. All rights reserved.
1686714001SSerapheim Dimitropoulos#
1786714001SSerapheim Dimitropoulos
1886714001SSerapheim Dimitropoulos. $STF_SUITE/tests/functional/pool_checkpoint/pool_checkpoint.kshlib
1986714001SSerapheim Dimitropoulos
2086714001SSerapheim Dimitropoulos#
2186714001SSerapheim Dimitropoulos# DESCRIPTION:
2286714001SSerapheim Dimitropoulos#	Ensure that we don't reuse checkpointed blocks when the
2386714001SSerapheim Dimitropoulos#	pool hits ENOSPC errors because of the slop space limit.
2486714001SSerapheim Dimitropoulos#	This test also ensures that the DSL layer correctly takes
2586714001SSerapheim Dimitropoulos#	into account the space used by the checkpoint when deciding
2686714001SSerapheim Dimitropoulos#	whether to allow operations based on the reserved slop
2786714001SSerapheim Dimitropoulos#	space.
2886714001SSerapheim Dimitropoulos#
2986714001SSerapheim Dimitropoulos# STRATEGY:
3086714001SSerapheim Dimitropoulos#	1. Create pool with one disk of 1G size
3186714001SSerapheim Dimitropoulos#	2. Create a file with random data of 700M in size.
3286714001SSerapheim Dimitropoulos#	   leaving ~200M left in pool capacity.
3386714001SSerapheim Dimitropoulos#	3. Checkpoint the pool
3486714001SSerapheim Dimitropoulos#	4. Remove the file. All of its blocks should stay around
3586714001SSerapheim Dimitropoulos#	   in ZFS as they are part of the checkpoint.
3686714001SSerapheim Dimitropoulos#	5. Create a new empty file and attempt to write ~300M
3786714001SSerapheim Dimitropoulos#	   of data to it. This should fail, as the reserved
3886714001SSerapheim Dimitropoulos#	   SLOP space for the pool should be ~128M, and we should
3986714001SSerapheim Dimitropoulos#	   be hitting that limit getting ENOSPC.
4086714001SSerapheim Dimitropoulos#	6. Use zdb to traverse and checksum all the checkpointed
4186714001SSerapheim Dimitropoulos#	   data to ensure its integrity.
4286714001SSerapheim Dimitropoulos#	7. Export the pool and rewind to ensure that everything
4386714001SSerapheim Dimitropoulos#	   is actually there as expected.
4486714001SSerapheim Dimitropoulos#
4586714001SSerapheim Dimitropoulos
4686714001SSerapheim Dimitropoulosfunction test_cleanup
4786714001SSerapheim Dimitropoulos{
4886714001SSerapheim Dimitropoulos	poolexists $NESTEDPOOL && destroy_pool $NESTEDPOOL
4986714001SSerapheim Dimitropoulos	cleanup_test_pool
5086714001SSerapheim Dimitropoulos}
5186714001SSerapheim Dimitropoulos
5286714001SSerapheim Dimitropoulosverify_runnable "global"
5386714001SSerapheim Dimitropoulos
5486714001SSerapheim Dimitropoulossetup_test_pool
5586714001SSerapheim Dimitropouloslog_onexit test_cleanup
5686714001SSerapheim Dimitropoulos
5786714001SSerapheim Dimitropouloslog_must zfs create $DISKFS
5886714001SSerapheim Dimitropoulos
5986714001SSerapheim Dimitropouloslog_must mkfile $FILEDISKSIZE $FILEDISK1
6086714001SSerapheim Dimitropouloslog_must zpool create $NESTEDPOOL $FILEDISK1
6186714001SSerapheim Dimitropoulos
6286714001SSerapheim Dimitropouloslog_must zfs create -o compression=lz4 -o recordsize=8k $NESTEDFS0
6386714001SSerapheim Dimitropouloslog_must dd if=/dev/urandom of=$NESTEDFS0FILE bs=700M count=1
6486714001SSerapheim DimitropoulosFILE0INTRO=$(head -c 100 $NESTEDFS0FILE)
6586714001SSerapheim Dimitropoulos
6686714001SSerapheim Dimitropouloslog_must zpool checkpoint $NESTEDPOOL
6786714001SSerapheim Dimitropouloslog_must rm $NESTEDFS0FILE
6886714001SSerapheim Dimitropoulos
6986714001SSerapheim Dimitropoulos#
7086714001SSerapheim Dimitropoulos# only for debugging purposes
7186714001SSerapheim Dimitropoulos#
7286714001SSerapheim Dimitropouloslog_must zpool list $NESTEDPOOL
7386714001SSerapheim Dimitropoulos
7486714001SSerapheim Dimitropouloslog_mustnot dd if=/dev/urandom of=$NESTEDFS0FILE bs=300M count=1
7586714001SSerapheim Dimitropoulos
7686714001SSerapheim Dimitropoulos#
7786714001SSerapheim Dimitropoulos# only for debugging purposes
7886714001SSerapheim Dimitropoulos#
7986714001SSerapheim Dimitropouloslog_must zpool list $NESTEDPOOL
8086714001SSerapheim Dimitropoulos
8186714001SSerapheim Dimitropouloslog_must zpool export $NESTEDPOOL
82*77c6489aSBrian Behlendorflog_must zdb -e -p $FILEDISKDIR -kc $NESTEDPOOL
83*77c6489aSBrian Behlendorf
8486714001SSerapheim Dimitropouloslog_must zpool import -d $FILEDISKDIR --rewind-to-checkpoint $NESTEDPOOL
8586714001SSerapheim Dimitropoulos
8686714001SSerapheim Dimitropouloslog_must [ "$(head -c 100 $NESTEDFS0FILE)" = "$FILE0INTRO" ]
8786714001SSerapheim Dimitropoulos
88*77c6489aSBrian Behlendorflog_must zpool export $NESTEDPOOL
89*77c6489aSBrian Behlendorflog_must zdb -e -p $FILEDISKDIR $NESTEDPOOL
9086714001SSerapheim Dimitropoulos
9186714001SSerapheim Dimitropouloslog_pass "Do not reuse checkpointed space at low capacity."
92