On Thu, Aug 29, 2002 at 07:23:25PM -0400, Greg Freemyer wrote:
>
> Nathan,
>
> I have made a second attempt at the script.
>
> I think it addresses your concerns.
now im going to nitpick.
> Someone still needs to do the TODO items, but they don't come up in my
> environment because $SCRATCH_DEV is a LV for me.
>
> Steve Lord has run my previous version to some extent, but I don't know if he
> did it via check, or he just ran the script.
>
> Greg Freemyer
> Internet Engineer
> Deployment and Integration Specialist
> Compaq ASE - Tru64 v4, v5
> Compaq Master ASE - SAN Architect
> The Norcross Group
> www.NorcrossGroup.com
>
> ======== 068.out
> QA output created by 068
> SUCCESS, COMPLETED ALL ITERATIONS WITH NO TIME OUTS!!!!!!!!!!!!
> Cleanup beginning
> ======== 068
> #! /bin/sh
> # XFS QA Test No. 068
> # $Id: 1.1 $
> #
> # creator
> owner=freemyer@xxxxxxxxxxxxxxxxx
>
> seq=`basename $0`
> echo "QA output created by $seq"
>
> here=`pwd`
> tmp=/tmp/$$
very predictable, use tmp=`mktemp -d` || exit 1
> status=1 # failure is the default!
>
> GENERATE_IO_LOAD=TRUE # If "FALSE", the dd load loop is skipped
> DELAY_BETWEEN_ITERATIONS=10
> ITERATIONS=20
> VG=/dev/VGscratch
> #SCRATCH_DEV=/dev/xxxx # Only needed if running by hand, ie. check
> sets these
> #SCRATCH_MNT=/scratch # Only needed if running by hand, ie. check
> sets these
> SCRATCH_SNAP_MNT=$tmp.scratch_snap
quote this:
SCRATCH_SNAP_MNT="$tmp.scratch_snap"
>
>
> _cleanup()
> {
>
> echo Cleanup beginning
>
> rm $tmp.running > /dev/null 2>&1
> xfs_freeze -u $SCRATCH_MNT
quote these variables, you cannot be 100% certain they will not
contain metacharacters or embedded spaces.
> 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
>
> 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 -f $tmp.* # if we ever use tmp files
quote, see above.
> trap 0 1 2 3 15
> exit $status
> }
>
> trap "_cleanup" 0 1 2 3 15
>
>
> # get standard environment, filters and checks
> . ./common.rc
> . ./common.filter
>
> if [ -e $SCRATCH_SNAP_MNT ]; then rm -rf $SCRATCH_SNAP_MNT; fi
NEVER EVER *EVER* rm -rf a unquoted variable. apple did this in a
upgrade script and rm -rf'ed / to many users systems.
> mkdir $SCRATCH_SNAP_MNT
quote, see above.
> if [ $LVM = false ]; then _notrun "This test requires the kernel have LVM or
> EVMS present. (The EVMS test is still TBD)."; fi
quote these variables, if $LVM somehow ends up null you will get a
shell syntax error.
> # Mount the LV
> mkdir $SCRATCH_MNT > /dev/null 2&>1
>
> mount $VG/scratch $SCRATCH_MNT
>
> if [ $GENERATE_IO_LOAD != FALSE ];
quote all of these, see above.
> 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
ditto
> #setup an infinite loop to copy the large file, thus generating heavy
> i/o
>
> touch $tmp.running
you should put this tmpfile in a secure directory (created by mktemp -d)
> while [ -f $tmp.running ]
> do
> dd if=$SCRATCH_MNT/dummy of=$SCRATCH_MNT/junk bs=64k > /dev/null
> 2>&1
> rm $SCRATCH_MNT/junk # This forces metadata updates the
> next time around
> sync
> done &
> fi
>
> ii=1
>
> while [ $ii -le $ITERATIONS ]
quote, see above
> do
>
> # echo $ii Usefull if your are running interactive, but not from
> the xfs test scripts
printf "\r$ii" might be better for this.
> #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
quote, see above
> 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=$?
> if [ $ret != 0 ] ; then
> echo snapshot creation for $SCRATCH_MNT failed with
> return code $ret
> fi
> ) &
ditto ditto ditto.
> 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 unknow 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`
> 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
>
> done
see above, much more quoting.
> # 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.
>
you can argue that im being pedantic and the lack of quoting will
probably not matter in this script, but in some cases its just too
dangerous not to. proper quoting will make your script much more
solid and less prone to screwy behavior. also you should never assume
that there are not hostile users messing with /tmp.
--
Ethan Benson
http://www.alaska.net/~erbenson/
-- Attached file included as plaintext by Ecartis --
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.6 (GNU/Linux)
Comment: For info see http://www.gnupg.org
iEYEARECAAYFAj1vHkMACgkQJKx7GixEevweJgCfdNs2BVhZcg6MUzOazlVrJlXa
A90AnjhtygOAx/NN9gbrI2LSuwUCnDVj
=LWj5
-----END PGP SIGNATURE-----
|