X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fmetadata-updates.sh;h=86ae8db6d07715bfcdcd4bafa3115844adbdaaee;hb=223728a97c397e6e6c91808dd36a2539705f00b8;hp=68f80775faf626006e23e06d02558d410efffbb9;hpb=044a13ae4b617344a266c5f25f494994465363da;p=fs%2Flustre-release.git diff --git a/lustre/tests/metadata-updates.sh b/lustre/tests/metadata-updates.sh index 68f8077..86ae8db 100755 --- a/lustre/tests/metadata-updates.sh +++ b/lustre/tests/metadata-updates.sh @@ -6,12 +6,19 @@ set -e -LUSTRE=${LUSTRE:-$(cd $(dirname $0)/..; echo $PWD)} +ONLY=${ONLY:-"$*"} + +LUSTRE=${LUSTRE:-$(dirname $0)/..} . $LUSTRE/tests/test-framework.sh init_test_env $@ -. ${CONFIG:=$LUSTRE/tests/cfg/$NAME.sh} +init_logging + +#Bug number for skipped test: +ALWAYS_EXCEPT="$METADATA_UPDATES_EXCEPT " +# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT LIST +build_test_filter -TRACE="+x" +TRACE=${TRACE:-"+x"} TESTDIR=${TESTDIR:-$DIR/d0.$(basename $0 .sh)} @@ -19,6 +26,11 @@ NODES_TO_USE=${NODES_TO_USE:-$CLIENTS} [ -z $CLIENTS ] && NODES_TO_USE=$(hostname) +# hostname could differ from a network interface +# configured for NODES_TO_USE, bug 23961 +# the test dir on each host is created based on `hostname` of this host +HOSTS=$(comma_list $(do_nodes $NODES_TO_USE "echo \\\$(hostname)")) + FILE=testfile FILE_SIZE=1024 CURRENT_MODE=0644 @@ -26,16 +38,12 @@ NEW_MODE=0222 NEW_ATIME="2001-01-01 GMT" NEW_MTIME="2005-05-05 GMT" -test_UID=$(id -u) -test_GID=$(id -g) +test_USER=$(id -u -n) +test_GROUP=$(id -g -n) -NUM_FILES=1000 - -WRITE_DISJOINT=${WRITE_DISJOINT:-$(which write_disjoint 2> /dev/null)} || true -WRITE_DISJOINT_FILE=$TESTDIR/f0.write_disjoint_file -NUMLOOPS=1000 +SUMFILE=$TESTDIR/mdsum -SUM=$(pwd)/sum +NUM_FILES=1000 log "===== $0 ====== " @@ -43,129 +51,108 @@ check_and_setup_lustre cleanup_prepare () { - do_nodes $NODES_TO_USE "set $TRACE; -DIR=$TESTDIR/\\\$(hostname); -TESTFILE=\\\$DIR/$FILE; -rm -f \\\$TESTFILE; -rmdir \\\$DIR 2>/dev/null; -mkdir -p \\\$DIR" || return ${PIPESTATUS[0]} - - return 0 + do_nodes $NODES_TO_USE "set $TRACE; + DIR=$TESTDIR/\\\$(hostname); + TESTFILE=\\\$DIR/$FILE; + rm -f \\\$TESTFILE; + rm -f $SUMFILE; + rmdir \\\$DIR 2>/dev/null; + mkdir -p \\\$DIR" || return ${PIPESTATUS[0]} + return 0; } do_mknod () { - echo "Creating file(s) by mknod (2) ... " - - do_nodes $NODES_TO_USE "set $TRACE -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE -mcreate \\\$TESTFILE" || return ${PIPESTATUS[0]} + log "Creating file(s) by mknod (2) ... " - return 0 + do_nodes $NODES_TO_USE "set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + mcreate \\\$TESTFILE; " || return ${PIPESTATUS[0]} + return 0 } do_write () { - echo "Writing data to file(s) ... store md5sum ... " - - do_nodes $NODES_TO_USE "set $TRACE; -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; -sum=${SUM}_\\\$(hostname); -dd if=/dev/zero of=\\\$TESTFILE bs=$FILE_SIZE count=1 2>/dev/null; -md5sum \\\$TESTFILE > \\\$sum " - if [ ${PIPESTATUS[0]} -ne 0 ] ; then - echo "ERROR: on file creation" - return 1 - fi - - return 0 + do_nodes $NODES_TO_USE "set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + dd if=/dev/zero of=\\\$TESTFILE bs=$FILE_SIZE count=1 2>/dev/null || + exit 54; + echo \\\$(hostname) | dd of=\\\$TESTFILE conv=notrunc 2>/dev/null || + exit 55; + md5sum \\\$TESTFILE >> $SUMFILE; " || return ${PIPESTATUS[0]} + return 0 } do_check_data () { - local HOST - echo "Checking file(s) data ... " - - for HOST in ${NODES_TO_USE//,/ } ; do - local sum=${SUM}_$HOST - do_nodes $NODES_TO_USE "md5sum --check $sum" - if [ ${PIPESTATUS[0]} -ne 0 ] ; then - echo "ERROR: wrong data." - [ -f $sum ] && { cat $sum ; rm -f $sum; } - return 1 - fi - [ -f $sum ] && { cat $sum; rm -f $sum; } - done - - return 0 + log "Checking file(s) data ... md5sum : " + cat $SUMFILE + + do_nodesv $NODES_TO_USE "md5sum --check $SUMFILE" || + return ${PIPESTATUS[0]} + return 0 } do_truncate () { - echo "Truncating file(s) ... " + log "Truncating file(s) ... " - do_nodes $NODES_TO_USE "set $TRACE; -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; -truncate \\\$TESTFILE 0" || return ${PIPESTATUS[0]} + do_nodes $NODES_TO_USE "set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + $TRUNCATE \\\$TESTFILE 0" || return ${PIPESTATUS[0]} - FILE_SIZE=0 - - return 0 + FILE_SIZE=0 + return 0 } # check st_uid, st_gid, st_size, st_mode get_stat () { - local attr="$test_UID $test_GID $FILE_SIZE $CURRENT_MODE" + local attr="$test_USER $test_GROUP $FILE_SIZE $CURRENT_MODE" - echo "Checking file(s) attributes ... " + log "Checking file(s) attributes ... " - do_nodes $NODES_TO_USE "set $TRACE; -for HOST in ${NODES_TO_USE//,/ } ; do + do_nodesv $NODES_TO_USE "set $TRACE; +for HOST in ${HOSTS//,/ } ; do TESTFILE=$TESTDIR/\\\$HOST/$FILE; - tmp=\\\$(stat -c \\\"%u %g %s 0%a\\\" \\\$TESTFILE); + tmp=\\\$(stat -c \\\"%U %G %s 0%a\\\" \\\$TESTFILE); echo \\\"\\\$TESTFILE [ uid gid size mode ] expected : $attr ; got : \\\$tmp \\\"; if [ x\\\"\\\$tmp\\\" != x\\\"$attr\\\" ] ; then echo \\\"Wrong file attributes\\\"; exit 56; fi; -done " - if [ ${PIPESTATUS[0]} -ne 0 ] ; then - return 1 - fi - - return 0 +done " || return ${PIPESTATUS[0]} + return 0 } do_chmod () { - echo "Performing chmod 0$NEW_MODE ..." + log "Performing chmod 0$NEW_MODE ..." - do_nodes $NODES_TO_USE "set $TRACE; -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; -chmod $NEW_MODE \\\$TESTFILE" || return ${PIPESTATUS[0]} - - CURRENT_MODE=$NEW_MODE + do_nodes $NODES_TO_USE "set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + chmod $NEW_MODE \\\$TESTFILE" || return ${PIPESTATUS[0]} - return 0 + CURRENT_MODE=$NEW_MODE + return 0 } do_change_timestamps () { - echo "Changing atime, mtime ..." - - do_nodes $NODES_TO_USE " set $TRACE; -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; -touch -c --date=\\\"$NEW_ATIME\\\" -a \\\$TESTFILE; -touch -c --date=\\\"$NEW_MTIME\\\" -m \\\$TESTFILE " || return ${PIPESTATUS[0]} + log "Changing atime, mtime ..." - return 0 + do_nodes $NODES_TO_USE " set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + touch -c --date=\\\"$NEW_ATIME\\\" -a \\\$TESTFILE; + touch -c --date=\\\"$NEW_MTIME\\\" -m \\\$TESTFILE " || + return ${PIPESTATUS[0]} + return 0 } # check st_atime, st_mtime do_check_timestamps () { - local atime=$(date --date="$NEW_ATIME" +%s) - local mtime=$(date --date="$NEW_MTIME" +%s) + local atime=$(date --date="$NEW_ATIME" +%s) + local mtime=$(date --date="$NEW_MTIME" +%s) - local times="$atime $mtime" + local times="$atime $mtime" - echo "Checking atime, mtime ... " + log "Checking atime, mtime ... " - do_nodes $NODES_TO_USE "set $TRACE; -for HOST in ${NODES_TO_USE//,/ } ; do + do_nodesv $NODES_TO_USE "set $TRACE; +for HOST in ${HOSTS//,/ } ; do TESTFILE=$TESTDIR/\\\$HOST/$FILE; tmp=\\\$(stat -c \\\"%X %Y\\\" \\\$TESTFILE); if [ x\\\"\\\$tmp\\\" != x\\\"$times\\\" ] ; then @@ -173,35 +160,29 @@ for HOST in ${NODES_TO_USE//,/ } ; do RC=57; fi; done; -exit \\\$RC" - if [ ${PIPESTATUS[0]} -ne 0 ] ; then - echo "WARNING : Wrong atime and(or) mtime values. Hope this is expected." +exit \\\$RC" || return ${PIPESTATUS[0]} return 0 - fi - - return 0 } do_fill_dir () { - echo "Filling up directories ... files : f1 ... f$NUM_FILES) ... " - - do_nodes $NODES_TO_USE "set $TRACE; -TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; -rm -f \\\$TESTFILE; -DIR=$TESTDIR/\\\$(hostname); -for i in \\\$(seq $NUM_FILES) ; do - touch \\\$DIR/f\\\$i; -done " || return ${PIPESTATUS[0]} - - return 0 + log "Filling up directories ... files : f1 ... f$NUM_FILES) ... " + + do_nodes $NODES_TO_USE "set $TRACE; + TESTFILE=$TESTDIR/\\\$(hostname)/$FILE; + rm -f \\\$TESTFILE; + DIR=$TESTDIR/\\\$(hostname); + for i in \\\$(seq $NUM_FILES) ; do + touch \\\$DIR/f\\\$i; + done " || return ${PIPESTATUS[0]} + return 0 } check_dir_contents () { - local num_files=${1:-1} + local num_files=${1:-1} - echo "Checking dir contents ... (should exist files : f$num_files ... f$NUM_FILES) ... " - do_nodes $NODES_TO_USE "set $TRACE; -for HOST in ${NODES_TO_USE//,/ } ; do + log "Directory contents should exist: f$num_files ... f$NUM_FILES)" + do_nodes $NODES_TO_USE "set $TRACE; +for HOST in ${HOSTS//,/ } ; do DIR=$TESTDIR/\\\$HOST; for i in \\\$(seq $NUM_FILES -1 $num_files) ; do if ! [ -f \\\$DIR/f\\\$i ] ; then @@ -216,79 +197,82 @@ for HOST in ${NODES_TO_USE//,/ } ; do fi; done; done; -exit \\\$RC " - if [ ${PIPESTATUS[0]} -ne 0 ] ; then - return 1 - fi - - return 0 +exit \\\$RC " || return ${PIPESTATUS[0]} + return 0 } do_partial_delete () { - local num_files=$1 + local num_files=$1 - echo "Deleting files ... f1 ... f$num_files ... " - do_nodes $NODES_TO_USE "set $TRACE; + log "Deleting files ... f1 ... f$num_files ... " + do_nodes $NODES_TO_USE "set $TRACE; DIR=$TESTDIR/\\\$(hostname); for i in \\\$(seq $num_files) ; do if ! rm -f \\\$DIR/f\\\$i ; then exit 1; fi; -done " || return ${PIPESTATUS[0]} - - return 0 +done " || return ${PIPESTATUS[0]} + return 0 } -STATUS=0 - chmod 0777 $MOUNT || exit 1 mkdir -p $TESTDIR || exit 1 chmod 0777 $TESTDIR || exit 1 -cleanup_prepare || exit 1 - -# create file(s) (mknod (2)), write data, check data, check file attributes -echo "Part 1. create file(s) (mknod (2)), write data, check data, check file attributes." -do_mknod || exit ${PIPESTATUS[0]} -do_write || exit ${PIPESTATUS[0]} -do_check_data || exit ${PIPESTATUS[0]} -get_stat || STATUS=1 - -# file(s) attributes modification -echo "Part 2. file(s) attributes modification." -do_chmod || exit ${PIPESTATUS[0]} -get_stat || STATUS=1 - -do_change_timestamps || exit ${PIPESTATUS[0]} -do_check_timestamps || STATUS=1 - -# truncate file(s) to 0 size, check new file size -echo "Part 3. truncate file(s) to 0 size, check new file size." -do_truncate || exit ${PIPESTATUS[0]} -get_stat || STATUS=1 - -# directory content solidity -echo "Part 4. directory content solidity: fill up directory, check dir content, remove some files, check dir content." -do_fill_dir || exit ${PIPESTATUS[0]} -check_dir_contents || STATUS=1 - -do_partial_delete $(($NUM_FILES / 2)) || exit ${PIPESTATUS[0]} -check_dir_contents $(($NUM_FILES / 2 + 1)) || STATUS=1 - -# "write_disjoint" test -echo "Part 5. write_disjoint test: see lustre/tests/write_disjoint.c for details" -if [ -f "$WRITE_DISJOINT" ]; then - set $TRACE - MACHINEFILE=${MACHINEFILE:-$TMP/$(basename $0 .sh).machines} - generate_machine_file $NODES_TO_USE $MACHINEFILE - mpi_run -np $(get_node_count ${NODES_TO_USE//,/ }) $MACHINEFILE \ - $WRITE_DISJOINT -f $WRITE_DISJOINT_FILE -n $NUMLOOPS || STATUS=1 -else - skip "$0 : write_disjoint not found " -fi - -equals_msg `basename $0`: test complete, cleaning up +cleanup_prepare || error_exit "cleanup failed" + +test_1(){ + log "Create files (mknod (2)) and write data" + do_mknod || error "mknod failed" + do_write || error "write data failed" + log "Check data and file attributes." + do_check_data || error "md5sum verification failed" + get_stat || error "attributes check failed" + + # file attributes modification + log "File attributes modification." + do_chmod || error "chmod failed" + get_stat || error "wrong attributes after chmod" + + do_change_timestamps || error "timestamps change failed" + do_check_timestamps || error "wrong timestamps" + + # truncate file(s) to 0 size, check new file size + log "Truncate file(s) to 0 size, check new file size." + do_truncate || error "truncate failed" + get_stat || error "wrong attributes after truncate" +} +run_test 1 "create files (mknod), write and check data, truncate files" + +test_2() { + do_fill_dir || error "dir creation failed" + check_dir_contents || error "dir contents check failed" + + do_partial_delete $(($NUM_FILES / 2)) || error "delete failed" + check_dir_contents $(($NUM_FILES / 2 + 1)) || + error "dir contents check after delete failed" +} +run_test 2 "directory content create, check, delete files , check" + +test_3() { + WRITE_DISJOINT=${WRITE_DISJOINT:-$(which write_disjoint 2> /dev/null)} || true + disjoint_file=$TESTDIR/$tfile + numloops=1000 + + [ ! -f "$WRITE_DISJOINT" ] && skip_env "write_disjoint not found" + + set $TRACE + generate_machine_file $NODES_TO_USE $MACHINEFILE + mpi_run ${MACHINEFILE_OPTION} ${MACHINEFILE} \ + -np $(get_node_count ${NODES_TO_USE//,/ }) \ + $WRITE_DISJOINT -f $disjoint_file -n $numloops || + error "mpi_run failed" + + rm -f $MACHINEFILE +} +run_test 3 "write_disjoint test" + +complete $SECONDS rm -rf $TESTDIR -rm -f $MACHINEFILE check_and_cleanup_lustre -exit $STATUS +exit_status