[Ocfs2-test-devel] [PATCH 7/7] Discontig-bg-test: Add discontig-bg testing launcher.

Tristan Ye tristan.ye at oracle.com
Mon Jun 28 00:37:26 PDT 2010


The reason to incorporate single-node and multi-nodes testing script into
one is mainly due to we heavily used existed multi-nodes testing binary(such
as xattr/refcount multi-nodes mpi binaries) for discontig-bg multi-test, also
single-node and multi-nodes nodes using the same contig-bg filler and discontig-bg
activator plays a part as well.

Currently single-node discontig-bg tests consists of following sub-testcases:

	1. inodes test

	2. extents test

	3. inlined test

	4. xattr test

	5. refcount test

	6. index dir test.

While multi-nodes tests consists of following sub-testcases:

	1. inodes test

	2. extents test

	3. xattr test

	4. refcount test

Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
---
 programs/discontig_bg_test/Makefile            |    2 +-
 programs/discontig_bg_test/discontig_runner.sh | 1258 ++++++++++++++++++++++++
 2 files changed, 1259 insertions(+), 1 deletions(-)
 create mode 100755 programs/discontig_bg_test/discontig_runner.sh

diff --git a/programs/discontig_bg_test/Makefile b/programs/discontig_bg_test/Makefile
index feab552..f87179f 100644
--- a/programs/discontig_bg_test/Makefile
+++ b/programs/discontig_bg_test/Makefile
@@ -12,7 +12,7 @@ SOURCES = spawn_inodes.c gen_extents.c resv.h resv_unwritten.c punch_hole.c
 
 DIST_FILES = $(SOURCES)
 
-BIN_EXTRA = fillup_contig_bg.sh activate_discontig_bg.sh
+BIN_EXTRA = fillup_contig_bg.sh activate_discontig_bg.sh discontig_runner.sh
 
 BIN_PROGRAMS = spawn_inodes gen_extents resv_unwritten punch_hole
 
diff --git a/programs/discontig_bg_test/discontig_runner.sh b/programs/discontig_bg_test/discontig_runner.sh
new file mode 100755
index 0000000..03617ca
--- /dev/null
+++ b/programs/discontig_bg_test/discontig_runner.sh
@@ -0,0 +1,1258 @@
+#!/bin/bash
+#
+# vim: noexpandtab sw=8 ts=8 sts=0:
+#
+# discontig_runner.sh
+#
+# Copyright (C) 2009 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.
+
+################################################################################
+# Global Variables
+################################################################################
+if [ -f `dirname ${0}`/o2tf.sh ]; then
+	. `dirname ${0}`/o2tf.sh
+fi
+
+DEVICE=
+MOUNT_POINT=
+WORK_PLACE=
+WORK_PLACE_DIRENT=ocfs2-discontig-bg-test
+DISCONTIG_ACTIVATE_BIN="${BINDIR}/activate_discontig_bg.sh"
+GEN_EXTENTS_BIN="${BINDIR}/gen_extents"
+PUNCH_HOLE_BIN="${BINDIR}/punch_hole"
+SPAWN_INODES_BIN="${BINDIR}/spawn_inodes"
+XATTR_TEST_BIN="${BINDIR}/xattr-test"
+MULTI_XATTR_TEST_BIN="${BINDIR}/xattr-multi-test"
+DXDIR_TEST_BIN="${BINDIR}/index_dir"
+REFCOUNT_TEST_BIN="`which sudo` -u root ${BINDIR}/reflink_test"
+MULTI_REFCOUNT_TEST_BIN="${BINDIR}/multi_reflink_test"
+INLINE_DATA_TEST_BIN="`which sudo` -u root ${BINDIR}/inline-data"
+INLINE_DIRS_TEST_BIN="`which sudo` -u root ${BINDIR}/inline-dirs"
+REFLINK_BIN="`which reflink`"
+SETXATTR="`which sudo` -u root `which setfattr`"
+
+DEFAULT_LOG_DIR=${O2TDIR}/log
+LOG_DIR=
+RUN_LOG_FILE=
+LOG_FILE=
+
+BLOCKSIZE=
+CLUSTERSIZE=
+JOURNALSIZE=0
+BLOCKS=0
+LABELNAME="ocfs2-discontig-bg-tests"
+MOUNT_OPTS="localalloc=0"
+OLD_MOUNT_OPTS=
+DEVICE=
+WORK_PLACE=
+
+OCFS2_LINK_MAX=65000
+
+MULTI_TEST=
+MPI_HOSTS=
+MPI_RANKS=
+MPI_ACCESS_METHOD="rsh"
+MPI_PLS_AGENT_ARG="-mca plm_rsh_agent rsh:ssh"
+MPI_BTL_ARG="-mca btl tcp,self"
+MPI_BTL_IF_ARG=
+################################################################################
+# Utility Functions
+################################################################################
+function f_usage()
+{
+    echo "usage: `basename ${0}` <-d device> [-o logdir] [-m multi_hosts] [-a access_method] <mount point>"
+    exit 1;
+
+}
+
+function f_getoptions()
+{
+	if [ $# -eq 0 ]; then
+		f_usage;
+		exit 1
+	fi
+	
+	while getopts "hd:o:m:a:" options; do
+		case $options in
+		d ) DEVICE="$OPTARG";;
+		o ) LOG_DIR="$OPTARG";;
+		a ) MPI_ACCESS_METHOD="$OPTARG";;
+		m ) MULTI_TEST=1
+		    MPI_HOSTS="$OPTARG";;
+		h ) f_usage
+			exit 1;;
+		* ) f_usage
+			exit 1;;
+		esac
+	done
+
+	shift $(($OPTIND -1))
+	MOUNT_POINT=${1}
+}
+
+function f_verify_hosts()
+{
+	local -a hosts=${1}
+	local host=
+
+	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
+		}
+	done
+
+	return 0
+}
+
+function f_setup()
+{
+	f_getoptions $*
+	
+	if [ -z "${DEVICE}" ];then
+		f_usage
+	fi	
+	
+	if [ -z "${MOUNT_POINT}" ];then
+		f_usage
+	fi
+	
+	if [ ! -d "${MOUNT_POINT}" ];then
+		echo "${MOUNT_POINT} you specified was not a dir."
+		f_usage
+	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 plm_rsh_agent rsh:ssh"
+			else
+				MPI_PLS_AGENT_ARG="-mca plm_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
+	
+	RUN_LOG_FILE="`dirname ${LOG_DIR}`/`basename ${LOG_DIR}`/`date +%F-%H-\
+%M-%S`-discontig-bg-run.log"
+	LOG_FILE="`dirname ${LOG_DIR}`/`basename ${LOG_DIR}`/`date +%F-%H-\
+%M-%S`-discontig-bg.log"
+
+}
+
+function f_get_disk_usage()
+{
+	local DISK_FREE=
+	local DISK_FREE_M=
+
+        f_LogMsg ${LOG_FILE} "Calculate the disk total and free size"
+
+        DISK_FREE=`df |grep ${MOUNT_POINT}|awk '{print $4}'`
+
+        if [ -z "${DISK_FREE}" ]; then
+                DISK_FREE=`df |grep ${DEVICE}|awk '{print $4}'`
+        fi
+
+        DISK_FREE_M=`echo ${DISK_FREE}/1024|bc`
+
+	echo "$DISK_FREE_M"
+}
+
+function f_get_extents_num_of_contig_bg()
+{
+	local -i num_extents
+
+	num_extents=$(($((4*1024*1024))/${BLOCKSIZE}))
+
+	echo $num_extents
+}
+
+function f_get_inodes_num_of_contig_bg()
+{
+	local -i num_inodes
+
+	if [ "${BLOCKSIZE}" == "512" ]; then
+		num_inodes=$(($((1024*1024))/${BLOCKSIZE}))
+	elif [ "${BLOCKSIZE}" == "1024" ];then
+		num_inodes=$(($((2*1024*1024))/${BLOCKSIZE}))
+	elif [ "${BLOCKSIZE}" == "2048" -o "${BLOCKSIZE}" == "4096" ];then
+		num_inodes=$(($((4*1024*1024))/${BLOCKSIZE}))
+	fi
+
+	echo $num_inodes
+}
+
+function f_inodes_test()
+{
+	local  i=1
+	local  j=1
+	local  k=
+	local filename_prefix=
+	local filename=
+
+	f_LogMsg ${LOG_FILE} "Activate inode discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t inode -r 2048 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+	
+	f_LogMsg ${LOG_FILE} "Fill up volumes by spreading inodes from discontig-bg."
+
+	filename_prefix=testfile-zero
+	while :;do
+		filename=${filename_prefix}${i}
+		if [ "${i}" -gt "$OCFS2_LINK_MAX" ];then
+			${MKDIR_BIN} -p ${WORK_PLACE}/${filename}
+			sync
+			i=1
+			filename_prefix=${filename}/
+			continue
+		else
+			${TOUCH_BIN} ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Volume gets full being filled with zero files"
+				break
+			}
+		fi
+
+		((i++))
+		((j++))
+	done
+
+	((j--))
+
+	f_LogMsg ${LOG_FILE} "Traverse and updates inode blocks in discontig-bg"
+	filename_prefix=testfile-zero
+	i=1
+	for k in `seq ${j}`;do
+		filename=${filename_prefix}${i}
+		if [ "${i}" -gt "$OCFS2_LINK_MAX" ];then
+			i=1
+			filename_prefix=${filename}/
+			continue
+		else
+			${TOUCH_BIN} ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Unable to touch ${WORK_PLACE}/${filename}"
+				return 1
+			}
+		fi
+		((i++))
+	done
+
+	f_LogMsg ${LOG_FILE} "Randomly remove inodes in discontig-bg"
+	filename_prefix=testfile-zero
+	i=1
+	for k in `seq ${j}`;do
+		filename=${filename_prefix}${i}
+		if [ "${i}" -gt "$OCFS2_LINK_MAX" ];then
+			i=1
+			filename_prefix=${filename}/
+			continue
+		else
+			if [ "$(($RANDOM%2))" -eq "0" ];then
+				${RM_BIN} -rf ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
+					f_LogMsg ${LOG_FILE} "Unable to remove ${WORK_PLACE}/${filename}"
+					return 1
+				}
+			fi
+		fi
+		((i++))
+	done
+
+	f_LogMsg ${LOG_FILE} "Remove all inodes in discontig-bg"
+	${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+
+	f_LogMsg ${LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Activate inode discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t inode -r 4096 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+	f_LogMsg ${LOG_FILE} "Stress spawn-inodes test with multiple processes"
+	${SPAWN_INODES_BIN} -n 1000 -m 1000 -w ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "stress test fill up the volume."
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all inodes in discontig-bg"
+	${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+
+	f_LogMsg ${LOG_FILE} "Stress random spawn-inodes test with multiple processes"
+	${SPAWN_INODES_BIN} -n 1000 -m 1000 -w ${WORK_PLACE} -r >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "stress test fill up the volume."
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all inodes in discontig-bg"
+	${RM_BIN} -rf ${WORK_PLACE}/* >>${LOG_FILE} 2>&1
+
+	f_LogMsg ${LOG_FILE} "Remove all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_is_xattr_in_block()
+{
+	#${1} is test file
+	#${2} is target volume
+
+	${DEBUGFS_BIN} -R "xattr ${1}" ${2}|grep -qi "block" && {
+		return 0
+	}
+
+	return 1
+}
+
+function f_propagate_xattr_blocks()
+{
+
+	local filename_prefix=${1}
+	local filename=
+	local -i i=1
+	local RET=0
+
+	while :;do
+		filename=${filename_prefix}-${i}
+		${TOUCH_BIN} ${WORK_PLACE}/$filename >/dev/null 2>&1|| {
+			f_LogMsg ${LOG_FILE} "touch file failed when propagating xattr blocks."
+			RET=1
+			break
+		}
+
+		sync
+
+		for j in $(seq 100);do
+			${SETXATTR} -n user.name${j} -v value${j} ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
+				f_LogMsg ${LOG_FILE} "setxattr failed."
+				RET=1
+				break
+			}
+
+			sync
+
+			f_is_xattr_in_block ${WORK_PLACE_DIRENT}/${filename} ${DEVICE} && {
+				break
+			}
+		done
+
+		if [ "${RET}" -ne "0" ];then
+			break
+		fi
+
+		((i++))
+	done
+
+	return $RET
+}
+
+function f_update_xattr_blocks()
+{
+
+	local filename_prefix=${1}
+	local filename=
+	local -i i=1
+	local RET=0
+
+	while :;do
+		filename=${filename_prefix}-${i}
+
+		${SETXATTR} -n user.name1 -v updt1 ${WORK_PLACE}/${filename} >>${LOG_FILE} 2>&1 || {
+			f_LogMsg ${LOG_FILE} "update failed."
+			RET=1
+			break
+		}
+
+		((i++))
+	done
+
+	return $RET
+}
+
+function f_extents_test()
+{
+	local disk_free_m=
+	local filesize=
+	local filename=
+
+	local offset=
+	local num=
+	local recs_in_blk=
+	local iter=1000
+	local count=
+	local inc=
+
+	f_LogMsg ${LOG_FILE} "[*] Activate extent discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r 2048 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+        f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+        f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+        RET=$?
+        f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+	filename=${WORK_PLACE}/extents_testfile
+
+	f_LogMsg ${LOG_FILE} "Fill up volumes by spreading extents from discontig-bg."
+	disk_free_m=`f_get_disk_usage`
+
+	filesize=$(((${disk_free_m}-40)*1024*1024/2))
+
+	f_LogMsg ${LOG_FILE} "Fill up volumes by extents(filesize = $filesize), free space is ${disk_free_m}."
+	f_LogMsg ${LOG_FILE} "CMD: ${GEN_EXTENTS_BIN} -f ${filename} -l ${filesize} -c ${CLUSTERSIZE} -k 1"
+	${GEN_EXTENTS_BIN} -f ${filename} -l ${filesize} -c ${CLUSTERSIZE} -k 1 >>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Propagate xattr blocks to fill up extent block group."
+	f_propagate_xattr_blocks "extents_testfile_xattr_addup" || {
+		f_LogMsg ${LOG_FILE} "Volume gets full by adding additional xattr blocks."
+	}
+
+	f_update_xattr_blocks "extents_testfile_xattr_addup" || {
+		f_LogMsg ${LOG_FILE} "finish updating xattr."
+	}
+
+	sync
+	
+	f_LogMsg ${LOG_FILE} "Traverse extent blocks"
+	offset=0
+	num=0
+	count=$((${filesize}/${CLUSTERSIZE}))
+	if [ "${count}" -gt "${iter}" ];then
+		inc=$((${count}/${iter}))
+	else
+		inc=1
+	fi
+	while :;do
+		dd if=${filename} of=/dev/null bs=${CLUSTERSIZE} count=1 skip=${num} >/dev/null 2>&1 ||{
+			echo "dd if=${filename} of=/dev/null bs=${CLUSTERSIZE} count=1 skip=${num}"
+			f_LogMsg ${LOG_FILE} "Traverse failed at #${num} cluster."
+			return 1
+		}
+		num=$((${num}+${inc}))
+		offset=$((${num}*${CLUSTERSIZE}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "Traverse completed."
+			break
+		fi
+	done
+
+	#use punch_hole to change extent_list then to update
+	f_LogMsg ${LOG_FILE} "Update extent blocks by punching holes"
+	offset=0
+	num=0
+	count=$((${filesize}/${CLUSTERSIZE}))
+	if [ "${count}" -gt "${iter}" ];then
+		inc=$((${count}/${iter}))
+	else
+		inc=1
+	fi
+	while :;do
+		if [ "$((${RANDOM}%2))" -eq "0" ];then
+			${PUNCH_HOLE_BIN} -f ${filename} -s ${offset} -l ${CLUSTERSIZE} >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed."
+				return 1
+			}
+		fi
+		num=$((${num}+${inc}))
+		offset=$((${num}*${CLUSTERSIZE}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "extents updating completed."
+			break
+		fi
+	done
+
+	f_LogMsg ${LOG_FILE} "Randomly remove extent blocks"
+	recs_in_blk=$(((${BLOCKSIZE}-64)/16))
+	while :;do
+		if [ "$((${RANDOM}%2))" -eq "0" ];then
+			${PUNCH_HOLE_BIN} -f ${filename} -s ${offset} -l $((${CLUSTERSIZE}*${recs_in_blk})) >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed."
+				return 1
+			}
+		fi
+
+		offset=$((${offset}+${CLUSTERSIZE}*${recs_in_blk}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "extents updating completed."
+			break
+		fi
+	done
+
+	f_LogMsg ${LOG_FILE} "Remove all extent blocks and xattr blocks"
+	${RM_BIN} -rf ${filename}
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Remove all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_inline_test()
+{
+	f_LogMsg ${LOG_FILE} "[*] Activate inode discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t inode -r 1024 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Regular inline-file test."
+	${INLINE_DATA_TEST_BIN} -i 1 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Multiple inline-file test."
+	${INLINE_DATA_TEST_BIN} -i 1 -m 1000 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Concurrent inline-file test."
+	${INLINE_DATA_TEST_BIN} -i 1 -c 100 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Stress inline-file test."
+	${INLINE_DATA_TEST_BIN} -i 10 -c 50 -m 100 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+	
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Regular inline-dir test."
+	${INLINE_DIRS_TEST_BIN} -i 1 -s 20 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Multiple inline-dir test."
+	${INLINE_DIRS_TEST_BIN} -i 1 -s 5 -m 1000 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+	f_LogMsg ${LOG_FILE} "Concurrent inline-dir test."
+	${INLINE_DIRS_TEST_BIN} -i 1 -s 5 -c 100 -d ${DEVICE} ${MOUNT_POINT}>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${MOUNT_POINT}/inline-data-test
+
+}
+
+function f_xattr_test()
+{
+	f_LogMsg ${LOG_FILE} "[*] Activate extent discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r 10240 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+        f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+        f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+        RET=$?
+        f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+	f_LogMsg ${LOG_FILE} "Stress xattr filling-up test with multiple processes."
+	f_LogMsg ${LOG_FILE} "CMD: ${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 150 -f 5000 -r -k ${WORK_PLACE}"
+	${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 150 -f 5000 -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg "Volume get filled up with xattr blocks."
+	}
+	
+	f_LogMsg ${LOG_FILE} "Remove all xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "CMD: ${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 30 -s 80 -f 8000 -r -k ${WORK_PLACE}"
+	${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 30 -s 80 -f 8000 -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg "Volume get filled up with xattr blocks."
+	}
+	
+	f_LogMsg ${LOG_FILE} "Remove all xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Stress&Random xattr filling-up test with multiple processes."
+	f_LogMsg ${LOG_FILE} "CMD: ${XATTR_TEST_BIN} -i 1 -x 200 -n user -t normal -l 50 -s 150 -f 5000 -r -k ${WORK_PLACE}"
+	${XATTR_TEST_BIN} -i 1 -x 200 -n user -t normal -l 50 -s 150 -f 5000 -r -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg "Volume get filled up with xattr blocks."
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Stress&Random xattr filling-up test with multiple processes in bucket."
+	f_LogMsg ${LOG_FILE} "CMD: ${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 1000 -f 1000 -r -k ${WORK_PLACE}"
+	${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 1000 -f 1000 -r -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg "Volume get filled up with xattr blocks."
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Concurrent xattr block group test"
+	f_LogMsg ${LOG_FILE} "CMD: ${XATTR_TEST_BIN} -i 1 -x 200 -n user -t normal -l 50 -s 150 -m 500 -r -k ${WORK_PLACE}"
+	${XATTR_TEST_BIN} -i 1 -x 200 -n user -t normal -l 50 -s 150 -m 500 -r -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg "Volume get filled up with xattr blocks."
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Remove all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+
+}
+
+function f_refcount_test()
+{
+	local oirg_filename=
+	local ref_filename=
+	local filesize=
+	local -i remain_space=2048
+
+	local num=
+	local offset=
+	local recs_in_blk=
+	local disk_free_m=
+	local pattern=
+	local iter=1000
+	local count=
+	local inc=
+
+	f_LogMsg ${LOG_FILE} "[*] Activate extent discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r ${remain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+        f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+        f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+        RET=$?
+        f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+	
+	f_LogMsg ${LOG_FILE} "Tremendous refcount block testing."
+	f_LogMsg ${LOG_FILE} "CMD: ${REFCOUNT_TEST_BIN} -i 1 -n 10 -p 40000 -l 1048576 -d ${DEVICE} -w ${WORK_PLACE} -s"
+	${REFCOUNT_TEST_BIN} -i 1 -n 10 -p 20000 -l 1048576 -d ${DEVICE} -w ${WORK_PLACE} -s >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Tremendous refcount block testing failed."
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	sync
+	disk_free_m=`f_get_disk_usage`
+
+	f_LogMsg ${LOG_FILE} "Prepare original file with extents for reflink"
+	filesize=$(((${disk_free_m}-200)*1024*1024/2))
+	orig_filename=${WORK_PLACE}/extents_for_reflink
+	ref_filename=${WORK_PLACE}/extents_reflink
+	f_LogMsg ${LOG_FILE} "CMD: ${GEN_EXTENTS_BIN} -f ${orig_filename} -l ${filesize} -c ${CLUSTERSIZE} -k 0"
+	${GEN_EXTENTS_BIN} -f ${orig_filename} -l ${filesize} -c ${CLUSTERSIZE} -k 0 >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Failed to generate file $orig_filename with extents"
+                return 1
+        }
+	
+	f_LogMsg ${LOG_FILE} "Reflink original file to target."
+	${REFLINK_BIN} ${orig_filename} ${ref_filename} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Failed to reflink original file ${orig_filename}."
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Update original and reflinks randomly"
+	offset=0
+	num=0
+	pattern=/tmp/pattern-$$
+	dd if=/dev/random of=${pattern} bs=${CLUSTERSIZE} count=1 >>/dev/null 2>&1
+	count=$((${filesize}/${CLUSTERSIZE}))
+	if [ "${count}" -gt "${iter}" ];then
+		inc=$((${count}/${iter}))
+	else
+		inc=1
+	fi
+	while :;do
+		if [ "$((${RANDOM}%2))" -eq "0" ];then
+			dd if=${pattern} of=${orig_filename} bs=${CLUSTERSIZE} count=1 seek=${num} >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Update at offset:${offset} failed on ${orig_filename}."
+				return 1
+			}
+		fi
+		if [ "$((${RANDOM}%2))" -eq "1" ];then
+			dd if=${pattern} of=${ref_filename} bs=${CLUSTERSIZE} count=1 seek=${num} >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Update at offset:${offset} failed on ${ref_filename}."
+				return 1
+			}
+		fi
+		num=$((${num}+${inc}))
+		offset=$((${num}*${CLUSTERSIZE}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "data updating completed."
+			break
+		fi
+	done
+	rm -rf ${pattern}
+
+	f_LogMsg ${LOG_FILE} "Update reflink extent blocks by punching holes"
+	offset=0
+	num=0
+	count=$((${filesize}/${CLUSTERSIZE}))
+	if [ "${count}" -gt "${iter}" ];then
+		inc=$((${count}/${iter}))
+	else
+		inc=1
+	fi
+	while :;do
+		if [ "$((${RANDOM}%2))" -eq "0" ];then
+			${PUNCH_HOLE_BIN} -f ${orig_filename} -s ${offset} -l ${CLUSTERSIZE} >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed on ${orig_filename}."
+				return 1
+			}
+		fi
+		if [ "$((${RANDOM}%2))" -eq "1" ];then
+			${PUNCH_HOLE_BIN} -f ${ref_filename} -s ${offset} -l ${CLUSTERSIZE} >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed on ${ref_filename}."
+				return 1
+			}
+		fi
+		num=$((${num}+${inc}))
+		offset=$((${num}*${CLUSTERSIZE}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "extents updating completed."
+			break
+		fi
+	done
+
+	f_LogMsg ${LOG_FILE} "Randomly remove extent blocks for reflink"
+	recs_in_blk=$(((${BLOCKSIZE}-64)/16))
+	while :;do
+		if [ "$((${RANDOM}%2))" -eq "0" ];then
+			${PUNCH_HOLE_BIN} -f ${orig_filename} -s ${offset} -l $((${CLUSTERSIZE}*${recs_in_blk})) >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed on ${orig_filename}."
+				return 1
+			}
+		fi
+
+		if [ "$((${RANDOM}%2))" -eq "1" ];then
+			${PUNCH_HOLE_BIN} -f ${ref_filename} -s ${offset} -l $((${CLUSTERSIZE}*${recs_in_blk})) >>/dev/null 2>&1 || {
+				f_LogMsg ${LOG_FILE} "Punch hole at offset:${offset} failed on ${ref_filename}."
+				return 1
+			}
+		fi
+
+		offset=$((${offset}+${CLUSTERSIZE}*${recs_in_blk}))
+
+		if [ "${offset}" -gt "${filesize}" ];then
+			f_LogMsg ${LOG_FILE} "extents updating completed."
+			break
+		fi
+	done
+
+	f_LogMsg ${LOG_FILE} "Remove all refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	sync
+	disk_free_m=`f_get_disk_usage`
+	f_LogMsg ${LOG_FILE} "Refcount Fill-up Testing."
+	f_LogMsg ${LOG_FILE} "CMD: ${REFCOUNT_TEST_BIN} -i 1 -n 2 -l $((${disk_free_m}*1024*1024))  -d ${DEVICE} -w ${WORK_PLACE} -s"
+	${REFCOUNT_TEST_BIN} -i 1 -n 2 -l $((${disk_free_m}*1024*1024))  -d ${DEVICE} -w ${WORK_PLACE} -s >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Refcount fill-up testing failed."
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Reflink stress test."
+	f_LogMsg ${LOG_FILE} "CMD: ${REFCOUNT_TEST_BIN} -i 1 -n 50000 -l 1048576  -d ${DEVICE} -w ${WORK_PLACE} -s"
+	${REFCOUNT_TEST_BIN} -i 1 -n 50000 -l 1048576  -d ${DEVICE} -w ${WORK_PLACE} -s >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Reflink stress test failed."
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all reflink files."
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Reflink & Xattr combination test"
+	f_LogMsg ${LOG_FILE} "CMD: ${REFCOUNT_TEST_BIN} -i 1 -n 10000 -l 1048576  -d ${DEVICE} -w ${WORK_PLACE} -x 1000"
+	${REFCOUNT_TEST_BIN} -i 1 -n 10000 -l 1048576  -d ${DEVICE} -w ${WORK_PLACE} -x 1000 >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Reflink & Xattr combination test failed."
+		return 1
+	}
+
+	f_LogMsg ${LOG_FILE} "Remove all reflink files."
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Remove all stuffs."
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "[*] Umount device ${DEVICE} from ${MOUNT_POINT}:"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_dxdir_test()
+{
+	f_LogMsg ${LOG_FILE} "[*] Activate inode discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t extents -r 2048 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	WORK_PLACE=${MOUNT_POINT}/${WORK_PLACE_DIRENT}
+	${MKDIR_BIN} -p ${WORK_PLACE}
+
+	f_LogMsg ${LOG_FILE} "Regular dxdir test."
+	${SUDO} ${DXDIR_TEST_BIN} -i 10 -n 20000 -v ${DEVICE} -d 2 -w ${WORK_PLACE} -f >>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Concurrent dxdir test."
+	${SUDO} ${DXDIR_TEST_BIN} -i 1 -n 4000 -v ${DEVICE} -d 1 -w ${WORK_PLACE} -c 200 >>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+
+	f_LogMsg ${LOG_FILE} "Multi-processes dxdir test."
+	${SUDO} ${DXDIR_TEST_BIN} -i 1 -n 300 -v ${DEVICE} -d 1 -w ${WORK_PLACE} -m 10 >>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+
+	f_LogMsg ${LOG_FILE} "Stress dxdir test."
+	${SUDO} ${DXDIR_TEST_BIN} -i 10 -n 500000  -v ${DEVICE} -w ${WORK_PLACE} -s>>${LOG_FILE} 2>&1 || {
+		return 1
+	}
+	${RM_BIN} -rf ${WORK_PLACE}/*
+}
+
+function f_single_runner()
+{
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Inodes Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Inodes Block Group Test:"
+	f_inodes_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Extent Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Extent Block Group Test:"
+	f_extents_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Inline File Test:"
+	f_LogMsg ${LOG_FILE} "[*] Inline File Test:"
+	f_inline_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Xattr Block Test:"
+	f_LogMsg ${LOG_FILE} "[*] Xattr Block Group Test:"
+	f_xattr_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Refcount Block Test:"
+	f_LogMsg ${LOG_FILE} "[*] Xattr Block Group Test:"
+	f_refcount_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+}
+
+function f_multi_inodes_test()
+{
+
+	f_LogMsg ${LOG_FILE} "Activate inode discontig-bg on ${DEVICE}"
+	${DISCONTIG_ACTIVATE_BIN} -t inode -r 800 -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	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}
+
+	f_LogMsg ${LOG_FILE} "Spawning inodes from multi-nodes"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${SPAWN_INODES_BIN} -n 20000 -m 100 -w ${WORK_PLACE}"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${SPAWN_INODES_BIN} -n 100 -m 10 -w ${WORK_PLACE} >>${LOG_FILE} 2>&1
+
+	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}
+
+	f_LogMsg ${LOG_FILE} "Do fsck.ocfs2"
+	${FSCK_BIN} -fy ${DEVICE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "fsck failed"
+	}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Cleanup all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "Umount volume"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_multi_extents_test()
+{
+	local remain_space=512
+	local filesize=
+	local -a hosts_array="(`echo ${MPI_HOSTS}|tr "[,]" "[ ]"`)"
+	local num_hosts=${#hosts_array[@]}
+	local filename=
+
+	f_LogMsg ${LOG_FILE} "Activate extents discontig-bg on ${DEVICE}"
+	f_LogMsg ${LOG_FILE} "CMD: ${DISCONTIG_ACTIVATE_BIN} -t extent -r ${ramain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r ${remain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	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}
+
+	filename=${WORK_PLACE}/multi_nodes_extents_testfile
+	filesize=$((${remain_space}/${num_hosts}/2*1024*1024))
+	f_LogMsg ${LOG_FILE} "Generate extents from multi-nodes"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${GEN_EXTENTS_BIN} -f ${filename} -l ${filesize} -c ${CLUSTERSIZE} -k 1 -m"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${GEN_EXTENTS_BIN} -f ${filename} -l ${filesize} -c ${CLUSTERSIZE} -k 1 -m>>${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}
+
+	f_LogMsg ${LOG_FILE} "Do fsck.ocfs2"
+	${FSCK_BIN} -fy ${DEVICE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "fsck failed"
+	}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated extents"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Cleanup all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "Umount volume"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_multi_xattr_test()
+{
+	local remain_space=1024
+
+	f_LogMsg ${LOG_FILE} "Activate extents discontig-bg on ${DEVICE}"
+	f_LogMsg ${LOG_FILE} "CMD: ${DISCONTIG_ACTIVATE_BIN} -t extent -r ${ramain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r ${remain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	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}
+
+	f_LogMsg ${LOG_FILE} "Stress xattr filling-up test with multiple processes."
+        f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 150 -f 5000 -r -k ${WORK_PLACE}"
+        ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${XATTR_TEST_BIN} -i 1 -x 2 -n user -t normal -l 50 -s 150 -f 5000 -r -k ${WORK_PLACE} >>${LOG_FILE} 2>&1 || {
+                f_LogMsg ${LOG_FILE} "Volume get filled up with xattr blocks."
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Concurrent adding test."
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_XATTR_TEST_BIN} -i 1 -x 1000 -n user -t normal -l 200 -s 1000 -o -r -k ${WORKPLACE}"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_XATTR_TEST_BIN} -i 1 -x 1000 -n user -t normal -l 200 -s 1000 -o -r -k ${WORKPLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "concurrent xattr adding test failed"
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated xattr blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Stress multi-nodes xattr test."
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_XATTR_TEST_BIN} -i 1 -x 2000 -n user -t normal -l 255 -s 5000  -r -k ${WORKPLACE}"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_XATTR_TEST_BIN} -i 1 -x 2000 -n user -t normal -l 255 -s 5000  -r -k ${WORKPLACE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "stress multi-nodes xattr test failed."
+	}
+
+	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}
+
+	f_LogMsg ${LOG_FILE} "Do fsck.ocfs2"
+	${FSCK_BIN} -fy ${DEVICE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "fsck failed"
+	}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Cleanup all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "Umount volume"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_multi_refcount_test()
+{
+	local remain_space=1024
+
+	f_LogMsg ${LOG_FILE} "Activate extents discontig-bg on ${DEVICE}"
+	f_LogMsg ${LOG_FILE} "CMD: ${DISCONTIG_ACTIVATE_BIN} -t extent -r ${ramain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT}"
+	${DISCONTIG_ACTIVATE_BIN} -t extent -r ${remain_space} -b $BLOCKSIZE -c ${CLUSTERSIZE} -d ${DEVICE} -o ${LOG_DIR} -l ${LABELNAME} -m ${MPI_HOSTS} -a ${MPI_ACCESS_METHOD} ${MOUNT_POINT} >>${LOG_FILE} 2>&1
+	RET=$?
+	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}
+
+	f_LogMsg ${LOG_FILE} "Basic multi-refcount test"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 100 -w ${WORK_PLACE} -f "
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 100 -w ${WORK_PLACE} -f >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Basic multi-refcount test failed."
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Concurrent multi-refcount test"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 100 -w ${WORK_PLACE} -c"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 100 -w ${WORK_PLACE} -c>>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Concurrent multi-refcount test failed."
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Combined multi-refcount&xattr test"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 10 -w ${WORK_PLACE} -x 1000"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -l 10485760 -n 10 -w ${WORK_PLACE} -x 1000>>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Combined multi-refcount&xattr test failed."
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+
+	f_LogMsg ${LOG_FILE} "Stress multi-refcount test"
+	f_LogMsg ${LOG_FILE} "CMD: ${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -p 1000 -l 10485760 -n 100 -w ${WORK_PLACE} -s"
+	${MPIRUN} ${MPI_PLS_AGENT_ARG} ${MPI_BTL_ARG} ${MPI_BTL_IF_ARG} --host ${MPI_HOSTS} ${MULTI_REFCOUNT_TEST_BIN} -i 1 -p 1000 -l 10485760 -n 100 -w ${WORK_PLACE} -s>>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "Stress multi-refcount test failed."
+	}
+
+	f_LogMsg ${LOG_FILE} "Cleanup allocated refcount blocks"
+	${RM_BIN} -rf ${WORK_PLACE}/*
+	
+	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}
+
+	f_LogMsg ${LOG_FILE} "Do fsck.ocfs2"
+	${FSCK_BIN} -fy ${DEVICE} >>${LOG_FILE} 2>&1 || {
+		f_LogMsg ${LOG_FILE} "fsck failed"
+	}
+
+	f_LogMsg ${LOG_FILE} "[*] Mount ${DEVICE} to ${MOUNT_POINT}:"
+	f_mount ${LOG_FILE} ${DEVICE} ${MOUNT_POINT} ocfs2 ${MOUNT_OPTS}
+	RET=$?
+	f_exit_or_not ${RET}
+
+	f_LogMsg ${LOG_FILE} "Cleanup all stuffs"
+	${RM_BIN} -rf ${MOUNT_POINT}/*
+
+	f_LogMsg ${LOG_FILE} "Umount volume"
+	f_umount ${LOG_FILE} ${MOUNT_POINT}
+	RET=$?
+	f_exit_or_not ${RET}
+}
+
+function f_multi_runner()
+{
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Multi-nodes Inodes Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Multi-nodes Inodes Block Group Test:"
+	f_multi_inodes_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Multi-nodes Extents Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Multi-nodes Extents Block Group Test:"
+	f_multi_extents_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Multi-nodes Xattr Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Multi-nodes Xattr Block Group Test:"
+	f_multi_xattr_test
+	RET=$?
+	f_echo_status ${RET}| tee -a ${RUN_LOG_FILE}
+	f_exit_or_not ${RET}
+
+	f_LogRunMsg ${RUN_LOG_FILE} "[*] Multi-nodes Refcount Block Group Test:"
+	f_LogMsg ${LOG_FILE} "[*] Multi-nodes Refcount Block Group Test:"
+	f_multi_refcount_test
+	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_setup $*
+
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Discontiguous block group test starts:  `date`\
+=====================\n"
+f_LogMsg ${LOG_FILE} "=====================Discontiguous block groups tests start:  `date`\
+====================="
+
+for BLOCKSIZE in 512 1024 2048 4096;do
+	for CLUSTERSIZE in 4096 8192 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
+
+f_LogRunMsg ${RUN_LOG_FILE} "=====================Discontiguous block group test ends: `date`\
+=====================\n"
+f_LogMsg ${LOG_FILE} "=====================Discontiguous block groups test ends: `date`\
+====================="
-- 
1.5.5




More information about the Ocfs2-test-devel mailing list