xfstests 068: Add mmap load
[xfstests-dev.git] / 068
diff --git a/068 b/068
index accc4fd38bfea44885fa978137235a6cb1f2cd4f..a641e2f7d4f12df650eb8150a068c0cb42f7f603 100755 (executable)
--- a/068
+++ b/068
@@ -1,99 +1,46 @@
-#! /bin/sh
-# XFS QA Test No. 068
-# $Id: 068,v 1.1 2002/09/02 06:04:01 nathans Exp $
+#! /bin/bash
+# FSQA Test No. 068
 #
-# Test Linux LVM snapshot creation
-#
-# The timing and placement of kills and waits is particularily sensitive.
-# Don't change them unless you want to spend some time getting it right again.
+# Test case to reproduce xfs_freeze hang under filsystem load.
+# The fail case for this test is a hang on an xfs_freeze.
 #
 #-----------------------------------------------------------------------
-# Copyright (c) 2000, 2002 Silicon Graphics, Inc.  All Rights Reserved.
-# 
-# This program is free software; you can redistribute it and/or modify it
-# under the terms of version 2 of the GNU General Public License as
+# Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
 # published by the Free Software Foundation.
-# 
-# This program is distributed in the hope that it would be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# 
-# Further, this software is distributed without any warranty that it is
-# free of the rightful claim of any third person regarding infringement
-# or the like.  Any license provided herein, whether implied or
-# otherwise, applies only to this software file.  Patent licenses, if
-# any, provided herein do not apply to combinations of this program with
-# other software, or any other product whatsoever.
-# 
-# You should have received a copy of the GNU General Public License along
-# with this program; if not, write the Free Software Foundation, Inc., 59
-# Temple Place - Suite 330, Boston MA 02111-1307, USA.
-# 
-# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
-# Mountain View, CA  94043, or:
-# 
-# http://www.sgi.com 
-# 
-# For further information regarding this notice, see: 
-# 
-# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+#
+# This program is distributed in the hope that it would be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write the Free Software Foundation,
+# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+#
 #-----------------------------------------------------------------------
 #
 # creator
-owner=freemyer@NorcrossGroup.com
+owner=ajones@sgi.com
 
 seq=`basename $0`
 echo "QA output created by $seq"
 
 here=`pwd`
-tmp=`mktemp -d /tmp/xfstest.XXXXXX` || exit 1
-status=1       # failure is the default!
+tmp=/tmp/$$
+status=0       # success is the default!
 
-# Either "dd" or "fsstress" can be used to generate io load.
-# Setting both to "FALSE" tests with no io load.
-GENERATE_IO_LOAD_VIA_DD=TRUE
-GENERATE_IO_LOAD_VIA_FSSTRESS=TRUE
-DELAY_BETWEEN_ITERATIONS=10
-#ITERATIONS=10000
-ITERATIONS=2
-
-VG=/dev/VGscratch
-SCRATCH_SNAP_MNT="$tmp/scratch_snap"
-
-# Only needed if running by hand,  ie.  check sets these
-#SCRATCH_LVM_DEV=/dev/xxxx
-#SCRATCH_MNT=/scratch
+ITERATIONS=10
 
 _cleanup()
 {
-       echo Cleanup beginning
-
-       rm "$tmp/running" > /dev/null 2>&1
-       xfs_freeze -u "$SCRATCH_MNT"
-
-       sleep 10      # Give the dd loop time to finish
-
-       # Comment out unless needed.
-       # If needed, wrap with logic to ensure the FS is mounted.
-       # Kill off any other possible stray stragglers that may be out there.
-       # There should not be any.
-       #fuser -k -m "$SCRATCH_SNAP_MNT/dummy"     >/dev/null 2>&1
-       #fuser -k -m "$SCRATCH_MNT/dummy"         >/dev/null 2>&1
+    cd /
+    _cleanup_testdir
 
-       wait
-
-       umount "$SCRATCH_SNAP_MNT" > /dev/null 2>&1
-       rmdir "$SCRATCH_SNAP_MNT" > /dev/null 2>&1
-       umount "$SCRATCH_MNT" > /dev/null 2>&1
-
-       lvremove -f "$VG/scratch_snap" > /dev/null 2>&1
-       lvremove -f "$VG/scratch" > /dev/null 2>&1
-
-#TODO   vgremove "$VG"
-
-       rm -rf "$tmp"   # if we ever use tmp files
-       trap 0 1 2 3 15
-       exit $status
+    trap 0 1 2 3 15
+    exit $status
 }
 
 trap "_cleanup" 0 1 2 3 15
@@ -103,169 +50,90 @@ trap "_cleanup" 0 1 2 3 15
 . ./common.rc
 . ./common.filter
 
-[ -e "$SCRATCH_SNAP_MNT" ] && rm -rf "$SCRATCH_SNAP_MNT"
-mkdir "$SCRATCH_SNAP_MNT"
-
-#Verify we have the lvm user tools
-[ -x /sbin/lvcreate ] || _notrun "lvcreate utility is not installed in /sbin"
-[ -x /sbin/lvremove ] || _notrun "lvremove utility is not installed in /sbin"
-
-# If the above fails for LVM 2, the below may be useful notes
-#    try "lvm vgdisplay --version" and look for a > 1.9x version number, eg,
-# 
-#     LVM version:     1.95.10-cvs (2002-05-31)
-#     Library version: 0.96.03-ioctl-cvs (2002-06-27)
-#     Driver version:  1.0.3
-
-
-LVM=false
-
-# Check if LVM 1 is in the kernel
-if grep lvm /proc/devices > /dev/null 2>&1; then LVM=true; fi
-
-# Check if LVM 2 is in the kernel
-if grep device-mapper /proc/devices > /dev/null 2>&1; then LVM=true; fi
-
-# Check if EVMS is in the kernel
-#TODO   # I don't know how to do this one.
-
-[ "$LVM" = false ] && _notrun "LVM is not present in the running kernel."
-
-
 # real QA test starts here
+_supported_fs generic
+_supported_os Linux IRIX
 
-# Create a PV set from the scratch partition
-#TODO # (I don't know if this is needed.and it is dangerous because it intentionally deletes the partition table!!! 
-#TODO # dd if=/dev/zero of="$SCRATCH_LVM_DEV" bs=512 count=1
-#TODO # pvcreate "$SCRATCH_LVM_DEV"
-
-# Create a VG from the PV
-#TODO # vgcreate "$VG" "$SCRATCH_LVM_DEV"
+_require_scratch
+_require_freeze
 
-# Create a LV in the VG to snapshot
-#TODO # lvcreate -L 2G -n scratch "$VG"
+echo "*** init FS"
 
-# Mount the LV
-mkdir "$SCRATCH_MNT" > /dev/null 2&>1
+rm -f $seq.full
+umount $SCRATCH_DEV >/dev/null 2>&1
+echo "*** MKFS ***"                         >>$seq.full
+echo ""                                     >>$seq.full
+_scratch_mkfs                               >>$seq.full 2>&1 \
+    || _fail "mkfs failed"
+_scratch_mount                              >>$seq.full 2>&1 \
+    || _fail "mount failed"
 
-mount "$VG/scratch" "$SCRATCH_MNT"
+touch $tmp.running
 
-touch "$tmp/running"
 
-if [ "$GENERATE_IO_LOAD_VIA_DD" != FALSE ];
-then
-       # Create a large 64 Meg zero filled file on the LV
-       dd if=/dev/zero of=$SCRATCH_MNT/dummy bs=64k count=1000 >/dev/null 2>&1
-
-       # Setup infinite loop copying the large file, thus generating heavy I/O
-       touch "$tmp/running"
-       while [ -f "$tmp/running" ]
-       do
-               dd if="$SCRATCH_MNT/dummy" of="$SCRATCH_MNT/junk" bs=64k \
-                       > /dev/null 2>&1
-               # This forces metadata updates the next time around
-               rm "$SCRATCH_MNT/junk"
-               sync
-       done 
-fi &
-
-if [ "$GENERATE_IO_LOAD_VIA_FSSTRESS" != FALSE ];
-then
-       STRESS_DIR="$SCRATCH_MNT/fsstress_test_dir"
-       mkdir "$STRESS_DIR"
+# start fsstress loop in a background block
+{
+    STRESS_DIR="$SCRATCH_MNT/fsstress_test_dir"
+    mkdir "$STRESS_DIR"
+
+    procs=2
+    nops=200
+    while [ -f "$tmp.running" ]
+      do
+      # We do both read & write IO - not only is this more realistic,
+      # but it also potentially tests atime updates
+      $FSSTRESS_PROG -d $STRESS_DIR -p $procs -n $nops $FSSTRESS_AVOID \
+         > /dev/null 2>&1
+    done
+
+    rm -r $STRESS_DIR/*
+    rmdir $STRESS_DIR
+} &
+
+# start fstest -m loop in a background block; this gets us mmap coverage
+{
+    FSTEST_DIR="$SCRATCH_MNT/fstest_test_dir"
+    mkdir "$FSTEST_DIR"
 
-       while [ -f "$tmp/running" ]
-       do
-               # -n 10 makes this take about 10 seconds,
-               # This allows the loop to end shortly after $tmp/running
-               # is deleted
-               $here/src/fsstress -d "$STRESS_DIR" -n 10  > /dev/null 2>&1
-               sync
-       done
+    procs=2
+    while [ -f "$tmp.running" ]
+      do
+      src/fstest -m -p $FSTEST_DIR  -n $procs -f 4 > /dev/null 2>&1
+    done
 
-       rm -rf "$STRESS_DIR"
-fi &
+    rm -rf $FSTEST_DIR/*
+    rmdir $FSTEST_DIR
+} &
 
-ii=1
+i=0
+let ITERATIONS=$ITERATIONS-1
 
-while [ $ii -le "$ITERATIONS" ]
+echo | tee -a $seq.full
+while [ $i -le $ITERATIONS ]
 do
+        echo "*** iteration: $i" | tee -a $seq.full
+       echo "*** freezing \$SCRATCH_MNT" | tee -a $seq.full
+       xfs_freeze -f "$SCRATCH_MNT" | tee -a $seq.full
+       [ $? != 0 ] && echo xfs_freeze -f "$SCRATCH_MNT" failed | \
+           tee -a $seq.full
+       sleep 2
+
+       echo "*** thawing  \$SCRATCH_MNT" | tee -a $seq.full
+       xfs_freeze -u "$SCRATCH_MNT" | tee -a $seq.full
+       [ $? != 0 ] && echo xfs_freeze -u "$SCRATCH_MNT" failed | \
+           tee -a $seq.full
+       sleep 2
+
+       echo  | tee -a $seq.full
+       let i=$i+1
+done
 
-       # Useful if running interactively, but not from the xfs test scripts
-       #echo $ii
-
-       # If the VFS lock patch is present, the calls to xfs_freeze
-       # are redundant, but should cause no problems
-       #       OPTIONAL
-       xfs_freeze -f "$SCRATCH_MNT"
-       if [ $? != 0 ] ; then
-               echo xfs_freeze -f "$SCRATCH_MNT" failed
-       fi
-       (
-               lvcreate --snapshot --size 1G --name scratch_snap "$VG/scratch"\
-                       > /dev/null 2>&1
-               ret=$?
-               [ $ret != 0 ] && \
-                       echo "Snapshot $SCRATCH_MNT create failed, status=$ret"
-               fi
-       ) &
-       SNAPSHOT_shell_pid=$!
-
-       # If the Snapshot has not completed in ten minutes, kill it
-       (
-               # I have NOT figured out how to kill the sleep 600 before
-               # it exits naturally.
-               # This does not cause a problem, but it clutters the ps table.
-               sleep 600
-
-               # The kill $TIMEOUT_shell_pid keeps the below from occuring
-               echo Snapshot Lockup Occured on loop $ii
-               xfs_freeze -u "$SCRATCH_MNT"
-               kill $$
-       ) &
-       TIMEOUT_shell_pid=$!
-
-       wait "$SNAPSHOT_shell_pid"
-
-       exec 2> /dev/null               # Send the shells stderr to /dev/null
-       kill "$TIMEOUT_shell_pid"       # Cancel the timeout
-       wait "$TIMEOUT_shell_pid"       # This causes consistent shell
-                                       # notification for some unknown reason
-       exec 2>&1                       # Put it back to the same as stdout
-
-       # If the VFS lock patch is present, the calls to xfs_freeze
-       # are redundant, but should cause no problems
-       #       OPTIONAL
-       xfs_freeze -u "$SCRATCH_MNT"
-       if [ $? != 0 ] ; then
-               echo xfs_freeze -u "$SCRATCH_MNT" failed
-       fi
-       #         MANDANTORY   (end)
-
-       mount -t xfs -o ro,nouuid "$VG/scratch_snap" "$SCRATCH_SNAP_MNT"
-       if [ $? != 0 ] ; then
-               echo mount for "$SCRATCH_SNAP_MNT" failed
-       fi
-       umount "$SCRATCH_SNAP_MNT"
-       if [ $? != 0 ] ; then
-               echo umount for "$SCRATCH_SNAP_MNT" failed
-       fi
-       lvremove -f "$VG/scratch_snap" > /dev/null 2>&1
-       if [ $? != 0 ] ; then
-              echo lvremove for "$VG/scratch_snap" failed
-       fi
-
-       ii=`expr $ii + 1`
+# stop fsstress iterations
+rm $tmp.running
 
-       sleep "$DELAY_BETWEEN_ITERATIONS"      
-       # The VG seems to need time to stabalize between snapshots
-       # With LVM 1.0.3 and XFS 1.1, I have tried this at 3600 seconds
-       # and still had failures
+# wait for fsstresses to finish
+wait
 
-done
+_check_scratch_fs
 
-# success, all done
-echo SUCCESS, COMPLETED ALL ITERATIONS WITH NO TIME OUTS!!!!!!!!!!!!
-status=0
-_cleanup
-exit 1   # _cleanup should exit, so we should never get here.
+exit 1