[BACK]Return to common.filestreams CVS log [TXT][DIR] Up to [Development] / xfs-cmds / xfstests

File: [Development] / xfs-cmds / xfstests / common.filestreams (download)

Revision 1.1, Thu Jun 28 15:57:11 2007 UTC (10 years, 3 months ago) by dgc.longdrop.melbourne.sgi.com
Branch: MAIN

QA tests for filestreams
Merge of master-melb:xfs-cmds:29011a by kenmcd.

  QA tests for filestreams

##/bin/sh
#
# Copyright (c) 2007 Silicon Graphics, Inc.  All Rights Reserved.
#
# Core of filestreams tests.
#

_do_stream()
{
        local directory_name=$1
        local files=$2
        local file_size=$3
        local bsize=$4
	local iflag=$5
	local dio=$6

        local count=`expr $file_size / $bsize`
        mkdir $directory_name
	if [ "$iflag" = "1" ]; then
		$XFS_IO_PROG -x -c "chattr +S" $directory_name \
			|| _fail "chattr of filestream flag"
	fi
        cd $directory_name
        local i=1
	local oflags=""
	if [ "$dio" = "1" ]; then
		oflags="oflag=direct"
	fi
        while [ $i -le $files ]; do
                dd if=/dev/zero of=frame-${i} $oflags \
                        bs=$bsize count=$count >/dev/null 2>&1
                i=`expr $i + 1`
        done
}

_filter_agno()
{
        # the ag number is in column 4 of xfs_bmap output
        perl -ne '
                $ag = (split /\s+/)[4] ;
		if ($ag =~ /\d+/) {print "$ag "} ;
        '
}

_get_stream_ags()
{
        local directory_name=$1
        local stream_ags=`xfs_bmap -vp ${directory_name}/* | _filter_agno`
        echo $stream_ags
}

_check_for_dupes()
{
        # check for duplicate numbers between two space seperated vars
        local num_str_one=$1
        local num_str_two=$2

        local this_num_one
        local this_num_two
        for this_num_one in $num_str_one; do
                for this_num_two in $num_str_two; do
                        if [ "$this_num_one" == "$this_num_two" ]; then
				echo "duplicate AG $this_num_one found" \
					>> $here/$seq.full
				return 1
			fi
                done
        done
        return 0
}

rm -f $here/$seq.full

# test that filestreams are available
umount $SCRATCH_MNT > /dev/null 2>&1

_scratch_mkfs_xfs > /dev/null 2>&1 \
	|| _fail "mkfs failed"

_scratch_mount "-o filestreams" \
	|| _notrun "filestreams mount not available"

sync
umount $SCRATCH_MNT > /dev/null 2>&1

_test_streams() {

	echo "# testing $* ...."
	local agcount="$1"
	local agsize="$2" # in MB
	local stream_count="$3"
	local stream_files="$4"
	local stream_file_size=`expr $5 \* 1024 \* 1024`
	local use_iflag="$6"
	local use_directio="$7"
	local expected_result="$8"

	local size=`expr $agsize \* 1024 \* 1024 \* $agcount`
	_scratch_mkfs_xfs -dsize=$size,agcount=$agcount >/dev/null 2>&1 \
		|| _fail "mkfs failed"

	if [ "$use_iflag" = "0" ]; then
		# mount using filestreams mount option
		_scratch_mount "-o filestreams" \
			|| _notrun "filestreams mount not available"
	else
		# test will set inode flag
		_scratch_mount
	fi


	cd $SCRATCH_MNT

	# start four streams, each writing 24m (8 x 3m files)
	echo "# streaming"
	stream_pids=""
	stream_index=1
	while [ $stream_index -le $stream_count ]; do
		_do_stream stream${stream_index}-dir $stream_files \
			$stream_file_size 1048576 $use_iflag $use_directio &
		stream_pids="$stream_pids $!"
		stream_index=`expr $stream_index + 1`
	done

	# wait for streams to finish
	# XXX wait here not needed? -dgc
	wait $stream_pids

	# sync the buffered streams out in parallel
	echo "# sync AGs..."
	stream_pids=""
	stream_index=1
	while [ $stream_index -le $stream_count ]; do
		_get_stream_ags stream${stream_index}-dir > /dev/null 2>&1 &
		stream_pids="$stream_pids $!"
		stream_index=`expr $stream_index + 1`
	done

	# wait for streams to finish
	wait $stream_pids

	# confirm streams are in seperate AGs
	echo "# checking stream AGs..."
	ags_seen=""
	stream_index=1
	while [ $stream_index -le $stream_count ]; do
		_get_stream_ags stream${stream_index}-dir > $tmp.${stream_index} &
		this_stream_ags=`_get_stream_ags stream${stream_index}-dir`
		echo "stream $stream_index AGs: $this_stream_ags" >> $here/$seq.full
		_check_for_dupes "$ags_seen" "$this_stream_ags"
		if [ $? -ne 0 ]; then
			if [ "$expected_result" = "fail" ]; then
				echo "+ expected failure, matching AGs"
				expected_result="failed"
				break
			else
				_fail "- failed, streams with matching AGs"
			fi
		fi
		ags_seen="$ags_seen $this_stream_ags"
		stream_index=`expr $stream_index + 1`
	done
	if [ "$expected_result" != "failed" ]; then
		echo "+ passed, streams are in seperate AGs"
	fi
	cd $here
	umount $SCRATCH_MNT
}