X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=cd2f4da28850c6c9bcff11a0f2d685eb20cfb22b;hp=f0dcb6af6c360775afc9a1f2413ee2db8cf463a6;hb=825570b0b03e0fd70aba5400dedca4e6d94d5141;hpb=823147fa760752c8c2ff11a5bd74f71f819f9e4e diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index f0dcb6a..cd2f4da 100644 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -60,9 +60,11 @@ init_logging [ "$SLOW" = "no" ] && EXCEPT_SLOW="24o 27m 64b 68 71 77f 78 115 124b 230d" -[ $(facet_fstype $SINGLEMDS) = "zfs" ] && -# bug number for skipped test: LU-1593 LU-2833 LU-1957 LU-2805 - ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 48a 180 184c" +if [ $(facet_fstype $SINGLEMDS) = "zfs" ]; then + # bug number for skipped test: LU-1593 LU-4536 LU-5242 LU-1957 LU-2805 + ALWAYS_EXCEPT="$ALWAYS_EXCEPT 34h 65ic 132 180 184c" + [ "$SLOW" = "no" ] && EXCEPT_SLOW="$EXCEPT_SLOW 51b 51ba" +fi FAIL_ON_ERROR=false @@ -2569,7 +2571,7 @@ test_33b() { rm -fr $DIR/d33 test_mkdir -p $DIR/d33 chown $RUNAS_ID $DIR/d33 - $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 + $RUNAS $OPENFILE -f 1286739555 $DIR/d33/f33 || true } run_test 33b "test open file with malformed flags (No panic)" @@ -3794,6 +3796,10 @@ run_test 46 "dirtying a previously written page ================" # test_47 is removed "Device nodes check" is moved to test_28 test_48a() { # bug 2399 + [ $(facet_fstype $SINGLEMDS) = "zfs" ] && + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.3.63) ] && + skip "MDS prior to 2.3.63 handle ZFS dir .. incorrectly" && + return check_kernel_version 34 || return 0 test_mkdir -p $DIR/$tdir cd $DIR/$tdir @@ -3976,22 +3982,30 @@ test_51b() { test_mkdir -p -c1 $BASE + $LFS df + $LFS df -i local mdtidx=$(printf "%04x" $($LFS getstripe -M $BASE)) local numfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.filesfree) - [[ $numfree -lt 21000 ]] && skip "not enough free inodes ($numfree)" && + [[ $numfree -lt 21000 ]] && + skip "not enough free inodes ($numfree) on MDT$mdtidx" && return [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) && - echo "reduced count to $NUMTEST due to inodes" + echo "reduced count to $NUMTEST due to inodes on MDT$mdtidx" # need to check free space for the directories as well local blkfree=$(lctl get_param -n mdc.$FSNAME-MDT$mdtidx*.kbytesavail) numfree=$((blkfree / 4)) - [[ $numfree -lt $NUMTEST ]] && NUMTEST=$(($numfree - 50)) && - echo "reduced count to $NUMTEST due to blocks" + [[ $numfree -lt $NUMTEST ]] && NUMTEST=$((numfree - 50)) && + echo "reduced count to $NUMTEST due to blocks on MDT$mdtidx" createmany -d $BASE/d $NUMTEST && echo $NUMTEST > $BASE/fnum || + { + $LFS df + $LFS df -i echo "failed" > $BASE/fnum + error "failed to create $NUMTEST subdirs in MDT$mdtidx:$BASE" + } } run_test 51b "exceed 64k subdirectory nlink limit" @@ -4765,29 +4779,9 @@ test_56v() { } run_test 56v "check 'lfs find -mdt match with lfs getstripe -M' =======" -# Get and check the actual stripe count of one file. -# Usage: check_stripe_count -check_stripe_count() { - local file=$1 - local expected=$2 - local actual - - [[ -z "$file" || -z "$expected" ]] && - error "check_stripe_count: invalid argument!" - - local cmd="$GETSTRIPE -c $file" - actual=$($cmd) || error "$cmd failed" - actual=${actual%% *} - - if [[ $actual -ne $expected ]]; then - [[ $expected -eq -1 ]] || - error "$cmd wrong: found $actual, expected $expected" - [[ $actual -eq $OSTCOUNT ]] || - error "$cmd wrong: found $actual, expected $OSTCOUNT" - fi -} - test_56w() { + [[ $OSTCOUNT -lt 2 ]] && skip_env "$OSTCOUNT < 2 OSTs -- skipping" && + return [ $PARALLEL == "yes" ] && skip "skip parallel run" && return TDIR=$DIR/${tdir}w @@ -4838,6 +4832,29 @@ test_56w() { check_stripe_count $TDIR/file1 $expected + if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.90) ]; + then + # lfs_migrate file onto OST 0 if it is on OST 1, or onto + # OST 1 if it is on OST 0. This file is small enough to + # be on only one stripe. + file=$TDIR/migr_1_ost + dd bs=$dd_bs count=1 if=/dev/urandom of=$file >/dev/null 2>&1 || + error "write data into $file failed" + local obdidx=$($LFS getstripe -i $file) + local oldmd5=$(md5sum $file) + local newobdidx=0 + [[ $obdidx -eq 0 ]] && newobdidx=1 + cmd="$LFS migrate -i $newobdidx $file" + echo $cmd + eval $cmd || error "$cmd failed" + local realobdix=$($LFS getstripe -i $file) + local newmd5=$(md5sum $file) + [[ $newobdidx -ne $realobdix ]] && + error "new OST is different (was=$obdidx, wanted=$newobdidx, got=$realobdix)" + [[ "$oldmd5" != "$newmd5" ]] && + error "md5sum differ: $oldmd5, $newmd5" + fi + # lfs_migrate dir cmd="$LFS_MIGRATE -y -c $expected $TDIR/dir1" echo "$cmd" @@ -6811,6 +6828,27 @@ test_102n() { # LU-4101 mdt: protect internal xattrs setfattr --remove=$trusted.$name $file1 2> /dev/null done + if [ $(lustre_version_code $SINGLEMDS) -gt $(version_code 2.6.50) ] + then + name="lfsck_ns" + # Try to copy xattr from $file0 to $file1. + value=$(getxattr $file0 trusted.$name 2> /dev/null) + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # Try to set a garbage xattr. + value=0sVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIGl0c2VsZi4= + + setfattr --name=trusted.$name --value="$value" $file1 || + error "setxattr 'trusted.$name' failed" + + # Try to remove the xattr from $file1. We don't care if this + # appears to succeed or fail, we just don't want there to be + # any changes or crashes. + setfattr --remove=$trusted.$name $file1 2> /dev/null + fi + # Get 'after' xattrs of file1. getfattr --absolute-names --dump --match=- $file1 > $xattr1 @@ -6857,6 +6895,9 @@ test_103a() { skip_env "could not find setfacl" && return $GSS && skip "could not run under gss" && return + gpasswd -a daemon bin # LU-5641 + do_facet $SINGLEMDS gpasswd -a daemon bin # LU-5641 + declare -a identity_old for num in $(seq $MDSCOUNT); do @@ -9766,6 +9807,82 @@ test_154e() } run_test 154e ".lustre is not returned by readdir" +test_154f() { + # create parent directory on a single MDT to avoid cross-MDT hardlinks + test_mkdir -p -c1 $DIR/$tdir/d + # test dirs inherit from its stripe + mkdir -p $DIR/$tdir/d/foo1 || error "mkdir error" + mkdir -p $DIR/$tdir/d/foo2 || error "mkdir error" + cp /etc/hosts $DIR/$tdir/d/foo1/$tfile + ln $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/link + touch $DIR/f + + # get fid of parents + local FID0=$($LFS path2fid $DIR/$tdir/d) + local FID1=$($LFS path2fid $DIR/$tdir/d/foo1) + local FID2=$($LFS path2fid $DIR/$tdir/d/foo2) + local FID3=$($LFS path2fid $DIR) + + # check that path2fid --parents returns expected /name + # 1) test for a directory (single parent) + local parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1) + [ "$parent" == "$FID0/foo1" ] || + error "expected parent: $FID0/foo1, got: $parent" + + # 2) test for a file with nlink > 1 (multiple parents) + parent=$($LFS path2fid --parents $DIR/$tdir/d/foo1/$tfile) + echo "$parent" | grep -F "$FID1/$tfile" || + error "$FID1/$tfile not returned in parent list" + echo "$parent" | grep -F "$FID2/link" || + error "$FID2/link not returned in parent list" + + # 3) get parent by fid + local file_fid=$($LFS path2fid $DIR/$tdir/d/foo1/$tfile) + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + echo "$parent" | grep -F "$FID1/$tfile" || + error "$FID1/$tfile not returned in parent list (by fid)" + echo "$parent" | grep -F "$FID2/link" || + error "$FID2/link not returned in parent list (by fid)" + + # 4) test for entry in root directory + parent=$($LFS path2fid --parents $DIR/f) + echo "$parent" | grep -F "$FID3/f" || + error "$FID3/f not returned in parent list" + + # 5) test it on root directory + [ -z "$($LFS path2fid --parents $MOUNT 2>/dev/null)" ] || + error "$MOUNT should not have parents" + + # enable xattr caching and check that linkea is correctly updated + local save="$TMP/$TESTSUITE-$TESTNAME.parameters" + save_lustre_params client "llite.*.xattr_cache" > $save + lctl set_param llite.*.xattr_cache 1 + + # 6.1) linkea update on rename + mv $DIR/$tdir/d/foo1/$tfile $DIR/$tdir/d/foo2/$tfile.moved + + # get parents by fid + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + # foo1 should no longer be returned in parent list + echo "$parent" | grep -F "$FID1" && + error "$FID1 should no longer be in parent list" + # the new path should appear + echo "$parent" | grep -F "$FID2/$tfile.moved" || + error "$FID2/$tfile.moved is not in parent list" + + # 6.2) linkea update on unlink + rm -f $DIR/$tdir/d/foo2/link + parent=$($LFS path2fid --parents $MOUNT/.lustre/fid/$file_fid) + # foo2/link should no longer be returned in parent list + echo "$parent" | grep -F "$FID2/link" && + error "$FID2/link should no longer be in parent list" + true + + rm -f $DIR/f + restore_lustre_params < $save +} +run_test 154f "get parent fids by reading link ea" + test_155_small_load() { local temp=$TMP/$tfile local file=$DIR/$tfile @@ -10415,6 +10532,8 @@ check_path() { local fid=$2 local path=$(${LFS} fid2path $*) + # Remove the '//' indicating a remote directory + path=$(echo $path | sed 's#//#/#g') RC=$? if [ $RC -ne 0 ]; then @@ -10509,6 +10628,33 @@ test_162b() { } run_test 162b "striped directory path lookup sanity" +# LU-4239: Verify fid2path works with paths 100 or more directories deep +test_162c() { + test_mkdir $DIR/$tdir.local + test_mkdir $DIR/$tdir.remote + local lpath=$tdir.local + local rpath=$tdir.remote + + for ((i = 0; i <= 101; i++)); do + lpath="$lpath/$i" + mkdir $DIR/$lpath + FID=$($LFS path2fid $DIR/$lpath | tr -d '[]') || + error "get fid for local directory $DIR/$lpath failed" + check_path "$DIR/$lpath" $MOUNT $FID --link 0 || + error "check path for local directory $DIR/$lpath failed" + + rpath="$rpath/$i" + test_mkdir $DIR/$rpath + FID=$($LFS path2fid $DIR/$rpath | tr -d '[]') || + error "get fid for remote directory $DIR/$rpath failed" + check_path "$DIR/$rpath" $MOUNT $FID --link 0 || + error "check path for remote directory $DIR/$rpath failed" + done + + return 0 +} +run_test 162c "fid2path works with paths 100 or more directories deep" + test_169() { # do directio so as not to populate the page cache log "creating a 10 Mb file" @@ -11020,6 +11166,7 @@ test_200() { local ost_range="$first_ost $last_ost $ost_step" local test_path=$POOL_ROOT/$POOL_DIR_NAME local file_dir=$POOL_ROOT/file_tst + local subdir=$test_path/subdir local rc=0 while : ; do @@ -11030,6 +11177,8 @@ test_200() { mkdir -p $test_path pool_set_dir $POOL $test_path || { rc=$? ; break; } pool_check_dir $POOL $test_path || { rc=$? ; break; } + mkdir -p $subdir + pool_check_dir $POOL $subdir || { rc=$? ; break; } pool_dir_rel_path $POOL $POOL_DIR_NAME $POOL_ROOT \ || { rc=$? ; break; } # former test_200e test_200f @@ -11239,6 +11388,10 @@ test_205() { # Job stats trap jobstats_set EXIT fi + local user=$(do_facet $SINGLEMDS $LCTL --device $MDT0 \ + changelog_register -n) + echo "Registered as changelog user $user" + # mkdir cmd="mkdir $DIR/$tfile" verify_jobstats "$cmd" "mdt" @@ -11270,6 +11423,24 @@ test_205() { # Job stats cmd="mv -f $DIR/$tfile $DIR/jobstats_test_rename" verify_jobstats "$cmd" "mdt" + # Ensure that jobid are present in changelog (if supported by MDS) + if [ $(lustre_version_code $SINGLEMDS) -ge $(version_code 2.6.52) ] + then + $LFS changelog $MDT0 | tail -9 + jobids=$($LFS changelog $MDT0 | tail -9 | grep -c "j=") + [ $jobids -eq 9 ] || + error "Wrong changelog jobid count $jobids != 9" + + # LU-5862 + JOBENV="disable" + jobstats_set $JOBENV + touch $DIR/$tfile + $LFS changelog $MDT0 | tail -1 + jobids=$($LFS changelog $MDT0 | tail -1 | grep -c "j=") + [ $jobids -eq 0 ] || + error "Unexpected jobids when jobid_var=$JOBENV" + fi + # cleanup rm -f $DIR/jobstats_test_rename @@ -12564,6 +12735,8 @@ test_238() { run_test 238 "Verify linkea consistency" test_239() { + [ $(lustre_version_code $SINGLEMDS) -lt $(version_code 2.5.60) ] && + skip "Need MDS version at least 2.5.60" && return local list=$(comma_list $(mdts_nodes)) mkdir -p $DIR/$tdir @@ -12621,6 +12794,19 @@ test_241() { } run_test 241 "bio vs dio" +test_242() { + mkdir -p $DIR/$tdir + touch $DIR/$tdir/$tfile + + #define OBD_FAIL_MDS_READPAGE_PACK 0x105 + do_facet mds1 lctl set_param fail_loc=0x105 + /bin/ls $DIR/$tdir && error "ls $DIR/$tdir should fail" + + do_facet mds1 lctl set_param fail_loc=0 + /bin/ls $DIR/$tdir || error "ls $DIR/$tdir failed" +} +run_test 242 "mdt_readpage failure should not cause directory unreadable" + cleanup_test_300() { trap 0 umask $SAVE_UMASK