[Ocfs2-test-devel] [PATCH 1/1] Ocfs2-tests: Add additional func tests for xattr.
tristan.ye
tristan.ye at oracle.com
Fri Dec 5 01:19:34 PST 2008
On Fri, 2008-12-05 at 16:55 +0800, Tao Ma wrote:
> Tristan,
> Glad to see you complete my test plan so quickly. The result is cool.
> But Since this is based on tiger's temporary debugfs patch, I would
> suggest to defer its commit after Tiger's patch is committed to
> ocfs2-tools first so that we won't give the user an uncompleted one.
Yes,that sounds reasonable, anyway, you can take it to perform a
boundary check when you making any changes/patches for xattr.
Tristan.
>
> Regards,
> Tao
>
> Tristan Ye wrote:
> > Thanks to tiger's patch set for debugfs.ocfs2 to make these
> > extreme boundary tests become a reality. Currently it includes
> > following testcases suggested by Tao's testplan.
> >
> > 1. Non-xattr test.
> > 2. Simple in-inode-xattr test(it will include set a small xattr, a large
> > xattr).
> > 3. In-inode-xattr-extension test. it will fill up the in-inode space and
> > then extend the xattr to an outside xattr block. you need to test t4
> > scenarios at least.
> > 1) insert a small xattr.
> > 2) insert a large xattr.
> > 3) replace a small xattr in-inode to a large one(value_size>80)(which
> > will remove the old in-inode xattr and add it in outside block).
> > 4) replace a small xattr in-inode to a large one(value_size<80).
> > 4. Outside-xattr-block test.
> > 1) insert a small xattr.
> > 2) insert a large xattr.
> > 3) replace xattr to a small one((value_size<80)) which then can be
> > inserted into in-inode and deleted from xattr block.
> > 4) replace xattr to a value(value_size>80) but the old one has a size
> > of(48~80).
> > 5. Basic bucket-extension test.
> > 1) insert a small xattr.
> > 2) insert a large xattr.
> > 3) replace a small xattr in-inode to a large one(value_size>80)(which
> > will remove the old in-inode xattr and add it in outside bucket).
> > 4) replace a small xattr in-inode to a large one(value_size<80).
> > 6. Basic bucket insert test.
> > 1) insert a small xattr.
> > 2) insert a large xattr.
> > 3) replace xattr to a small one((value_size<80)) which then can be
> > inserted into in-inode and deleted from xattr bucket.
> > 4) replace xattr to a value(value_size>80) but the old one has a size
> > of(48~80).
> >
> > Actually, the above testcases have exposed the bugs 1052,1054 and 1055 on
> > bugzilla. We're also planning testcases of combination-test for inline-xattr
> > and inline-data.
> >
> > Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
> > ---
> > programs/xattr_tests/xattr-single-run.sh | 408 +++++++++++++++++++++++++++++-
> > 1 files changed, 407 insertions(+), 1 deletions(-)
> >
> > diff --git a/programs/xattr_tests/xattr-single-run.sh b/programs/xattr_tests/xattr-single-run.sh
> > index 4a54caa..bfc370b 100755
> > --- a/programs/xattr_tests/xattr-single-run.sh
> > +++ b/programs/xattr_tests/xattr-single-run.sh
> > @@ -35,6 +35,7 @@ TOUCH_BIN="`which touch`"
> > MOUNT_BIN="`which sudo` -u root `which mount`"
> > UMOUNT_BIN="`which sudo` -u root `which umount`"
> > MKFS_BIN="`which sudo` -u root `which mkfs.ocfs2`"
> > +DEBUGFS_BIN="`which sudo` -u root `which debugfs.ocfs2`"
> > XATTR_TEST_BIN="`which sudo` -u root ${BINDIR}/xattr-test"
> >
> > DEFAULT_LOG="xattr-test-logs"
> > @@ -59,6 +60,8 @@ declare -i EA_NUMS
> > declare -i EA_NAME_LEN
> > declare -i EA_VALUE_SIZE
> >
> > +declare -i i
> > +
> > set -o pipefail
> >
> > BOOTUP=color
> > @@ -111,7 +114,6 @@ exit_or_not()
> > fi
> > }
> >
> > -
> > ################################################################################
> > # Utility Functions
> > ################################################################################
> > @@ -218,6 +220,396 @@ f_do_umount()
> > exit_or_not ${RET}
> > }
> >
> > +f_is_xattr_inlined()
> > +{
> > + #${1} is test file
> > + #${2} is target volume
> > +
> > + ${DEBUGFS_BIN} -R "xattr ${1}" ${2}|grep -qi "block" || {
> > + return 0
> > + }
> > +
> > + return 1
> > +}
> > +
> > +f_is_xattr_bucketed()
> > +{
> > + #${1} is test file
> > + #${2} is target volume
> > +
> > + ${DEBUGFS_BIN} -R "xattr ${1}" ${2}|grep -qi "bucket" || {
> > + return 0
> > + }
> > +
> > + return 1
> > +}
> > +
> > +#
> > +# Insert xattr entries with given number and mode
> > +# ${1} specify entry type(small or large)
> > +# ${2} specify file name
> > +# ${3} specify entry number
> > +#
> > +f_insert_xattrs()
> > +{
> > + local XATTR_NAME_PREFIX=
> > + local XATTR_VALUE_PREFIX=
> > + local FILENAME=${2}
> > + local ENTRY_NUM=${3}
> > + local XATTR_NAME=
> > + local XATTR_VALUE=
> > + local LARGE_VALUE_LESS_THAN_80="largelargelargelargelargelargelargelargelargelargelargelargelargelargelarge."
> > +
> > +
> > + if [ "x${1}" = "xsmall" ];then
> > + XATTR_NAME_PREFIX="user."
> > + XATTR_VALUE_PREFIX=""
> > + else
> > + XATTR_NAME_PREFIX="user.large."
> > + XATTR_VALUE_PREFIX=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + fi
> > +
> > + for i in $(seq ${ENTRY_NUM});do
> > + XATTR_NAME="${XATTR_NAME_PREFIX}${i}"
> > + XATTR_VALUE="${XATTR_VALUE_PREFIX}${i}"
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > + done
> > +
> > + return $?
> > +
> > +}
> > +
> > +#
> > +# Make inline-xattr firstly extented with small or large files increasing.
> > +# ${1} stands for entry type(small or large)
> > +# ${2} stands for file name
> > +# ${3} should be block or bucket
> > +# block: extend inlined xattr to block.
> > +# xattr: extend block to bucket.
> > +#
> > +f_extend_xattr()
> > +{
> > + local XATTR_NAME_PREFIX=
> > + local XATTR_VALUE_PREFIX=
> > + local FILENAME=${2}
> > + local EXTEND_TYPE=${3}
> > + local XATTR_NAME=
> > + local XATTR_VALUE=
> > + local LARGE_VALUE_LESS_THAN_80="largelargelargelargelargelargelargelargelargelargelargelargelargelargelarge."
> > +
> > +
> > + if [ "x${1}" = "xsmall" ];then
> > + XATTR_NAME_PREFIX="user."
> > + XATTR_VALUE_PREFIX=""
> > + else
> > + XATTR_NAME_PREFIX="user.large."
> > + XATTR_VALUE_PREFIX=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + fi
> > +
> > + i=1
> > + while : ;do
> > + XATTR_NAME="${XATTR_NAME_PREFIX}${i}"
> > + XATTR_VALUE="${XATTR_VALUE_PREFIX}${i}"
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > + sync
> > +
> > + if [ "x${EXTEND_TYPE}" = "xblock" ];then
> > + f_is_xattr_inlined ${DEBUG_TEST_FILE} ${OCFS2_DEVICE} || {
> > + break
> > + }
> > + else
> > +
> > + f_is_xattr_bucketed ${DEBUG_TEST_FILE} ${OCFS2_DEVICE} || {
> > + break
> > + }
> > +
> > + fi
> > +
> > + ((i++))
> > + done
> > +
> > + return $?
> > +}
> > +
> > +f_add_func_test()
> > +{
> > + SUB_TESTNO=1
> > + TEST_FILE=${WORKPLACE}/additional-func-test-file
> > + DEBUG_TEST_FILE=/xattr_test_place/additional-func-test-file
> > + LARGE_VALUE_LESS_THAN_80="largelargelargelargelargelargelargelargelargelargelargelargelargelargelarge"
> > + LARGE_VALUE_MORE_THAN_80="largelargelargelargelargelargelargelargelargelargelargelargelargelargelargelargelarge"
> > + declare -i MAX_SMALL_INLINE_XATTR
> > + declare -i MAX_LARGE_INLINE_XATTR
> > + declare -i MAX_SMALL_BLOCK_XATTR
> > + declare -i MAX_LARGE_BLOCK_XATTR
> > +
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + echo "Test ${SUB_TESTNO}: None Xattr Test.">>${DETAIL_LOG_FILE}
> > +
> > + DUMMY_NAME="user.dummy"
> > + EMPTY_NAME=" "
> > + INVALID_NAME="user."
> > +
> > + for ea_name in ${DUMMY_NAME} ${EMPTY_NAME} ${INVALID_NAME};do
> > + ${GETXATTR} -n ${ea_name} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + RET=$?
> > + #if [ "${RET}" = "0" ];then
> > + # echo "Should not get a entry from a None-xattr file.">>${DETAIL_LOG_FILE} 2>&1
> > + # echo_failure | tee -a ${RUN_LOG_FILE}
> > + # echo | tee -a ${RUN_LOG_FILE}
> > + # exit 1
> > +
> > + #fi
> > + done;
> > +
> > + ((SUB_TESTNO++))
> > +
> > + echo "Test ${SUB_TESTNO}: Simple In-inode-xattr Test.">>${DETAIL_LOG_FILE}
> > + # Add a small ea in inode
> > + XATTR_NAME="user.small"
> > + XATTR_VALUE="smallvalue"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + # Add a large ea in inode
> > + XATTR_NAME="user.large"
> > + XATTR_VALUE=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ((SUB_TESTNO++))
> > +
> > + echo "Test ${SUB_TESTNO}: In inode EA extension test.">>${DETAIL_LOG_FILE}
> > + # Get very ready for extension after a small ea insertion
> > + f_extend_xattr "small" ${TEST_FILE} "block"
> > + MAX_SMALL_INLINE_XATTR=$((${i}-1))
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + # Get very ready for extension after a large ea insertion
> > + f_extend_xattr "large" ${TEST_FILE} "block"
> > + MAX_LARGE_INLINE_XATTR=$((${i}-1))
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + # Replace a small ea to a large one to extend
> > + f_extend_xattr "small" ${TEST_FILE} "block"
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.${i}"
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + #Large xattr value less than 80
> > + XATTR_VALUE=${LARGE_VALUE_LESS_THAN_80}${i}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + f_extend_xattr "small" ${TEST_FILE} "block"
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.${i}"
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + #Large xattr value more than 80
> > + XATTR_VALUE=${LARGE_VALUE_MORE_THAN_80}${i}
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + ((SUB_TESTNO++))
> > +
> > + echo "Test ${SUB_TESTNO}: Outside Xattr Shrink Test.">>${DETAIL_LOG_FILE}
> > + f_extend_xattr "small" ${TEST_FILE} "block"
> > + exit_or_not $?
> > +
> > + # Add a small ea in external block
> > + XATTR_NAME="user.small"
> > + XATTR_VALUE="SMALL"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + # Add a large ea in external block
> > + XATTR_NAME="user.large"
> > + XATTR_VALUE=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + # Replace a large entry with a small one to shrink
> > + f_extend_xattr "large" ${TEST_FILE} "block"
> > +
> > + # Here we verify a bug when updating a boundary entry without shrinking.
> > + XATTR_NAME="user.large.${i}"
> > + XATTR_VALUE="${LARGE_VALUE_LESS_THAN_80}.${i}"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.large.${i}"
> > + XATTR_VALUE="${i}"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + # Replace a large entry with also a large one(value size > 80) to shrink
> > + # Since it should reserve the space on inode more the 48 bytes, we need more elaborate operations.
> > + ${SETXATTR} -n "user.1" -v "1" ${TEST_FILE}
> > + ${SETXATTR} -n "user.2" -v "2" ${TEST_FILE}
> > + ${SETXATTR} -n "user.large.1" -v ${LARGE_VALUE_LESS_THAN_80} ${TEST_FILE}
> > + ${SETXATTR} -n "user.large.2" -v ${LARGE_VALUE_LESS_THAN_80} ${TEST_FILE}
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.large.2"
> > + # Make value size more than 80 here
> > + XATTR_VALUE=${LARGE_VALUE_MORE_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + ((SUB_TESTNO++))
> > +
> > + echo "Test ${SUB_TESTNO}: Basic Bucket Extension Test.">>${DETAIL_LOG_FILE}
> > + f_extend_xattr "small" ${TEST_FILE} "bucket"
> > + MAX_SMALL_BLOCK_XATTR=$((${i}-1))
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + f_extend_xattr "large" ${TEST_FILE} "bucket"
> > + MAX_LARGE_BLOCK_XATTR=$((${i}-1))
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + # Get very ready to extend block to bucket.
> > + f_insert_xattrs "small" ${TEST_FILE} ${MAX_SMALL_BLOCK_XATTR}
> > + exit_or_not $?
> > +
> > + # Replace a small entry with a large one,less than 80
> > + XATTR_NAME=user.${i}
> > + XATTR_VALUE=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + f_insert_xattrs "small" ${TEST_FILE} ${MAX_SMALL_BLOCK_XATTR}
> > + exit_or_not $?
> > +
> > + # Replace a small entry with a large one, more than 80
> > + XATTR_NAME=user.${i}
> > + XATTR_VALUE=${LARGE_VALUE_MORE_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + ((SUB_TESTNO++))
> > +
> > + echo "Test ${SUB_TESTNO}: Basic Bucket Insert & Shrink Test.">>${DETAIL_LOG_FILE}
> > +
> > + f_extend_xattr "small" ${TEST_FILE} "bucket"
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.small"
> > + XATTR_VALUE="SMALL"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + XATTR_NAME="user.large"
> > + XATTR_VALUE=${LARGE_VALUE_LESS_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + f_extend_xattr "large" ${TEST_FILE} "bucket"
> > + exit_or_not $?
> > +
> > + # Remove one random entry in inode-block to leave space for further replacing
> > + RANDOM_SLOT=$((${RANDOM}%${MAX_LARGE_INLINE_XATTR}+1))
> > + XATTR_NAME=user.large.${RANDOM_SLOT}
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + # Replace a large xattr with small one in bucket to make it stored in inode-block.
> > + RANDOM_SLOT=$((${RANDOM}%$((${MAX_LARGE_BLOCK_XATTR}-${MAX_LARGE_INLINE_XATTR}+1))+${MAX_LARGE_INLINE_XATTR}))
> > + XATTR_NAME=user.large.${RANDOM_SLOT}
> > + XATTR_VALUE="SMALL"
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + ${RM} -rf ${TEST_FILE}
> > + ${TOUCH_BIN} ${TEST_FILE}
> > +
> > + f_extend_xattr "large" ${TEST_FILE} "bucket"
> > + exit_or_not $?
> > +
> > + RANDOM_SLOT=$((${RANDOM}%${MAX_LARGE_INLINE_XATTR}+1))
> > + XATTR_NAME=user.large.${RANDOM_SLOT}
> > +
> > + ${SETXATTR} -x ${XATTR_NAME} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + # Replace a large xattr with large one(more than 80) in bucket to make it stored in inode-block.
> > + RANDOM_SLOT=$((${RANDOM}%$((${MAX_LARGE_BLOCK_XATTR}-${MAX_LARGE_INLINE_XATTR}+1))+${MAX_LARGE_INLINE_XATTR}))
> > + XATTR_NAME=user.large.${RANDOM_SLOT}
> > + XATTR_VALUE=${LARGE_VALUE_MORE_THAN_80}
> > +
> > + ${SETXATTR} -n ${XATTR_NAME} -v ${XATTR_VALUE} ${TEST_FILE} >>${DETAIL_LOG_FILE} 2>&1
> > + exit_or_not $?
> > +
> > + return $?
> > +}
> > +
> > f_runtest()
> > {
> > echo >>${DETAIL_LOG_FILE}
> > @@ -265,6 +657,20 @@ f_runtest()
> > ${RM} -rf ${WORKPLACE}/* || exit 1
> >
> >
> > + echo >>${DETAIL_LOG_FILE}
> > + echo "==========================================================">>${DETAIL_LOG_FILE}
> > + echo -ne "Perform Additional Func Test:"|tee -a ${RUN_LOG_FILE}
> > + echo -ne "Perform Additional Func Test::">>${DETAIL_LOG_FILE}
> > + echo >>${DETAIL_LOG_FILE}
> > + echo "==========================================================">>${DETAIL_LOG_FILE}
> > + if [ ! ${BLOCKSIZE} -eq 512 ];then
> > + f_add_func_test
> > + fi
> > + RET=$?
> > + echo_status ${RET} |tee -a ${RUN_LOG_FILE}
> > + exit_or_not ${RET}
> > + ${RM} -rf ${WORKPLACE}/* || exit 1
> > +
> > echo >>${DETAIL_LOG_FILE}
> > echo "==========================================================">>${DETAIL_LOG_FILE}
> > echo -ne "Check Utility of SingleNode Xattr on Ocfs2:"|tee -a ${RUN_LOG_FILE}
More information about the Ocfs2-test-devel
mailing list