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