257 lines
6.4 KiB
Bash
Executable File
257 lines
6.4 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
#
|
|
#
|
|
# Copyright (c) International Business Machines Corp., 2001
|
|
#
|
|
# 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; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will 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 to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
#***********************************************************************
|
|
#
|
|
# TEST:
|
|
# NAME: fs_inod
|
|
# FUNCTIONALITY: File system stress - inode allocation/deallocation
|
|
# DESCRIPTION: Rapidly creates and deletes files through
|
|
# multiple processes running in the background.
|
|
# The user may specify the number of subdirectories
|
|
# to create, the number of files to create (per
|
|
# subdirectory), and the number of times to repeat
|
|
# the creation/deletion cycle.
|
|
#
|
|
#========================================================================
|
|
#
|
|
# CHANGE HISTORY:
|
|
# DATE AUTHOR REASON
|
|
# 04/18/98 Dara Morgenstein Project Yeager (AIX)
|
|
# 02/08/01 Jay Inman Modified to run standalone on Linux
|
|
# 05/24/01 Jay Inman Added command line args
|
|
# 06/27/01 Jay Inman Ported from Korn to Bash
|
|
#
|
|
#***********************************************************************
|
|
|
|
|
|
#=============================================================================
|
|
# FUNCTION NAME: err_log
|
|
#
|
|
# FUNCTION DESCRIPTION: Log error
|
|
#
|
|
# PARAMETERS: None.
|
|
#
|
|
# RETURNS: None.
|
|
#=============================================================================
|
|
err_log()
|
|
{
|
|
: $((step_errors += 1))
|
|
}
|
|
|
|
|
|
#=============================================================================
|
|
# FUNCTION NAME: make_subdirs
|
|
#
|
|
# FUNCTION DESCRIPTION: Creates $numsubdirs subdirectories
|
|
#
|
|
# PARAMETERS: None.
|
|
#
|
|
# RETURNS: None.
|
|
#=============================================================================
|
|
make_subdirs ()
|
|
{
|
|
i=0;
|
|
while [ "$i" -lt "$numsubdirs" ]; do
|
|
[ -d dir$i ] || { \
|
|
echo "$0: mkdir dir$i"
|
|
mkdir -p dir$i || echo "mkdir dir$i FAILED"
|
|
}
|
|
: $((i += 1))
|
|
done;
|
|
}
|
|
|
|
|
|
#=============================================================================
|
|
# FUNCTION NAME: touch_files
|
|
#
|
|
# FUNCTION DESCRIPTION: Creates $numfiles in each of $numsubdirs directories
|
|
#
|
|
# PARAMETERS: None.
|
|
#
|
|
# RETURNS: None.
|
|
#=============================================================================
|
|
touch_files()
|
|
{
|
|
echo "$0: touch files [0-$numsubdirs]/file$numsubdirs[0-$numfiles]"
|
|
j=0;
|
|
|
|
while [ "$j" -lt "$numsubdirs" ]; do
|
|
cd dir$j
|
|
k=0;
|
|
|
|
while [ "$k" -lt "$numfiles" ]; do
|
|
>file$j$k || err_log ">file$j$k FAILED"
|
|
: $((k += 1))
|
|
done
|
|
|
|
: $((j += 1))
|
|
cd ..
|
|
done
|
|
}
|
|
|
|
|
|
#=============================================================================
|
|
# FUNCTION NAME: rm_files
|
|
#
|
|
# FUNCTION DESCRIPTION: Removes $numfiles in each $numsubdir directory
|
|
#
|
|
# PARAMETERS: None.
|
|
#
|
|
# RETURNS: None.
|
|
#=============================================================================
|
|
rm_files()
|
|
{
|
|
echo "$0: rm files [0-$numsubdirs]/file$numsubdirs[0-$numfiles]"
|
|
j=0;
|
|
|
|
while [ "$j" -lt "$numsubdirs" ]; do
|
|
cd dir$j
|
|
k=0;
|
|
|
|
while [ "$k" -lt "$numfiles" ]; do
|
|
rm -f file$j$k || err_log "rm -f file$j$k FAILED"
|
|
: $((k += 1))
|
|
done
|
|
|
|
: $((j += 1))
|
|
cd ..
|
|
done
|
|
}
|
|
|
|
|
|
#=============================================================================
|
|
# FUNCTION NAME: step1
|
|
#
|
|
# FUNCTION DESCRIPTION: multiple processes creating and deleting files
|
|
#
|
|
# PARAMETERS: None.
|
|
#
|
|
# RETURNS: None.
|
|
#=============================================================================
|
|
step1 ()
|
|
{
|
|
echo "=============================================="
|
|
echo "MULTIPLE PROCESSES CREATING AND DELETING FILES"
|
|
echo "=============================================="
|
|
|
|
echo "$0: creating dir2 subdirectories"
|
|
[ -d dir2 ] || { \
|
|
mkdir -p dir2 || end_testcase "mkdir dir2 failed"
|
|
}
|
|
cd dir2 || err_log "cd dir2 FAILED"
|
|
make_subdirs || err_log "make_subdirs on dir2 FAILED"
|
|
cd ..
|
|
|
|
echo "$0: creating dir1 subdirectories & files"
|
|
[ -d dir1 ] || { \
|
|
mkdir dir1 || abort "mkdir dir1 FAILED"
|
|
}
|
|
cd dir1 || err_log "cd dir1 FAILED"
|
|
make_subdirs || err_log "make_subdirs on dir1 FAILED"
|
|
touch_files &
|
|
pid1=$!
|
|
|
|
i=1;
|
|
while [ "$i" -le "$numloops" ]; do
|
|
echo "Executing loop $i of $numloops..."
|
|
|
|
# Added date stamps to track execution time and duration
|
|
|
|
echo "$0: cd ../dir1 & creating files"
|
|
cd ../dir1
|
|
wait $pid1
|
|
touch_files &
|
|
pid1=$!
|
|
|
|
echo "$0: cd ../dir1 & removing files"
|
|
cd ../dir1
|
|
wait $pid1
|
|
rm_files &
|
|
pid2=$!
|
|
|
|
echo "$0: cd ../dir2 & creating files"
|
|
cd ../dir2
|
|
wait $pid2
|
|
touch_files &
|
|
pid2=$!
|
|
|
|
echo "$0: cd ../dir2 & removing files"
|
|
cd ../dir2
|
|
wait $pid2
|
|
rm_files &
|
|
pid1=$!
|
|
|
|
: $((i += 1))
|
|
done
|
|
|
|
# wait for all background processes to complete execution
|
|
wait
|
|
return $step_errors
|
|
}
|
|
|
|
|
|
#=============================================================================
|
|
# MAIN
|
|
# See the description, purpose, and design of this test under TEST
|
|
# in this test's prolog.
|
|
#=============================================================================
|
|
USAGE="Usage: ./fs_inod [volumename] [numsubdirectories] [numfiles] [numloops]"
|
|
|
|
if [ $# -ne 4 ]
|
|
then
|
|
echo $USAGE
|
|
exit 2
|
|
fi
|
|
ERRORS=0
|
|
|
|
testvol=$1
|
|
numsubdirs=$2
|
|
numfiles=$3
|
|
numloops=$4
|
|
|
|
cd $testvol || exit 2
|
|
|
|
echo "FS_INODE: File system stress - inode allocation/deallocation"
|
|
echo "Volume under test: $testvol"
|
|
echo "Number of subdirectories: $numsubdirs"
|
|
echo "Number of files: $numfiles"
|
|
echo "Number of loops: $numloops"
|
|
echo "Execution begins "
|
|
date
|
|
|
|
STEPS="1"
|
|
for I in $STEPS
|
|
do
|
|
step_errors=0
|
|
step$I
|
|
if [ $? != 0 ]; then
|
|
echo "step$I failed - see above errors"
|
|
: $((ERRORS += step_errors))
|
|
fi
|
|
done
|
|
|
|
# Clean up and timestamp
|
|
rm -rf $testvol/dir*
|
|
echo "Execution completed"
|
|
date
|
|
|
|
exit $ERRORS
|