xref: /freebsd/tools/test/stress2/misc/gnop13.sh (revision ce7b20e5129cf0f269951b313d336a9c7d54d790)
1*ce7b20e5SPeter Holm#!/bin/sh
2*ce7b20e5SPeter Holm
3*ce7b20e5SPeter Holm#
4*ce7b20e5SPeter Holm# SPDX-License-Identifier: BSD-2-Clause
5*ce7b20e5SPeter Holm#
6*ce7b20e5SPeter Holm# Copyright (c) 2023 Peter Holm <pho@FreeBSD.org>
7*ce7b20e5SPeter Holm#
8*ce7b20e5SPeter Holm# Redistribution and use in source and binary forms, with or without
9*ce7b20e5SPeter Holm# modification, are permitted provided that the following conditions
10*ce7b20e5SPeter Holm# are met:
11*ce7b20e5SPeter Holm# 1. Redistributions of source code must retain the above copyright
12*ce7b20e5SPeter Holm#    notice, this list of conditions and the following disclaimer.
13*ce7b20e5SPeter Holm# 2. Redistributions in binary form must reproduce the above copyright
14*ce7b20e5SPeter Holm#    notice, this list of conditions and the following disclaimer in the
15*ce7b20e5SPeter Holm#    documentation and/or other materials provided with the distribution.
16*ce7b20e5SPeter Holm#
17*ce7b20e5SPeter Holm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18*ce7b20e5SPeter Holm# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*ce7b20e5SPeter Holm# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*ce7b20e5SPeter Holm# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21*ce7b20e5SPeter Holm# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*ce7b20e5SPeter Holm# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*ce7b20e5SPeter Holm# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*ce7b20e5SPeter Holm# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*ce7b20e5SPeter Holm# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*ce7b20e5SPeter Holm# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*ce7b20e5SPeter Holm# SUCH DAMAGE.
28*ce7b20e5SPeter Holm#
29*ce7b20e5SPeter Holm
30*ce7b20e5SPeter Holm# Snapshot test
31*ce7b20e5SPeter Holm# Variation of force13.sh, but uses "gnop -f destroy"
32*ce7b20e5SPeter Holm
33*ce7b20e5SPeter Holm# Seen:
34*ce7b20e5SPeter Holm# UFS: forcibly unmounting /dev/md10.nop from /mnt
35*ce7b20e5SPeter Holm# panic: flush_pagedep_deps: failed to flush inodedep
36*ce7b20e5SPeter Holm
37*ce7b20e5SPeter Holm[ `id -u ` -ne 0 ] && echo "Must be root!" && exit 1
38*ce7b20e5SPeter Holm. ../default.cfg
39*ce7b20e5SPeter Holm
40*ce7b20e5SPeter Holmset -u
41*ce7b20e5SPeter Holmlog=/tmp/gnop13.sh.log
42*ce7b20e5SPeter Holmmount | grep $mntpoint | grep -q /dev/md && umount -f $mntpoint
43*ce7b20e5SPeter Holmmdconfig -l | grep -q md$mdstart && mdconfig -d -u $mdstart
44*ce7b20e5SPeter Holmtruncate -s 10g $diskimage
45*ce7b20e5SPeter Holmmdconfig -a -t vnode -f $diskimage -u $mdstart
46*ce7b20e5SPeter Holmflags=$newfs_flags
47*ce7b20e5SPeter Holm[ `jot -r 1 0 1` -eq 1 ] && flags="-j"
48*ce7b20e5SPeter Holm
49*ce7b20e5SPeter Holmecho "newfs $flags md$mdstart"
50*ce7b20e5SPeter Holmnewfs $flags md$mdstart > /dev/null 2>&1
51*ce7b20e5SPeter Holm
52*ce7b20e5SPeter Holm# Exclude rename for now due to log0374.txt
53*ce7b20e5SPeter Holmexport TESTPROGS=`cd ..; find testcases/ -perm -1 -type f | \
54*ce7b20e5SPeter Holm    egrep -Ev "/run/|/badcode/|/pty/|/shm/|/socket/|sysctl|tcp|thr|udp|rename"`
55*ce7b20e5SPeter Holmexport runRUNTIME=3m
56*ce7b20e5SPeter Holmexport RUNDIR=$mntpoint/stressX
57*ce7b20e5SPeter Holmexport CTRLDIR=$mntpoint/stressX.control
58*ce7b20e5SPeter Holmstart=`date +%s`
59*ce7b20e5SPeter Holmwhile [ $((`date +%s` - start)) -lt $((15 * 60)) ]; do
60*ce7b20e5SPeter Holm	gnop create /dev/md$mdstart || exit 1
61*ce7b20e5SPeter Holm	mount /dev/md$mdstart.nop $mntpoint || exit 1
62*ce7b20e5SPeter Holm	rm -fr $mntpoint/lost+found
63*ce7b20e5SPeter Holm	chmod 777 $mntpoint
64*ce7b20e5SPeter Holm
65*ce7b20e5SPeter Holm	su $testuser -c 'cd ..; ./testcases/run/run $TESTPROGS' > \
66*ce7b20e5SPeter Holm	    /dev/null 2>&1 &
67*ce7b20e5SPeter Holm
68*ce7b20e5SPeter Holm	t=`jot -r 1 60 120`
69*ce7b20e5SPeter Holm	st=`date +%s`
70*ce7b20e5SPeter Holm	for i in `jot 10`; do
71*ce7b20e5SPeter Holm		[ -d $mntpoint/.snap ] || break
72*ce7b20e5SPeter Holm		rm -f $mntpoint/.snap/$i
73*ce7b20e5SPeter Holm		echo "mksnap_ffs $mntpoint $mntpoint/.snap/$i"
74*ce7b20e5SPeter Holm		mksnap_ffs $mntpoint $mntpoint/.snap/$i
75*ce7b20e5SPeter Holm		sleep `jot -r 1 1 5`
76*ce7b20e5SPeter Holm		[ $((`date +%s` - st)) -ge $t ] && break
77*ce7b20e5SPeter Holm	done &
78*ce7b20e5SPeter Holm	sleep `jot -r 1 60 120`
79*ce7b20e5SPeter Holm	while [ -c /dev/md$mdstart.nop ]; do
80*ce7b20e5SPeter Holm		echo "gnop destroy -f /dev/md$mdstart.nop"
81*ce7b20e5SPeter Holm		gnop destroy -f /dev/md$mdstart.nop || sleep 1
82*ce7b20e5SPeter Holm	done
83*ce7b20e5SPeter Holm	n=0
84*ce7b20e5SPeter Holm	st=`date +%s`
85*ce7b20e5SPeter Holm	while mount | grep -q "on $mntpoint "; do
86*ce7b20e5SPeter Holm		[ $n -eq 0 ] && /bin/echo -n "Waiting for $mntpoint to force umount ..."
87*ce7b20e5SPeter Holm		n=$((n + 1))
88*ce7b20e5SPeter Holm		sleep 2
89*ce7b20e5SPeter Holm		if [ $((`date +%s` - st)) -ge 180 ]; then
90*ce7b20e5SPeter Holm			echo "Giving up on waiting for umount of $mntpoint"
91*ce7b20e5SPeter Holm			umount $mntpoint || umount -f $mntpoint
92*ce7b20e5SPeter Holm			break
93*ce7b20e5SPeter Holm		fi
94*ce7b20e5SPeter Holm	done
95*ce7b20e5SPeter Holm	[ $n -ne 0 ] && echo
96*ce7b20e5SPeter Holm
97*ce7b20e5SPeter Holm	../tools/killall.sh
98*ce7b20e5SPeter Holm	wait
99*ce7b20e5SPeter Holm	mount | grep -q "on $mntpoint " && umount -f $mntpoint
100*ce7b20e5SPeter Holm	c=0
101*ce7b20e5SPeter Holm	# Run fsck minimum two times
102*ce7b20e5SPeter Holm	for i in `jot 5`; do
103*ce7b20e5SPeter Holm		fsck_ffs -fy /dev/md$mdstart > $log 2>&1; s=$?
104*ce7b20e5SPeter Holm		grep -q CLEAN $log && grep -q "MODIFIED" $log && c=$((c+=1))
105*ce7b20e5SPeter Holm		grep -Eq "FILE SYSTEM WAS MODIFIED" $log || break
106*ce7b20e5SPeter Holm	done
107*ce7b20e5SPeter Holm	[ $c -gt 1 ] &&
108*ce7b20e5SPeter Holm	    { echo "Note: FS marked clean+modified $c times out of $i fsck runs"; s=101; }
109*ce7b20e5SPeter Holm	[ $s -ne 0 ] && break
110*ce7b20e5SPeter Holm	grep -Eq "IS CLEAN|MARKED CLEAN" $log || { s=102; break; }
111*ce7b20e5SPeter Holmdone
112*ce7b20e5SPeter Holm[ $s -eq 101 ] && s=0 # Ignore CLEANish problem for now
113*ce7b20e5SPeter Holmif [ $s -eq 0 ]; then
114*ce7b20e5SPeter Holm	mount /dev/md$mdstart.nop $mntpoint
115*ce7b20e5SPeter Holm	cp -R /usr/include $mntpoint
116*ce7b20e5SPeter Holm	dd if=/dev/zero of=$mntpoint/big bs=1m count=10 status=none
117*ce7b20e5SPeter Holm	find $mntpoint/* -delete
118*ce7b20e5SPeter Holm
119*ce7b20e5SPeter Holm	# Check the RO snapshots
120*ce7b20e5SPeter Holm	for f in $mntpoint/.snap/*; do
121*ce7b20e5SPeter Holm		c=0
122*ce7b20e5SPeter Holm		for i in `jot 5`; do
123*ce7b20e5SPeter Holm			echo "fsck_ffs -fy $f"
124*ce7b20e5SPeter Holm			fsck_ffs -fy $f > $log 2>&1; s=$?
125*ce7b20e5SPeter Holm			grep -q CLEAN $log && grep -q "MODIFIED" $log && c=$((c+=1))
126*ce7b20e5SPeter Holm			grep -Eq "FILE SYSTEM WAS MODIFIED" $log || break
127*ce7b20e5SPeter Holm		done
128*ce7b20e5SPeter Holm		[ $c -gt 1 ] &&
129*ce7b20e5SPeter Holm		    { echo "Note: snapshot $i marked clean+modified $c times out of $i fsck runs"; s=201; }
130*ce7b20e5SPeter Holm		[ $s -ne 0 ] && break
131*ce7b20e5SPeter Holm		grep -Eq "IS CLEAN|MARKED CLEAN" $log ||
132*ce7b20e5SPeter Holm		    { s=202; tail -10 $log; break; }
133*ce7b20e5SPeter Holm	done
134*ce7b20e5SPeter Holm	umount $mntpoint
135*ce7b20e5SPeter Holm	mdconfig -d -u $mdstart
136*ce7b20e5SPeter Holm	rm -f $diskimage $log
137*ce7b20e5SPeter Holmfi
138*ce7b20e5SPeter Holmexit $s
139