[Ocfs2-test-devel] [PATCH 8/8] defrag-test: add testing launcher script for defrag-test.

Tristan Ye tristan.ye at oracle.com
Fri Apr 15 02:01:52 PDT 2011


defrag-test.sh is a somewhat comprehensive testing launcher to offer a decent
testing scaffold by organizing testing primitives in a decent and automatic way.
it consits both single-node and multi-nodes testing mode, run the tests in a full
cluster/blocksize combination set, following are the subtestcase it provides:

	* baisc test, for sanity check.
	* reflink test, for validation on reflink files.
	* punching hole test, for validation on defraged files with holes.
	* destructive test, for data validation after nodes crash down during derag.
	* multi-nodes test, for data validation when defrags get performed among nodes.

Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
 programs/defrag-test/Makefile       |    2 +
 programs/defrag-test/defrag-test.sh |  764 +++++++++++++++++++++++++++++++++++
 2 files changed, 766 insertions(+), 0 deletions(-)
 create mode 100755 programs/defrag-test/defrag-test.sh

diff --git a/programs/defrag-test/Makefile b/programs/defrag-test/Makefile
index 12c3b50..ee75b94 100644
--- a/programs/defrag-test/Makefile
+++ b/programs/defrag-test/Makefile
@@ -22,6 +22,8 @@ MULTI_SOURCES = multi_defrager.c
 
 DIST_FILES = $(SOURCES) $(MULTI_SOURCES)
 
+BIN_EXTRA = defrag-test.sh
+
 BIN_PROGRAMS = frager verify_file defrager multi_defrager
 
 frager: frager.o
diff --git a/programs/defrag-test/defrag-test.sh b/programs/defrag-test/defrag-test.sh
new file mode 100755
index 0000000..0c8a2fb
--- /dev/null
+++ b/programs/defrag-test/defrag-test.sh
@@ -0,0 +1,764 @@
+#!/bin/bash
+#
+# vim: noexpandtab sw=8 ts=8 sts=0:
+#
+# defrag-test.sh
+#
+# description:  This script will perform a thorough single-node/multi-nodes
+#		test on ocfs2's online-defragmentation.
+#
+# Author:       Tristan Ye,     tristan.ye at oracle.com
+#
+# History:      10 Mar 2011
+#
+#
+# Copyright (C) 2011 Oracle.  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, version 2,  as published by the Free Software Foundation.
+#
+# his 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.
+#
+
+################################################################################
+# Global Variables
+################################################################################
+if [ -f `dirname ${0}`/o2tf.sh ]; then
+        . `dirname ${0}`/o2tf.sh
+fi
+
+BINDIR=`dirname ${0}`
+
+BLOCKSIZE=
+CLUSTERSIZE=
+SLOTS=0
+JOURNALSIZE=0
+BLOCKS=0
+LABELNAME=ocfs2-defrag-tests
+DEVICE=
+WORK_PLACE_DIRENT=ocfs2-defrag-tests
+WORK_PLACE=
+
+MOUNT_OPTS=
+AIO_OPT=
+
+DSCV_TEST=
+LISTENER_ADDR=
+LISTENER_PORT=
+
+VERI_TEST=
+VERI_LOG=
+
+FRAG_BIN="${BINDIR}/frager"
+DEFRAG_BIN="${BINDIR}/defrager"
+MULTI_DEFRAG_BIN="${BINDIR}/multi_defrager"
+VERIFY_FILE_BIN="${BINDIR}/verify_file"
+REFLINK_BIN="`which reflink`"
+FILL_HOLES_BIN="${BINDIR}/fill_holes"
+VERIFY_HOLES_BIN="${BINDIR}/verify_holes"
+
+DEFAULT_LOG_DIR=${O2TDIR}/log
+LOG_DIR=
+VERIFY_LOG_DIR=
+RUN_LOG_FILE=
+LOG_FILE=
+VERIFY_HOLES_LOG_FILE=
+
+MULTI_TEST=
+MPI_HOSTS=
+MPI_RANKS=
+MPI_ACCESS_METHOD="rsh"
+MPI_PLS_AGENT_ARG="-mca pls_rsh_agent rsh:ssh"
+MPI_BTL_ARG="-mca btl tcp,self"
+MPI_BTL_IF_ARG=
+
+TEST_NO=0
+TEST_PASS=0
+
+set -o pipefail
+
+################################################################################
+# Utility Functions
+################################################################################
+function f_usage()
+{
+        echo "usage: `basename ${0}` [-W] [-D] [-o logdir] <-d device> [-m multi_hosts] \
+[-a access_method] <mountpoint path>"
+        echo "       -o output directory for the logs"
+        echo "       -d block device name used for ocfs2 volume"
+        echo "       -W enable data=writeback mode"
+        echo "       -D enable destructive test"
+        echo "       <mountpoint path> specify the testing mounting point."
+        exit 1;
+
+}
+
+function f_getoptions()
+{
+        if [ $# -eq 0 ]; then
+                f_usage;
+                exit 1
+         fi
+
+         while getopts "o:DWhd:m:a:" options; do
+                case $options in
+                o ) LOG_DIR="$OPTARG";;
+                d ) DEVICE="$OPTARG";;
+		W ) MOUNT_OPTS="data=writeback";;
+		D ) DSCV_TEST="1";;
+		a ) MPI_ACCESS_METHOD="$OPTARG";;
+		m ) MULTI_TEST=1
+		    MPI_HOSTS="$OPTARG";;
+                h ) f_usage;;
+                * ) f_usage;;
+                esac
+        done
+        shift $(($OPTIND -1))
+        MOUNT_POINT=${1}
+}
+
+function f_verify_hosts()
+{
+	local -a hosts=${1}
+	local host=
+	local -i slots=0
+
+	hosts=`echo ${hosts}|tr "[,]" "[ ]"`
+
+	for host in `echo $hosts`;do
+		ping -q -w 2 $host >/dev/null 2>&1 || {
+			echo "$host is unreachable."
+			return 1
+		}
+		((slots++))
+	done
+
+	SLOTS=${slots}
+
+	return 0
+}
+
+function f_check()
+{
+        f_getoptions $*
+
+        if [ -z "${MOUNT_POINT}" ];then
+                f_usage
+        else
+                if [ ! -d ${MOUNT_POINT} ]; then
+                        echo "Mount point ${MOUNT_POINT} does not exist."
+                        exit 1
+                else
+                        if [ "`dirname ${MOUNT_POINT}`" = "/" ]; then
+                                MOUNT_POINT="`dirname ${MOUNT_POINT}``basename \
+					     ${MOUNT_POINT}`"
+                        else
+                                MOUNT_POINT="`dirname ${MOUNT_POINT}`/`basename \
+					     ${MOUNT_POINT}`"
+                        fi
+                fi
+        fi
+
+	if [ -n "${MULTI_TEST}" ];then
+		if [ -z "${MPI_HOSTS}" ];then
+			echo "please specify the required mpi hosts in terms of CSV."
+			f_usage
+		else
+			f_verify_hosts ${MPI_HOSTS} || {
+				f_usage
+			}
+
+			if [ "$MPI_ACCESS_METHOD" = "rsh" ];then
+				MPI_PLS_AGENT_ARG="-mca pls_rsh_agent rsh:ssh"
+			else
+				MPI_PLS_AGENT_ARG="-mca pls_rsh_agent ssh:rsh"
+			fi
+		fi
+
+		WORK_PLACE_DIRENT=${WORK_PLACE_DIRENT}-multi-nodes
+		LABELNAME=${LABELNAME}-multi-nodes
+	fi
+
+        LOG_DIR=${LOG_DIR:-$DEFAULT_LOG_DIR}
+	${MKDIR_BIN} -p ${LOG_DIR} || exit 1
+
+	VERIFY_LOG_DIR=${LOG_DIR}/verify_logs
+	${MKDIR_BIN} -p ${VERIFY_LOG_DIR} || exit 1
+
+        RUN_LOG_FILE="`dirname ${LOG_DIR}`/`basename ${LOG_DIR}`/`date +%F-%H-\
+%M-%S`-defrag-tests-run.log"
+        LOG_FILE="`dirname ${LOG_DIR}`/`basename ${LOG_DIR}`/`date +%F-%H-\
+%M-%S`-defrag-tests.log"
+	VERIFY_HOLES_LOG_FILE="`dirname ${LOG_DIR}`/`basename \
+${LOG_DIR}`/`date +%F-%H-%M-%S`-verify-holes.log"
+}
+
+function f_should_return()
+{
+	if [ "${1}" != "0" ];then
+		return 1
+	fi
+}
+
+function f_basic_test_one_run()
+{
+	local filename=${1}
+	local logfile=${2}
+	local start=${3}
+	local len=${4}
+	local thresh=${5}
+	local filesize=${6}
+	local chunksize=${7}
+	local reflink=${8}
+	local ignore_fileverify=${9}
+
+	local md5sum_orig=
+	local md5sum_defrag=
+	local ret=
+
+	md5sum_org=`md5sum ${filename} |awk '{print $1}'`
+	f_LogMsg ${LOG_FILE} "Defrag file ${filename} from ${start} to \
+$((${star}+${len})) with ${thresh} threshold"
+	f_LogMsg ${LOG_FILE} "CMD: ${DEFRAG_BIN} -s ${start} -l ${len} -t \
+${thresh} ${filename}"
+	${DEFRAG_BIN} -s ${start} -l ${len} -t ${thresh} ${filename} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+	md5sum_defrag=`md5sum ${file} |awk '{print $1}'`
+	f_LogMsg ${LOG_FILE} "Verify md5sum of ${filename} after defragmentation"
+	if [ "${md5sum_org}" != "${md5sum_defrag}" ];then
+		f_LogMsg ${LOG_FILE} "md5sum mismatch, original md5sum: \
+${md5sum_org}, defraged md5sum: ${md5sum_defrag}"
+		return -1
+	fi
+
+	if [ "${ignore_fileverify}" == "1" ];then
+		return 0
+	fi	
+
+	f_LogMsg ${LOG_FILE} "Verify chunks of ${filename} after defragmentation"
+	f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_FILE_BIN} -f ${filename} -o \
+${logfile} -l ${filesize} -k ${chunksize}"
+	${VERIFY_FILE_BIN} -f ${filename} -o ${logfile} -l ${filesize} -k \
+${chunksize} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	if [ -n "${reflink}" -a "${reflink}" != "0" ];then
+		f_LogMsg ${LOG_FILE} "Verify chunks of reflink:(${reflink}) after \
+defragmentation"
+		f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_FILE_BIN} -f ${reflink} -o \
+${logfile} -l ${filesize} -k ${chunksize}"
+		${VERIFY_FILE_BIN} -f ${reflink} -o ${logfile} -l ${filesize} -k \
+${chunksize} >>${LOG_FILE} 2>&1
+		ret=$?
+		f_should_return ${ret}
+	fi
+
+	return ${ret}
+}
+
+function f_get_rand()
+{
+	local min=${1}
+	local max=${2}
+	local range=
+
+	if [ "${min}" -gt "${max}" ];then
+		echo "Upper limit of f_get_rand needs to be large than lower limit"
+		return 1
+	fi
+
+	if [ "${min}" -eq "${max}" ];then
+		echo ${min}
+		return 0
+	fi
+
+	local range=$((${max}-${min}))
+
+	rand=$((${min}+${RANDOM}%${range}))
+
+	echo ${rand}
+}
+
+# num_children needs to be more than 2, num_files as well.
+function f_basic_test()
+{
+	local num_children=${1}
+	local num_files=${2}
+	local file_size=${3}
+	local chunk_size=${4}
+	local refcount_flag=${5}
+	local reflink=
+	local dir_index=
+	local dir=
+	local file_index=
+	local file=
+	local log_file=
+	local start=
+	local len=
+	local thresh=
+	local ret=
+
+	f_LogMsg ${LOG_FILE} "Generating fragmented files"
+	f_LogMsg ${LOG_FILE} "CMD: ${FRAG_BIN} -n ${num_files} -m ${num_children} \
+-l ${file_size} -k ${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} ${refcount_flag}"
+	${FRAG_BIN} -n ${num_files} -m ${num_children} -l ${file_size} -k \
+${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} ${refcount_flag}>>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	dir_index=1
+	file_index=1
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	if [ -n "${refcount_flag}" ];then
+		reflink="${WORK_PLACE}/${dir}/refile-$((${file_index}-1))"
+	fi
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} 1048576 \
+${file_size} ${chunk_size} ${reflink}
+	ret=$?
+	f_should_return ${ret}
+
+	dir_index=1
+	file_index=2
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	if [ -n "${refcount_flag}" ];then
+		reflink="${WORK_PLACE}/${dir}/refile-$((${file_index}-1))"
+	fi
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} ${file_size} \
+${file_size} ${chunk_size} ${reflink}
+	ret=$?
+	f_should_return ${ret}
+
+	dir_index=1
+	file_index=3
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	if [ -n "${refcount_flag}" ];then
+		reflink="${WORK_PLACE}/${dir}/refile-$((${file_index}-1))"
+	fi
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} $((${file_size}/2)) \
+${file_size} ${chunk_size} ${reflink}
+	ret=$?
+	f_should_return ${ret}
+
+	f_LogMsg ${LOG_FILE} "Random tests over random start, len and thresholds."
+	for dir_index in `seq 2 ${num_children}`;do
+		dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+		for file_index in `seq ${num_files}`;do
+			file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+			log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+			if [ -n "${refcount_flag}" ];then
+				reflink="${WORK_PLACE}/${dir}/refile-$((${file_index}-1))"
+			fi
+			start=`f_get_rand 0 ${file_size}`
+			len=`f_get_rand 0 $((${file_size}-${start}))`
+			thresh=`f_get_rand ${CLUSTERSIZE} ${file_size}`
+			if [ "$((file_index%2))" == "0" ];then
+				f_basic_test_one_run ${file} ${log_file} ${start} ${len} \
+${thresh} ${file_size} ${chunk_size} ${reflink}
+			else
+				f_basic_test_one_run ${reflink} ${log_file} ${start} ${len} \
+${thresh} ${file_size} ${chunk_size} ${file}
+			fi
+			ret=$?
+			f_should_return ${ret}
+		done
+	done
+
+	return ${ret}
+}
+
+function f_hole_test()
+{
+	local num_children=${1}
+	local num_files=${2}
+	local file_size=${3}
+	local chunk_size=${4}
+	local num_holes=${5}
+	local dir_index=
+	local dir=
+	local file_index=
+	local file=
+	local log_file=
+	local start=
+	local len=
+	local thresh=
+	local ret=
+
+	f_LogMsg ${LOG_FILE} "Generating fragmented files"
+	f_LogMsg ${LOG_FILE} "CMD: ${FRAG_BIN} -n ${num_files} -m ${num_children} \
+-l ${file_size} -k ${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} "
+	${FRAG_BIN} -n ${num_files} -m ${num_children} -l ${file_size} -k \
+${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	dir_index=1
+	file_index=1
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	f_LogMsg ${LOG_FILE} "Fill holes, CMD: :${FILL_HOLES_BIN} -f -o \
+${VERIFY_HOLES_LOG_FILE} -i ${num_holes} ${file} ${file_size}"
+	${FILL_HOLES_BIN} -f -o ${VERIFY_HOLES_LOG_FILE} -i ${num_holes} \
+${file} ${file_size} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+	sync
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} 1048576 \
+${file_size} ${chunk_size} 0 1
+	ret=$?
+	f_should_return ${ret}
+	f_LogMsg ${LOG_FILE} "Verify holes for defragmented ${file}"
+	f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file}"
+	${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file} || return -1
+
+	dir_index=1
+	file_index=2
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	f_LogMsg ${LOG_FILE} "Fill holes, CMD: :${FILL_HOLES_BIN} -f -o \
+${VERIFY_HOLES_LOG_FILE} -i ${num_holes} ${file} ${file_size}"
+	${FILL_HOLES_BIN} -f -o ${VERIFY_HOLES_LOG_FILE} -i ${num_holes} \
+${file} ${file_size} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+	sync
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} ${file_size} \
+${file_size} ${chunk_size} ${reflink} 0 1
+	ret=$?
+	f_should_return ${ret}
+	f_LogMsg ${LOG_FILE} "Verify holes for defragmented ${file}"
+	f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file}"
+	${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file} || return -1
+
+	dir_index=1
+	file_index=3
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+	f_LogMsg ${LOG_FILE} "Fill holes, CMD: :${FILL_HOLES_BIN} -f -o \
+${VERIFY_HOLES_LOG_FILE} -i ${num_holes} ${file} ${file_size}"
+	${FILL_HOLES_BIN} -f -o ${VERIFY_HOLES_LOG_FILE} -i ${num_holes} \
+${file} ${file_size} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+	sync
+	f_basic_test_one_run ${file} ${log_file} 0 ${file_size} $((${file_size}/2)) \
+${file_size} ${chunk_size} ${reflink} 0 1
+	ret=$?
+	f_should_return ${ret}	
+	f_LogMsg ${LOG_FILE} "Verify holes for defragmented ${file}"
+	f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file}"
+	${VERIFY_HOLES_BIN} ${VERIFY_HOLES_LOG_FILE} ${file} || return -1
+}
+
+function f_destructive_test()
+{
+	local num_children=${1}
+	local num_files=${2}
+	local file_size=${3}
+	local chunk_size=${4}
+	local reflink=
+	local dir_index=
+	local dir=
+	local file_index=
+	local file=
+	local log_file=
+	local ret=
+	local yesno=
+
+	f_LogMsg ${LOG_FILE} "Generating fragmented files"
+	f_LogMsg ${LOG_FILE} "CMD: ${FRAG_BIN} -n ${num_files} -m ${num_children} \
+-l ${file_size} -k ${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE}"
+	${FRAG_BIN} -n ${num_files} -m ${num_children} -l ${file_size} -k \
+${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	sleep 20
+
+	dir_index=1
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	f_LogMsg ${LOG_FILE} "Massive defragmentation on dir ${WORK_PLACE}/${dir} \
+before nodes down"
+	for file_index in `seq ${num_files}`;do
+		file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+		f_basic_test_one_run ${file} ${log_file} 0 ${file_size} ${file_size} \
+${file_size} ${chunk_size} &
+	done
+	while [ "${yesno}" != "Y" -a "${yesno}" != "y" ];do
+		if [ "${yesno}" == "n" -o "${yesno}" == "N" ];then
+			f_LogMsg ${LOG_FILE} "Abort crashing."
+			return $ret
+		fi
+		echo -n "Do you really want to crash the box?[Y/N]"
+		read yesno
+	done
+
+	f_LogMsg ${LOG_FILE} "Crashing the box"
+	echo b>/proc/sysrq-trigger
+}
+
+function f_multi_nodes_test()
+{
+	local num_children=${1}
+	local num_files=${2}
+	local file_size=${3}
+	local chunk_size=${4}
+	local reflink=
+	local dir_index=
+	local dir=
+	local file_index=
+	local file=
+	local log_file=
+	local start=0
+	local len=
+	local thresh=
+	local ret=
+
+	f_LogMsg ${LOG_FILE} "Generating fragmented files"
+	f_LogMsg ${LOG_FILE} "CMD: ${FRAG_BIN} -n ${num_files} -m ${num_children} \
+-l ${file_size} -k ${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE}"
+	${FRAG_BIN} -n ${num_files} -m ${num_children} -l ${file_size} -k \
+${chunk_size} -o ${VERIFY_LOG_DIR} -w ${WORK_PLACE} >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	sync
+
+	dir_index=1
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	f_LogMsg ${LOG_FILE} "Multi-nodes defragmentation on dir ${WORK_PLACE}"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} \
+${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_DEFRAG_BIN} -s 0 -l ${file_size} \
+-t ${CLUSTERSIZE} -w ${WORK_PLACE}/${dir} -r -v"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host \
+${MPI_HOSTS} ${MULTI_DEFRAG_BIN} -s 0 -l ${file_size} -t ${CLUSTERSIZE} -w \
+${WORK_PLACE}/${dir} -r -v >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	for file_index in `seq ${num_files}`;do
+		file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+		log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+		f_LogMsg ${LOG_FILE} "Verify chunks of ${file} after \
+multi-defragmentation"
+		f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_FILE_BIN} -f ${file} -o \
+${log_file} -l ${file_size} -k ${chunk_size}"
+		${VERIFY_FILE_BIN} -f ${file} -o ${log_file} -l ${file_size} \
+-k ${chunk_size} >>${LOG_FILE} 2>&1
+		ret=$?
+		f_should_return ${ret}
+	done
+
+	dir_index=2
+	dir=`ls -1 ${WORK_PLACE}|sed -n "${dir_index}p"`
+	f_LogMsg ${LOG_FILE} "Multi-nodes defragmentation on dir ${WORK_PLACE}"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} \
+${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_DEFRAG_BIN} -s 0 -l ${file_size} \
+-t ${file_size} -w ${WORK_PLACE}/${dir} -r -v"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host \
+${MPI_HOSTS} ${MULTI_DEFRAG_BIN} -s 0 -l ${file_size} -t ${file_size} -w \
+${WORK_PLACE}/${dir} -r -v >>${LOG_FILE} 2>&1
+	ret=$?
+	f_should_return ${ret}
+
+	for file_index in `seq ${num_files}`;do
+		file="${WORK_PLACE}/${dir}/file-$((${file_index}-1))"
+		log_file="${VERIFY_LOG_DIR}/${dir}/logfile-$((${file_index}-1))"
+		f_LogMsg ${LOG_FILE} "Verify chunks of ${file} after \
+multi-defragmentation"
+		f_LogMsg ${LOG_FILE} "CMD: ${VERIFY_FILE_BIN} -f ${file} -o \
+${log_file} -l ${file_size} -k ${chunk_size}"
+		${VERIFY_FILE_BIN} -f ${file} -o ${log_file} -l ${file_size} \
+-k ${chunk_size} >>${LOG_FILE} 2>&1
+		ret=$?
+		f_should_return ${ret}
+	done
+
+	return ${ret}
+}
+
+function f_multi_runner()
+{
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Mkfs device ${DEVICE}:"
+	f_mkfs ${LOG_FILE} ${BLOCKSIZE} ${CLUSTERSIZE} ${LABELNAME} ${SLOTS} \
+${DEVICE} "refcount,xattr" ${JOURNALSIZE} ${BLOCKS}
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Remote Mount among nodes ${MPI_HOSTS}:"
+	f_remote_mount ${LOG_FILE} ${LABELNAME} ${MOUNT_POINT} ${MPI_HOSTS} ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+        ((TEST_PASS++))
+	f_LogRunMsg ${RUN_LOG_FILE} "[${TEST_NO}] Multi-nodes Defragmentation Test:"
+	f_LogMsg ${LOG_FILE} "[${TEST_NO}] Multi-nodes Defragmentaiton Test, CMD: \
+f_multi_nodes_test 10 10 10485760 ${CLUSTERSIZE} -R"
+	f_multi_nodes_test 10 10 10485760 ${CLUSTERSIZE} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+        f_exit_or_not ${RET}
+        ((TEST_PASS++))
+        f_LogMsg ${LOG_FILE} "Cleanup working place"
+        ${SUDO} ${CHMOD_BIN} -R 777 ${MOUNT_POINT}  >>${LOG_FILE} 2>&1
+        ${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+        RET=$?
+        f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Umount volume from nodes ${MPI_HOSTS}:"
+	f_remote_umount ${LOG_FILE} ${MOUNT_POINT} ${MPI_HOSTS}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_single_runner()
+{
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Mkfs device ${DEVICE}:"
+	f_mkfs ${LOG_FILE} ${BLOCKSIZE} ${CLUSTERSIZE} ${LABELNAME} ${SLOTS} \
+${DEVICE} "refcount,xattr" ${JOURNALSIZE} ${BLOCKS}
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+	if [ -n "${DSCV_TEST}" ];then
+	((TEST_NO++))
+	f_LogRunMsg ${RUN_LOG_FILE} "[${TEST_NO}] Destructive Test:"
+	f_LogMsg ${LOG_FILE} "[${TEST_NO}] Destructive Test, CMD: \
+f_destructive_test 10 10 104857600 ${CLUSTERSIZE}"
+	f_destructive_test 10 10 104857600 ${CLUSTERSIZE}
+        RET=$?
+        f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+        f_exit_or_not ${RET}
+	((TEST_PASS++))
+	f_LogMsg ${LOG_FILE} "Cleanup working place"
+	${SUDO} ${CHMOD_BIN} -R 777 ${MOUNT_POINT}  >>${LOG_FILE} 2>&1
+        ${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+        RET=$?
+        f_exit_or_not ${RET}
+	fi
+
+	((TEST_NO++))
+	f_LogRunMsg ${RUN_LOG_FILE} "[${TEST_NO}] Basic Fucntional Test:"
+	f_LogMsg ${LOG_FILE} "[${TEST_NO}] Basic Fucntional Test, CMD: \
+f_basic_test 10 40 104857600 ${CLUSTERSIZE}"
+	f_basic_test 10 40 104857600 ${CLUSTERSIZE} >>${LOG_FILE} 2>&1
+        RET=$?
+        f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+        f_exit_or_not ${RET}
+	((TEST_PASS++))
+	f_LogMsg ${LOG_FILE} "Cleanup working place"
+	${SUDO} ${CHMOD_BIN} -R 777 ${MOUNT_POINT}  >>${LOG_FILE} 2>&1
+        ${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+        RET=$?
+        f_exit_or_not ${RET}
+
+	((TEST_NO++))
+	f_LogRunMsg ${RUN_LOG_FILE} "[${TEST_NO}] Reflink Combination Test:"
+	f_LogMsg ${LOG_FILE} "[${TEST_NO}] Reflink Combination Test, CMD: \
+f_basic_test 10 10 10485760 ${CLUSTERSIZE} -R"
+	f_basic_test 10 10 10485760 ${CLUSTERSIZE} -R >>${LOG_FILE} 2>&1
+        RET=$?
+        f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+        f_exit_or_not ${RET}
+	((TEST_PASS++))
+	f_LogMsg ${LOG_FILE} "Cleanup working place"
+	${SUDO} ${CHMOD_BIN} -R 777 ${MOUNT_POINT}  >>${LOG_FILE} 2>&1
+        ${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+        RET=$?
+        f_exit_or_not ${RET}
+
+	((TEST_NO++))
+	f_LogRunMsg ${RUN_LOG_FILE} "[${TEST_NO}] Punching Hole Test:"
+	f_LogMsg ${LOG_FILE} "[${TEST_NO}] Punching Hole Test, CMD: \
+f_hole_test 10 10 10485760 ${CLUSTERSIZE} 1000"
+	f_hole_test 10 10 10485760 ${CLUSTERSIZE} 1000 >>${LOG_FILE} 2>&1
+        RET=$?
+        f_echo_status ${RET} | tee -a ${RUN_LOG_FILE}
+        f_exit_or_not ${RET}
+	((TEST_PASS++))
+	f_LogMsg ${LOG_FILE} "Cleanup working place"
+	${SUDO} ${CHMOD_BIN} -R 777 ${MOUNT_POINT}  >>${LOG_FILE} 2>&1
+        ${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+        RET=$?
+        f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+}
+
+function f_cleanup()
+{
+        :
+}
+
+################################################################################
+# Main Entry
+################################################################################
+
+#redfine the int signal hander
+trap 'echo -ne "\n\n">>${RUN_LOG_FILE};echo  "Interrupted by Ctrl+C,Cleanuping\
+... "|tee -a ${RUN_LOG_FILE}; f_cleanup;exit 1' SIGINT
+
+f_check $*
+
+START_TIME=${SECONDS}
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Defragmentation tests start:  `date`\
+=====================\n"
+f_LogMsg ${LOG_FILE} "=====================Defragmentation tests start:  `date`\
+====================="
+
+for BLOCKSIZE in 512 1024 2048 4096;do
+	for CLUSTERSIZE in 4096 32768 1048576;do
+		f_LogRunMsg ${RUN_LOG_FILE} "<- Running test with ${BLOCKSIZE} \
+bs and ${CLUSTERSIZE} cs ->\n"
+		f_LogMsg ${LOG_FILE} "<- Running test with ${BLOCKSIZE} bs \
+and ${CLUSTERSIZE} cs ->"
+		if [ -z "${MULTI_TEST}" ];then
+			f_single_runner
+		else
+			f_multi_runner
+		fi
+	done
+done
+
+END_TIME=${SECONDS}
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Defragmentation tests end: `date`\
+=====================\n"
+f_LogMsg ${LOG_FILE} "=====================Defragmentation tests end: `date`\
+====================="
+
+f_LogRunMsg ${RUN_LOG_FILE} "Time elapsed(s): $((${END_TIME}-${START_TIME}))\n"
+f_LogRunMsg ${RUN_LOG_FILE} "Tests total: ${TEST_NO}\n"
+f_LogRunMsg ${RUN_LOG_FILE} "Tests passed: ${TEST_PASS}\n"
-- 
1.6.5.2




More information about the Ocfs2-test-devel mailing list