[Ocfs2-test-devel] [PATCH 1/7] single_run: Add single_run-WIP
tristan.ye
tristan.ye at oracle.com
Sun Aug 23 22:02:50 PDT 2009
It looks nice to me except some comments inlined.
Sunil Mushran Wrote:
> single_run-WIP is a work-in-progress single_run.
>
> Signed-off-by: Sunil Mushran <sunil.mushran at oracle.com>
> ---
> programs/python_common/Makefile | 2 +
> programs/python_common/single_run-WIP.sh | 572 ++++++++++++++++++++++++++++++
> vendor/common/ocfs2-test.spec-generic.in | 1 +
> 3 files changed, 575 insertions(+), 0 deletions(-)
> create mode 100755 programs/python_common/single_run-WIP.sh
>
> diff --git a/programs/python_common/Makefile b/programs/python_common/Makefile
> index b95d675..289b1fd 100644
> --- a/programs/python_common/Makefile
> +++ b/programs/python_common/Makefile
> @@ -14,6 +14,7 @@ DIST_FILES = config_py.skel \
> setup.sh \
> o2tf.py \
> single_run.sh \
> + single_run-WIP.sh \
> multiple_run.sh \
> remote_mount.py \
> remote_umount.py \
> @@ -24,6 +25,7 @@ BIN_EXTRA = config_py.skel \
> config_shell.skel \
> o2tf.py \
> single_run.sh \
> + single_run-WIP.sh \
> remote_mount.py \
> remote_umount.py \
> command.py \
> diff --git a/programs/python_common/single_run-WIP.sh b/programs/python_common/single_run-WIP.sh
> new file mode 100755
> index 0000000..50ce38c
> --- /dev/null
> +++ b/programs/python_common/single_run-WIP.sh
> @@ -0,0 +1,572 @@
> +#!/bin/bash
> +#
> +
> +PATH=$PATH:/sbin # Add /sbin to the path for ocfs2 tools
> +RUNTIME=300 # seconds
> +APP=`basename ${0}`
> +USERNAME=`/usr/bin/whoami`
> +DATE=`which date`
> +HOSTNAME=`which hostname`
> +SUDO="`which sudo` -u root"
> +DEBUGFS_BIN="`which sudo` -u root `which debugfs.ocfs2`"
> +TUNEFS_BIN="`which sudo` -u root `which tunefs.ocfs2`"
> +MKFS_BIN="`which sudo` -u root `which mkfs.ocfs2`"
> +CUT=`which cut`
> +AWK=`which awk`
> +MOUNT=`which mount`
> +UMOUNT=`which umount`
> +ECHO=`which echo`
> +MKDIR=`which mkdir`
> +CAT=`which cat`
> +MD5SUM=`which md5sum`
> +WGET=`which wget`
> +DWNLD_PATH="http://oss.oracle.com/~smushran/ocfs2-test"
> +KERNEL_TARBALL="linux-kernel.tar.gz"
> +KERNEL_TARBALL_CHECK="${KERNEL_TARBALL}.md5sum"
> +
> +# log_message message
> +log_message()
> +{
> + ${ECHO} "`${DATE} +\"%F %H:%M:%S\"` $@" >> ${LOGFILE}
> +}
> +
> +log_start()
> +{
> + log_message $@
> + START=$(date +%s)
> +}
> +
> +# log_end $?
> +log_end()
> +{
> + if [ "$#" -lt "1" ]; then
> + ${ECHO} "Error in log_end()"
> + exit 1
> + fi
> +
> + END=$(date +%s)
> + DIFF=$(( ${END} - ${START} ))
> +
> + if [ ${1} -ne 0 ]; then
> + log_message "FAILED (${DIFF} secs)"
> + else
> + log_message "PASSED (${DIFF} secs)"
> + fi
> +
> + START=0
> +}
> +
> +# get_kernel_source $LOGDIR $DWNLD_PATH $KERNEL_TARBALL $KERNEL_TARBALL_CHECK
> +get_kernel_source()
> +{
> + if [ "$#" -lt "4" ]; then
> + ${ECHO} "Error in get_kernel_source()"
> + exit 1
> + fi
> +
> + logdir=$1
> + dwnld_path=$2
> + kernel_tarball=$3
> + kernel_tarball_check=$4
> +
> + cd ${logdir}
> + ${WGET} ${dwnld_path}/${kernel_tarball_check}
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR downloading ${dwnld_path}/${kernel_tarball_check}"
> + cd -
> + exit 1
> + fi
> +
> + ${WGET} ${dwnld_path}/${kernel_tarball}
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR downloading ${dwnld_path}/${kernel_tarball}"
> + cd -
> + exit 1
> + fi
> +
> + ${MD5SUM} -c ${kernel_tarball_check}
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR ${kernel_tarball_check} check failed"
> + cd -
> + exit 1
> + fi
> + cd -
> +}
> +
> +# get_device_info ${DEVICE}
> +get_device_info()
> +{
> + if [ "$#" -lt "1" ]; then
> + ${ECHO} "Error in get_device_info()"
> + exit 1
> + fi
>
Should add:
local DEVICE=${1}
> +
> + LABEL=`${TUNEFS_BIN} -q -Q "label=%V\n" ${1}|${CUT} -f2 -d"="`
>
replace ${1} as ${DEVICE} instead.
> + if [ "X${LABEL}" == "X" ]; then
> + LABEL="testlabel"
> + fi
> +
> + SLOTS=`${TUNEFS_BIN} -q -Q "slots=%N\n" ${DEVICE}|${CUT} -f2 -d"="`
> +
> + CLUSTERSIZE_BITS=`${DEBUGFS_BIN} -R stats ${DEVICE} | grep Bits| ${AWK} -F" " '{print $8}'`
> + BLOCKSIZE_BITS=`${DEBUGFS_BIN} -R stats ${DEVICE} | grep Bits| ${AWK} -F" " '{print $4}'`
> +
> + CLUSTERSIZE=`${ECHO} 2^${CLUSTERSIZE_BITS} |bc`
> + BLOCKSIZE=`${ECHO} 2^${BLOCKSIZE_BITS} |bc`
>
You'd better define the globals CLUSTERSIZE and BLOCKSIZE at the very
beginning.
> +}
> +
> +# do_format() ${BLOCKSIZE} ${CLUSTERSIZE} ${FEATURES} ${DEVICE}
> +do_format() {
> + if [ "$#" -lt "4" ]; then
> + ${ECHO} "Error in do_format() $@"
> + exit 1
> + fi
> +
> + blocksize=$1
> + clustersize=$2
> + features=$3
> + device=$4
> +
> +# log_message "format ${device}"
> +
> + ${MKFS_BIN} -x -b ${blocksize} -C ${clustersize} --fs-features=${features} \
> + -N 1 -L single_run -M local ${device} >/dev/null
>
Maybe error info can be redirected to the LOGFILE, we therefore got the
reason why mkfs failed...
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR: mkfs.ocfs2 -b ${blocksize} -C ${clustersize} " \
> + "--fs-features=${features} -N 1 -L single_run -M local ${device}"
> + exit 1
> + fi
> +
> + get_device_info ${device}
> +}
>
The do_format() func can be enhanced to also take label and slot number
as arguments.
> +
> +# do_mount ${DEVICE} ${MOUNTPOINT} ${MOUNTOPTS}
> +do_mount() {
> + if [ "$#" -lt "3" ]; then
> + ${ECHO} "Error in do_mount()"
> + exit 1
> + fi
> +
> + device=$1
> + mountpoint=$2
> + mountopts=$3
> +
> +# log_message "mount ${DEVICE} ${MOUNTPOINT}"
> +
> + ${MOUNT} -o ${mountopts} ${device} ${mountpoint} >/dev/null
>
Can the error info be redirected to logfile?
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR: mount -o ${mountopts} ${device} ${mountpoint}"
> + exit 1
> + fi
> +}
> +
> +# do_umount ${MOUNTPOINT}
> +do_umount() {
> + if [ "$#" -lt "1" ]; then
> + ${ECHO} "Error in do_umount()"
> + exit 1
> + fi
> +
> + mountpoint=$1
> +
> +# log_message "umount ${MOUNTPOINT}"
> +
> + ${UMOUNT} ${mountpoint}
> + if [ $? -ne 0 ]; then
> + ${ECHO} "ERROR: umount ${mountpoint}"
> + exit 1
> + fi
> +}
> +
> +# run_aiostress ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +run_aiostress()
> +{
> + log_message "run_aiostress" $@
> + if [ "$#" -lt "4" ]; then
> + echo "Error in run_aiostress()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> +
> + workdir=${mountpoint}/testme
> + blocksize=4096
> + clustersize=8192
> + features="sparse,unwritten,inline-data"
>
It will be more secure to add 'local' tag to above variable definition...
> +
> + for mopt in writeback ordered
> + do
> + mountopts="data=${mopt}"
> +
> + log_start "aio-stress" ${mountopts}
> +
> + do_format ${blocksize} ${clustersize} ${features} ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> + ${MKDIR} -p ${workdir}
> +
> + F1="${workdir}/aiostress1.dat"
> + F2="${workdir}/aiostress2.dat"
> + F3="${workdir}/aiostress3.dat"
> + F4="${workdir}/aiostress4.dat"
> +
> + outlog=${logdir}/aiostress_${mopt}.log
> +
> + ${bindir}/aio-stress -a 4k -b 32 -i 16 -O -l -L -t 8 -v ${F1} ${F2} ${F3} ${F4} >${outlog} 2>&1
> + RC=$?
> +
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> + done
> +}
> +
> +# run_buildkernel ${BINDIR} ${LOGDIR} ${DEVICE} {MOUNTPOINT} ${KERNELSRC}
> +run_buildkernel()
> +{
> + log_message "run_buildkernel" $@
> + if [ "$#" -lt "5" ]; then
> + echo "Error in run_buildkernel()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> + kernelsrc=$5
> +
> + node=`${HOSTNAME}`
> + workdir=${mountpoint}/testme
> + blocksize=4096
> + clustersize=4096
> + features="sparse,unwritten,inline-data"
>
also add 'local' tag to above local variables.
> +
> + for mopt in writeback ordered
> + do
> + mountopts="data=${mopt}"
> +
> + do_format ${blocksize} ${clustersize} ${features} ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> + ${MKDIR} -p ${workdir}
> +
> + log_start "buildkernel" ${mountopts}
> +
> + outlog=${logdir}/buildkernel_${mopt}.log
> +
> + ${bindir}/buildkernel.py -e -d ${workdir} -t ${kernelsrc} -n ${node} -l ${outlog}.1
> + RC=$?
> + if [ ${RC} -eq 0 ]; then
> + ${bindir}/buildkernel.py -d ${workdir} -t ${kernelsrc} -n ${node} -l ${outlog}.2
> + RC=$?
> + fi
> +
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> + done
> +}
> +
> +# run_filesizelimits ${BINDIR} ${LOGDIR} ${DEVICE} {MOUNTPOINT}
> +run_filesizelimits()
> +{
> + log_message "run_filesizelimits" $@
> + if [ "$#" -lt "4" ]; then
> + echo "Error in run_filesizelimits()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> +
> + mountopts=defaults
> +
> + workdir=${mountpoint}/testme
> +
> + if [ `uname -m` == "i686" ]; then
> + bitsperlong=32
> + else
> + bitsperlong=64
> + fi
> +
> + log_start "check_file_size_limits"
> +
> + do_format 4096 4096 sparse,unwritten,inline-data ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> + ${MKDIR} -p ${workdir}
> +
> + file="${workdir}/filesizelimits.dat"
> + outlog=${logdir}/filesizelimits.log
> +
> + ${bindir}/check_file_size_limits -B ${bitsperlong} -b ${BLOCKSIZE_BITS} \
> + -c ${CLUSTERSIZE_BITS} ${file} >${outlog} 2>&1
> + RC=$?
> +
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> +}
> +
> +# run_fillverifyholes ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +run_fillverifyholes()
> +{
> + log_message "run_fillverifyholes" $@
> + if [ "$#" -lt "4" ]; then
> + echo "Error in run_fillverifyholes()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> +
> + workdir=${mountpoint}/testme
> +
> + varfile=${logdir}/fillverifyholes.txt
> +
> + ${CAT} > ${varfile} <<EOF
> +2048 4096 nosparse,nounwritten,noinline-data data=ordered
> +2048 65536 sparse,unwritten,inline-data data=writeback
> +4096 4096 sparse,unwritten,inline-data data=ordered
> +4096 8192 nosparse,nounwritten,noinline-data data=writeback
> +4096 131072 nosparse,nounwritten,noinline-data data=ordered
> +4096 1048576 sparse,unwritten,inline-data data=writeback
> +EOF
> + if [ $? != 0 ]; then
> + ${ECHO} "ERROR writing ${varfile}"
> + exit 1
> + fi
> +
> + i=0
> + ${CAT} ${varfile} | while read LINE
> + do
> + blocksize=`echo ${LINE} | cut -f1 -d' '`
> + clustersize=`echo ${LINE} | cut -f2 -d' '`
> + features=`echo ${LINE} | cut -f3 -d' '`
> + mountopts=`echo ${LINE} | cut -f4 -d' '`
> +
> + log_start "fill_verify_holes" ${blocksize} ${clustersize} ${features} ${mountopts}
> +
> + outlog=${logdir}/fillverifyholes_${i}.log
> + ldir=${logdir}/fillverifyholes_${i}
> + ${MKDIR} -p ${ldir}
> +
> + do_format ${blocksize} ${clustersize} ${features} ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> + ${MKDIR} -p ${workdir}
> +
> + ${bindir}/burn-in.sh -b ${bindir} -l ${ldir} -c 10 -d ${workdir} -i 100 -s 5000000 >${outlog} 2>&1
> + RC=$?
> +
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> +
> + i=$[$i+1]
> + done
> +}
> +
> +# run_mmaptruncate ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +run_mmaptruncate()
> +{
> + log_message "run_mmaptruncate" $@
> + if [ "$#" -lt "4" ]; then
> + echo "Error in run_mmaptruncate()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> +
> + runtime=300
> + workfile=${mountpoint}/mmaptruncate.txt
> + varfile=${logdir}/mmaptruncate.conf
> +
> + ${CAT} > ${varfile} <<EOF
> +2048 4096 nosparse,nounwritten,noinline-data data=ordered
> +2048 65536 sparse,unwritten,inline-data data=writeback
> +4096 4096 sparse,unwritten,inline-data data=ordered
> +4096 8192 nosparse,nounwritten,noinline-data data=writeback
> +4096 131072 sparse,unwritten,inline-data data=ordered
> +4096 1048576 sparse,unwritten,inline-data data=writeback
> +EOF
> + if [ $? != 0 ]; then
> + ${ECHO} "ERROR writing ${varfile}"
> + exit 1
> + fi
> +
> + ${CAT} ${varfile} | while read LINE
> + do
> + blocksize=`echo ${LINE} | cut -f1 -d' '`
> + clustersize=`echo ${LINE} | cut -f2 -d' '`
> + features=`echo ${LINE} | cut -f3 -d' '`
> + mountopts=`echo ${LINE} | cut -f4 -d' '`
> +
> + log_start "mmap_truncate" ${blocksize} ${clustersize} ${features} ${mountopts}
> +
> + do_format ${blocksize} ${clustersize} ${features} ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> +
> + ${bindir}/mmap_truncate -c ${CLUSTERSIZE_BITS} -s ${runtime} ${workfile}
> + RC=$?
> +
> + sleep 10
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> + done
> +}
> +
> +# run_renamewriterace ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +run_renamewriterace()
> +{
> + log_message "run_renamewriterace" $@
> + if [ "$#" -lt "4" ]; then
> + echo "Error in run_renamewriterace()"
> + exit 1
> + fi
> +
> + bindir=$1
> + logdir=$2
> + device=$3
> + mountpoint=$4
> +
> + workdir=${mountpoint}/testme
> + blocksize=4096
> + clustersize=4096
> + features="sparse,unwritten,inline-data"
> +
> + for mopt in writeback ordered
> + do
> + mountopts="data=${mopt}"
> +
> + log_start "rename_write_race" ${mountopts}
> +
> + do_format ${blocksize} ${clustersize} ${features} ${device}
> + do_mount ${device} ${mountpoint} ${mountopts}
> + ${MKDIR} -p ${workdir}
> +
> + outlog=${logdir}/renamewriterace_${mopt}.log
> +
> + ${bindir}/rename_write_race.sh -d ${workdir} -i 10000 >${outlog} 2>&1
> + RC=$?
> +
> + do_umount ${mountpoint}
> +
> + log_end ${RC}
> + done
> +}
> +
> +#
> +#
> +# MAIN
> +#
> +#
> +
> +usage()
> +{
> + ${ECHO} "usage: ${APP} [-k kerneltarball] -m mountpoint -l logdir -d device"
> + exit 1
> +}
> +
> +while getopts "d:m:k:l:h?" args
> +do
> + case "$args" in
> + d) DEVICE="$OPTARG";;
> + m) MOUNTPOINT="$OPTARG";;
> + k) KERNELSRC="$OPTARG";;
> + l) O2TDIR="$OPTARG";;
> + h) USAGE="yes";;
> + ?) USAGE="yes";;
>
Why not directly use:
h) usage;;
?) usage;;
> + esac
> +done
> +
> +
> +if [ ! -z ${USAGE} ]; then
> + usage
> +fi
> +
> +RUNDATE=`${DATE} +%F_%H:%M`
> +
> +if [ -f ./config.sh ] ; then
> + . ./config.sh
>
It will be better as follows in case we didn't execute the binary from
working directory.
if [ -f `dirname ${0}`/config.sh ]; then
. `dirname ${0}`/config.sh
fi
> +else
> +# O2TDIR=/usr/local/ocfs2-test
> + MPIDIR=/usr/lib/openmpi/1.2.7-gcc/bin
> + BINDIR=/usr/local/ocfs2-test/bin/
> +# COMMONDIR=${O2TDIR}/common
> +# WORKFILESDIR=${O2TDIR}/workfiles
> +# LIBDIR=${O2TDIR}/lib
> + LOGDIR=${O2TDIR}/${RUNDATE}
> + LOGFILE=${LOGDIR}/single_run.log
> +# MPIHOSTS=${O2TDIR}/tmp/mpihosts
> +# MPIRUN=${MPIDIR}/mpirun
> +# NPROC=1
> +fi
> +
> +if [ -z ${DEVICE} ] ; then
> + ${ECHO} "ERROR: No device"
> + usage
> +elif [ ! -b ${DEVICE} ] ; then
> + ${ECHO} "ERROR: Invalid device ${DEVICE}"
> + exit 1
> +fi
> +
> +if [ -z ${MOUNTPOINT} ] ; then
> + ${ECHO} "ERROR: No mountpoint"
> + usage
> +elif [ ! -d ${MOUNTPOINT} ] ; then
> + ${ECHO} "ERROR: Invalid mountpoint ${MOUNTPOINT}"
> + exit 1
> +fi
> +
> +if [ -z ${O2TDIR} ]; then
> + ${ECHO} "ERROR: No logdir"
> + usage
> +fi
> +
> +if [ ! -d ${O2TDIR} ]; then
> + mkdir -p ${O2TDIR}
> +fi
> +
> +${MKDIR} -p ${LOGDIR}
> +
> +if [ -z ${KERNELSRC} ]; then
> + get_kernel_source $LOGDIR $DWNLD_PATH $KERNEL_TARBALL $KERNEL_TARBALL_CHECK
> + KERNELSRC=${LOGDIR}/${KERNEL_TARBALL}
> +fi
> +
> +if [ ! -f ${KERNELSRC} ]; then
> + ${ECHO} "No kernel source"
> + usage
> +fi
> +
> +STARTRUN=$(date +%s)
> +log_message "*** Start Single Node test ***"
> +
> +${ECHO} "Output log is ${LOGFILE}"
> +
> +run_fillverifyholes ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +
> +run_renamewriterace ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +
> +run_aiostress ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +
> +run_filesizelimits ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +
> +run_mmaptruncate ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT}
> +
> +run_buildkernel ${BINDIR} ${LOGDIR} ${DEVICE} ${MOUNTPOINT} ${KERNELSRC}
> +
> +ENDRUN=$(date +%s)
> +
> +DIFF=$(( ${ENDRUN} - ${STARTRUN} ))
> +log_message "Total Runtime ${DIFF} seconds"
> +log_message "*** End Single Node test ***"
> diff --git a/vendor/common/ocfs2-test.spec-generic.in b/vendor/common/ocfs2-test.spec-generic.in
> index bae26d2..b37e870 100644
> --- a/vendor/common/ocfs2-test.spec-generic.in
> +++ b/vendor/common/ocfs2-test.spec-generic.in
> @@ -113,6 +113,7 @@ rm -rf "$RPM_BUILD_ROOT"
> %{_installdir}/bin/open_delete.py
> %{_installdir}/bin/o2tf.py
> %{_installdir}/bin/single_run.sh
> +%{_installdir}/bin/single_run-WIP.sh
> %{_installdir}/bin/remote_mount.py
> %{_installdir}/bin/remote_umount.py
> %{_installdir}/bin/command.py
>
More information about the Ocfs2-test-devel
mailing list