summaryrefslogtreecommitdiff
path: root/usr/src/test/zfs-tests/tests/functional/compression/compress_004_pos.ksh
blob: fbe48bdd7f79fb44c0a075bdb9db64c90f1f816a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/bin/ksh -p
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#

#
# Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

#
# Copyright (c) 2013, 2016 by Delphix. All rights reserved.
#

. $STF_SUITE/include/libtest.shlib

#
# DESCRIPTION:
# With 'compression' set, a file with non-power-of-2 blocksize storage space
# can be freed as will normally.
#
# STRATEGY:
#	1. Set 'compression' or 'compress' to on or lzjb
#	2. Set different recordsize with ZFS filesystem
#	3. Repeatedly using 'randfree_file' to create a file and then free its
#	   storage space with different range, the system should work normally.
#

verify_runnable "both"

function cleanup
{
	rm -f $TESTDIR/*
}

function create_free_testing #<file size> <file>
{
	typeset -i fsz=$1
	typeset file=$2
	typeset -i start=0
	typeset -i len=0
	typeset -i dist=0

	for start in 0 `expr $RANDOM % $fsz`
	do
		(( dist = fsz - start ))
		for len in `expr $RANDOM % $dist` $dist \
			`expr $start + $dist`; do
			log_must randfree_file -l fsz -s $start \
				-n $len $file
			[[ -e $file ]] && \
				log_must rm -f $file
		done
	done
}


log_assert "Creating non-power-of-2 blocksize file and freeing the file \
	storage space at will should work normally with compression setting"
log_onexit cleanup

fs=$TESTPOOL/$TESTFS
single_blk_file=$TESTDIR/singleblkfile.$$
multi_blk_file=$TESTDIR/multiblkfile.$$
typeset -i blksize=512
typeset -i fsize=0
typeset -i avail=0
typeset -i blknum=0

for propname in "compression" "compress"
do
	for value in $(get_compress_opts zfs_compress)
	do
		log_must zfs set compression=$value $fs
		real_val=$(get_prop $propname $fs)
		if [[ $value == "gzip-6" ]]; then
			value="gzip"
		fi
                [[ $real_val != $value ]] && \
                        log_fail "Set property $propname=$value failed."

		(( blksize = 512 ))
		while (( blksize <= 131072 )); do
			log_must zfs set recordsize=$blksize $fs

			# doing single block testing
			(( fsize = $RANDOM ))
			if (( fsize > blksize )); then
				(( fsize = fsize % blksize ))
			fi
			if (( (fsize % 2) == 0 )); then
				#make sure fsize is non-power-of-2
				(( fsize = fsize + 1 ))
			fi
			create_free_testing $fsize $single_blk_file

			# doing multiple blocks testing
			avail=$(get_prop available $fs)
			(( blknum = avail / blksize ))
			# we just test <10 multi-blocks to limit testing time
			(( blknum = blknum % 9 ))
			while (( blknum < 2 )); do
				(( blknum = blknum + $RANDOM % 9 ))
			done
			if (( (blknum % 2) == 0 )); then
				(( blknum = blknum + 1 )) # keep blknum as odd
			fi
			(( fsize = blknum * blksize ))
			create_free_testing $fsize $multi_blk_file

			(( blksize = blksize * 2 ))
		done
	done
done

log_pass "Creating and freeing non-power-of-2 blocksize file work as expected."