[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