X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=d78ded23afe8bb3a2cc2102db34fed6e48789c53;hb=4191e0cdd0d96b848c1235471179d25d37a889dc;hp=5af54494938214522ca6c5e57f83f3783f2a47d5;hpb=4ca7949bf0eaae98aa6b8596a8b0f51ced26d2a0;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index 5af5449..d78ded2 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -20,15 +20,17 @@ if $SHARED_KEY; then ALWAYS_EXCEPT="$ALWAYS_EXCEPT 17n 60a 133g 300f" fi +# Check Grants after these tests +GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c 64d" + +# skip the grant tests for ARM until they are fixed if [[ $(uname -m) = aarch64 ]]; then # bug number: LU-11596 (all below) - ALWAYS_EXCEPT+=" 42d 42e 63a 63b 64a 64b 64c" + ALWAYS_EXCEPT+=" $GRANT_CHECK_LIST" # bug number: LU-11671 LU-11594 LU-11667 LU-11729 ALWAYS_EXCEPT+=" 45 103a 317 810" fi -# Check Grants after these tests -GRANT_CHECK_LIST="$GRANT_CHECK_LIST 42a 42b 42c 42d 42e 63a 63b 64a 64b 64c" SRCDIR=$(cd $(dirname $0); echo $PWD) export PATH=$PATH:/sbin @@ -68,7 +70,7 @@ LUSTRE_TESTS_API_DIR=${LUSTRE_TESTS_API_DIR:-${LUSTRE}/tests/clientapi} . $LUSTRE/tests/test-framework.sh init_test_env $@ . ${CONFIG:=$LUSTRE/tests/cfg/${NAME}.sh} -get_lustre_env + init_logging # 5 12 (min)" @@ -1142,7 +1144,7 @@ run_test 24u "create stripe file" simple_cleanup_common() { local rc=0 trap 0 - [ -z "$DIR" -o -z "$tdir" ] && return 0 + [ -z "$DIR" ] || [ -z "$tdir" ] && return 0 local start=$SECONDS rm -rf $DIR/$tdir @@ -1184,10 +1186,10 @@ test_24v() { local num_ls=$(ls $DIR/$tdir | wc -l) local num_uniq=$(ls $DIR/$tdir | sort -u | wc -l) local num_all=$(ls -a $DIR/$tdir | wc -l) - if [ $num_ls -ne $nrfiles -o $num_uniq -ne $nrfiles -o \ - $num_all -ne $((nrfiles + 2)) ]; then - error "Expected $nrfiles files, got $num_ls " \ - "($num_uniq unique $num_all .&..)" + if [ $num_ls -ne $nrfiles ] || [ $num_uniq -ne $nrfiles ] || + [ $num_all -ne $((nrfiles + 2)) ]; then + error "Expected $nrfiles files, got $num_ls " \ + "($num_uniq unique $num_all .&..)" fi # LU-5 large readdir # dirent_size = 32 bytes for sizeof(struct lu_dirent) + @@ -1282,6 +1284,36 @@ test_24y() { } run_test 24y "rename/link on the same dir should succeed" +test_24z() { + [[ $MDSCOUNT -lt 2 ]] && skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -lt $(version_code 2.12.51) ]] && + skip "Need MDS version at least 2.12.51" + + local index + + for index in 0 1; do + $LFS mkdir -i $index $DIR/$tdir.$index || error "mkdir failed" + touch $DIR/$tdir.0/$tfile.$index || error "touch failed" + done + + mv $DIR/$tdir.0/$tfile.0 $DIR/$tdir.1 || error "mv $tfile.0 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.0) + [ $index -eq 0 ] || error "$tfile.0 is on MDT$index" + + local mdts=$(comma_list $(mdts_nodes)) + + do_nodes $mdts $LCTL set_param mdt.*.enable_remote_rename=0 + stack_trap "do_nodes $mdts $LCTL \ + set_param mdt.*.enable_remote_rename=1" EXIT + + mv $DIR/$tdir.0/$tfile.1 $DIR/$tdir.1 || error "mv $tfile.1 failed" + + index=$($LFS getstripe -m $DIR/$tdir.1/$tfile.1) + [ $index -eq 1 ] || error "$tfile.1 is on MDT$index" +} +run_test 24z "cross-MDT rename is done as cp" + test_24A() { # LU-3182 local NFILES=5000 @@ -1292,7 +1324,8 @@ test_24A() { # LU-3182 local t=$(ls $DIR/$tdir | wc -l) local u=$(ls $DIR/$tdir | sort -u | wc -l) local v=$(ls -ai $DIR/$tdir | sort -u | wc -l) - if [ $t -ne $NFILES -o $u -ne $NFILES -o $v -ne $((NFILES + 2)) ] ; then + if [ $t -ne $NFILES ] || [ $u -ne $NFILES ] || + [ $v -ne $((NFILES + 2)) ] ; then error "Expected $NFILES files, got $t ($u unique $v .&..)" fi @@ -1540,6 +1573,16 @@ test_27g() { } run_test 27g "$LFS getstripe with no objects" +test_27ga() { + test_mkdir $DIR/$tdir + touch $DIR/$tdir/$tfile || error "touch failed" + ln -s bogus $DIR/$tdir/$tfile.2 || error "ln failed" + $LFS getstripe -m $DIR/$tdir/$tfile $DIR/$tdir/$tfile.2 + local rc=$? + (( rc == 2 )) || error "getstripe did not return ENOENT" +} +run_test 27ga "$LFS getstripe with missing file (should return error)" + test_27i() { test_mkdir $DIR/$tdir touch $DIR/$tdir/$tfile || error "touch failed" @@ -1578,6 +1621,9 @@ run_test 27l "check setstripe permissions (should return error)" test_27m() { [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + [ -n "$RCLIENTS" -o -n "$MOUNT_2" ] && + skip_env "multiple clients -- skipping" + ORIGFREE=$($LCTL get_param -n lov.$FSNAME-clilov-*.kbytesavail | head -n1) if [[ $ORIGFREE -gt $MAXFREE ]]; then @@ -2203,9 +2249,9 @@ test_27D() { local skip27D [ $MDS1_VERSION -lt $(version_code 2.8.55) ] && skip27D+="-s 29" - [ $MDS1_VERSION -lt $(version_code 2.9.55) -o \ - $CLIENT_VERSION -lt $(version_code 2.9.55) ] && - skip27D+=" -s 30,31" + [ $MDS1_VERSION -lt $(version_code 2.9.55) ] || + [ $CLIENT_VERSION -lt $(version_code 2.9.55) ] && + skip27D+=" -s 30,31" llapi_layout_test -d$DIR/$tdir -p$POOL -o$OSTCOUNT $skip27D || error "llapi_layout_test failed" @@ -2342,6 +2388,23 @@ test_27H() { } run_test 27H "Set specific OSTs stripe" +test_27I() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + [[ $OSTCOUNT -lt 2 ]] && skip_env "needs >= 2 OSTs" + local pool=$TESTNAME + local ostrange="1 1 1" + + save_layout_restore_at_exit $MOUNT + $LFS setstripe -c 2 -i 0 $MOUNT + pool_add $pool || error "pool_add failed" + pool_add_targets $pool $ostrange || "pool_add_targets failed" + test_mkdir $DIR/$tdir + $LFS setstripe -p $pool $DIR/$tdir + $MULTIOP $DIR/$tdir/$tfile Oc || error "multiop failed" + $LFS getstripe $DIR/$tdir/$tfile +} +run_test 27I "check that root dir striping does not break parent dir one" + # createtest also checks that device nodes are created and # then visible correctly (#2091) test_28() { # bug 2091 @@ -3302,7 +3365,7 @@ subr_36fh() { sleep 1 touch --date="$DATESTR" $DIR/$tdir/$tfile # setattr timestamp in past LS_BEFORE="`ls -l $DIR/$tdir/$tfile`" # old timestamp from client cache - cancel_lru_locks osc + cancel_lru_locks $OSC LS_AFTER="`ls -l $DIR/$tdir/$tfile`" # timestamp from OST object date; date +%s [ "$LS_BEFORE" != "$LS_AFTER" ] && \ @@ -3325,30 +3388,36 @@ run_test 36f "utime on file racing with OST BRW write ==========" test_36g() { remote_ost_nodsh && skip "remote OST with nodsh" [ $PARALLEL == "yes" ] && skip "skip parallel run" + [ $MDS1_VERSION -lt $(version_code 2.12.51) ] && + skip "Need MDS version at least 2.12.51" local fmd_max_age - local fmd_before - local fmd_after + local fmd + local facet="ost1" + local tgt="obdfilter" + + [[ $OSC == "mdc" ]] && tgt="mdt" && facet="mds1" test_mkdir $DIR/$tdir - fmd_max_age=$(do_facet ost1 \ - "lctl get_param -n obdfilter.*.client_cache_seconds 2> /dev/null | \ + fmd_max_age=$(do_facet $facet \ + "lctl get_param -n $tgt.*.tgt_fmd_seconds 2> /dev/null | \ head -n 1") - fmd_before=$(do_facet ost1 \ - "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") + echo "FMD max age: ${fmd_max_age}s" touch $DIR/$tdir/$tfile + fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" | + gawk '{cnt=cnt+$1} END{print cnt}') + echo "FMD before: $fmd" + [[ $fmd == 0 ]] && + error "FMD wasn't create by touch" sleep $((fmd_max_age + 12)) - fmd_after=$(do_facet ost1 \ - "awk '/ll_fmd_cache/ {print \\\$2}' /proc/slabinfo") - - echo "fmd_before: $fmd_before" - echo "fmd_after: $fmd_after" - [[ $fmd_after -gt $fmd_before ]] && - echo "AFTER: $fmd_after > BEFORE: $fmd_before" && - error "fmd didn't expire after ping" || true + fmd=$(do_facet $facet "lctl get_param -n $tgt.*.exports.*.fmd_count" | + gawk '{cnt=cnt+$1} END{print cnt}') + echo "FMD after: $fmd" + [[ $fmd == 0 ]] || + error "FMD wasn't expired by ping" } -run_test 36g "filter mod data cache expiry =====================" +run_test 36g "FMD cache expiry =====================" test_36h() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -3445,7 +3514,7 @@ test_39b() { [ $unlink_new2 -eq $unlink_new ] || error "unlink file reverses mtime" [ $rename_new2 -eq $rename_new ] || error "rename file reverses mtime" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3479,7 +3548,7 @@ test_39c() { [ "$mtime2" = "$mtime3" ] || \ error "mtime ($mtime2) changed (to $mtime3) on rename" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3497,7 +3566,7 @@ test_39d() { [ $mtime = $TEST_39_MTIME ] || \ error "mtime($mtime) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3517,7 +3586,7 @@ test_39e() { [ $mtime2 = $TEST_39_MTIME ] || \ error "mtime($mtime2) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3538,7 +3607,7 @@ test_39f() { [ $mtime2 = $TEST_39_MTIME ] || \ error "mtime($mtime2) is not set to $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3559,7 +3628,7 @@ test_39g() { [ "$mtime1" = "$mtime2" ] || \ error "lost mtime: $mtime2, should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3586,7 +3655,7 @@ test_39h() { [ "$mtime2" = $TEST_39_MTIME ] || \ error "lost mtime: $mtime2, should be $TEST_39_MTIME" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done fi @@ -3610,7 +3679,7 @@ test_39i() { [ "$mtime1" = "$mtime2" ] || \ error "lost mtime: $mtime2, should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -3641,7 +3710,7 @@ test_39j() { error "mtime is lost on close: $mtime2, " \ "should be $mtime1" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done lctl set_param fail_loc=0 @@ -3745,7 +3814,7 @@ test_39m() { [ "$timestamps" = "$far_past_atime $far_past_mtime" ] || \ error "atime or mtime set incorrectly" - cancel_lru_locks osc + cancel_lru_locks $OSC if [ $i = 0 ] ; then echo "repeat after cancel_lru_locks"; fi done } @@ -4100,15 +4169,13 @@ run_test 43A "execution of file opened for write should return -ETXTBSY" test_43a() { test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $MULTIOP $DIR/$tdir/multiop Oc && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $MULTIOP $DIR/$tdir/sleep Oc && error "expected error, got success" + kill $SLEEP_PID } run_test 43a "open(RDWR) of file being executed should return -ETXTBSY" @@ -4116,15 +4183,13 @@ test_43b() { [ $PARALLEL == "yes" ] && skip "skip parallel run" test_mkdir $DIR/$tdir - cp -p $(which $MULTIOP) $DIR/$tdir/multiop || - cp -p multiop $DIR/$tdir/multiop - MULTIOP_PROG=$DIR/$tdir/multiop multiop_bg_pause $TMP/$tfile.junk O_c || - error "multiop open $TMP/$tfile.junk failed" - rm $TMP/$tfile.junk # delete junk file on close (not part of test) - MULTIOP_PID=$! - $TRUNCATE $DIR/$tdir/multiop 0 && error "expected error, got success" - kill -USR1 $MULTIOP_PID || error "kill -USR1 PID $MULTIOP_PID failed" - wait $MULTIOP_PID || error "wait PID $MULTIOP_PID failed" + cp -p $(which sleep) $DIR/$tdir/sleep || error "can't copy" + $DIR/$tdir/sleep 60 & + SLEEP_PID=$! + # Make sure exec of $tdir/sleep wins race with truncate + sleep 1 + $TRUNCATE $DIR/$tdir/sleep 0 && error "expected error, got success" + kill $SLEEP_PID } run_test 43b "truncate of file being executed should return -ETXTBSY" @@ -5072,6 +5137,41 @@ test_56o() { } run_test 56o "check lfs find -mtime for old files" +test_56ob() { + local dir=$DIR/$tdir + local expected=1 + local count=0 + + # just to make sure there is something that won't be found + test_mkdir $dir + touch $dir/$tfile.now + + for age in year week day hour min; do + count=$((count + 1)) + + touch $dir/$tfile-a.$age $dir/$tfile-m.$age + touch --date="$count $age ago" -a $dir/$tfile-a.$age + touch --date="$count $age ago" -m $dir/$tfile-m.$age + + local cmd="$LFS find $dir -mtime $count${age:0:1}" + local nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + + cmd="$LFS find $dir -atime $count${age:0:1}" + nums=$($cmd | wc -l) + [ $nums -eq $expected ] || + error "'$cmd' wrong: found $nums, expected $expected" + done + + sleep 2 + cmd="$LFS find $dir -ctime +1s -type f" + nums=$($cmd | wc -l) + (( $nums == $count * 2 + 1)) || + error "'$cmd' wrong: found $nums, expected $((expected*2+1))" +} +run_test 56ob "check lfs find -atime -mtime -ctime with units" + test_56p() { [ $RUNAS_ID -eq $UID ] && skip_env "RUNAS_ID = UID = $UID -- skipping" @@ -6426,7 +6526,7 @@ test_60g() { } run_test 60g "transaction abort won't cause MDT hung" -test_61() { +test_61a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" f="$DIR/f61" @@ -6435,7 +6535,12 @@ test_61() { $MULTIOP $f OSMWUc || error "$MULTIOP $f failed" sync } -run_test 61 "mmap() writes don't make sync hang ================" +run_test 61a "mmap() writes don't make sync hang ================" + +test_61b() { + mmap_mknod_test $DIR/$tfile || error "mmap_mknod_test failed" +} +run_test 61b "mmap() of unstriped file is successful" # bug 2330 - insufficient obd_match error checking causes LBUG test_62() { @@ -7010,11 +7115,11 @@ test_72a() { # bug 5695 - Test that on 2.6 remove_suid works properly $RUNAS dd if=/dev/zero of=$DIR/$tfile bs=512 count=1 || error "$RUNAS dd $DIR/$tfile failed" # See if we are still setuid/sgid - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on write" # Now test that MDS is updated too cancel_lru_locks mdc - test -u $DIR/$tfile -o -g $DIR/$tfile && + [ -u $DIR/$tfile ] || [ -g $DIR/$tfile ] && error "S/gid is not dropped on MDS" rm -f $DIR/$tfile } @@ -7896,7 +8001,7 @@ test_101d() { rm -f $file wait_delete_completed - [ $raOFF -le 1 -o $raON -lt $raOFF ] || + [ $raOFF -le 1 ] || [ $raON -lt $raOFF ] || error "readahead ${raON}s > no-readahead ${raOFF}s ${sz_MB}M" } run_test 101d "file read with and without read-ahead enabled" @@ -8020,13 +8125,17 @@ test_101g() { $LFS setstripe -i 0 -c 1 $DIR/$tfile local orig_mb=$(do_facet ost1 $LCTL get_param -n $brw_size | head -n 1) - if [ $OST1_VERSION -ge $(version_code 2.8.52) -o \ - \( $OST1_VERSION -ge $(version_code 2.7.17) -a \ - $OST1_VERSION -lt $(version_code 2.7.50) \) ] && - [ $CLIENT_VERSION -ge $(version_code 2.8.52) -o \ - \( $CLIENT_VERSION -ge $(version_code 2.7.17) -a \ - $CLIENT_VERSION -lt $(version_code 2.7.50) \) ]; then - [ $OST1_VERSION -ge $(version_code 2.9.52) ] && suffix="M" + + if { [ $OST1_VERSION -ge $(version_code 2.8.52) ] || + { [ $OST1_VERSION -ge $(version_code 2.7.17) ] && + [ $OST1_VERSION -lt $(version_code 2.7.50) ]; }; } && + { [ $CLIENT_VERSION -ge $(version_code 2.8.52) ] || + { [ $CLIENT_VERSION -ge $(version_code 2.7.17) ] && + [ $CLIENT_VERSION -lt $(version_code 2.7.50) ]; }; }; then + + [ $OST1_VERSION -ge $(version_code 2.9.52) ] && + suffix="M" + if [[ $orig_mb -lt 16 ]]; then save_lustre_params $osts "$brw_size" > $p do_nodes $list $LCTL set_param -n $brw_size=16$suffix || @@ -8277,11 +8386,19 @@ grow_xattr() { local file=$DIR/$tfile local value="$(generate_string $xsize)" local xbig=trusted.big + local toobig=$2 touch $file log "save $xbig on $file" - setfattr -n $xbig -v $value $file || - error "saving $xbig on $file failed" + if [ -z "$toobig" ] + then + setfattr -n $xbig -v $value $file || + error "saving $xbig on $file failed" + else + setfattr -n $xbig -v $value $file && + error "saving $xbig on $file succeeded" + return 0 + fi local orig=$(get_xattr_value $xbig $file) [[ "$orig" != "$value" ]] && error "$xbig different after saving $xbig" @@ -8312,7 +8429,12 @@ run_test 102h "grow xattr from inside inode to external block" test_102ha() { large_xattr_enabled || skip_env "ea_inode feature disabled" + echo "setting xattr of max xattr size: $(max_xattr_size)" grow_xattr $(max_xattr_size) + + echo "setting xattr of > max xattr size: $(max_xattr_size) + 10" + echo "This should fail:" + grow_xattr $(($(max_xattr_size) + 10)) 1 } run_test 102ha "grow xattr from inside inode to external inode" @@ -8649,9 +8771,9 @@ test_103a() { echo "performing permissions..." run_acl_subtest permissions || error "permissions failed" # LU-1482 mdd: Setting xattr are properly checked with and without ACLs - if [ $MDS1_VERSION -gt $(version_code 2.8.55) -o \ - \( $MDS1_VERSION -lt $(version_code 2.6) -a \ - $MDS1_VERSION -ge $(version_code 2.5.29) \) ] + if [ $MDS1_VERSION -gt $(version_code 2.8.55) ] || + { [ $MDS1_VERSION -lt $(version_code 2.6) ] && + [ $MDS1_VERSION -ge $(version_code 2.5.29) ]; } then echo "performing permissions xattr..." run_acl_subtest permissions_xattr || @@ -9674,7 +9796,7 @@ run_test 119d "The DIO path should try to send a new rpc once one is completed" test_120a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip_env "no early lock cancel on server" @@ -9685,13 +9807,13 @@ test_120a() { cancel_lru_locks osc stat $DIR/$tdir > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') - test_mkdir -c1 $DIR/$tdir/d1 - can2=$(do_facet $SINGLEMDS \ + test_mkdir -i0 -c1 $DIR/$tdir/d1 + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9735,24 +9857,24 @@ run_test 120b "Early Lock Cancel: create test" test_120c() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip "no early lock cancel on server" lru_resize_disable mdc lru_resize_disable osc - test_mkdir -c1 $DIR/$tdir/d1 - test_mkdir -c1 $DIR/$tdir/d2 + test_mkdir -i0 -c1 $DIR/$tdir/d1 + test_mkdir -i0 -c1 $DIR/$tdir/d2 touch $DIR/$tdir/d1/f1 cancel_lru_locks mdc stat $DIR/$tdir/d1 $DIR/$tdir/d2 $DIR/$tdir/d1/f1 > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') ln $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9767,7 +9889,7 @@ run_test 120c "Early Lock Cancel: link test" test_120d() { [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir $LCTL get_param -n mdc.*.connect_flags | grep -q early_lock_cancel || skip_env "no early lock cancel on server" @@ -9776,13 +9898,13 @@ test_120d() { touch $DIR/$tdir cancel_lru_locks mdc stat $DIR/$tdir > /dev/null - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') chmod a+x $DIR/$tdir - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9802,7 +9924,7 @@ test_120e() { local dlmtrace_set=false - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc ! $LCTL get_param debug | grep -q dlmtrace && @@ -9816,14 +9938,14 @@ test_120e() { # during unlink (LU-4206), so cancel osc lock now. sleep 2 cancel_lru_locks osc - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') unlink $DIR/$tdir/f1 sleep 5 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -9844,11 +9966,11 @@ test_120f() { skip_env "no early lock cancel on server" remote_mds_nodsh && skip "remote MDS with nodsh" - test_mkdir -c1 $DIR/$tdir + test_mkdir -i0 -c1 $DIR/$tdir lru_resize_disable mdc lru_resize_disable osc - test_mkdir -c1 $DIR/$tdir/d1 - test_mkdir -c1 $DIR/$tdir/d2 + test_mkdir -i0 -c1 $DIR/$tdir/d1 + test_mkdir -i0 -c1 $DIR/$tdir/d2 dd if=/dev/zero of=$DIR/$tdir/d1/f1 count=1 dd if=/dev/zero of=$DIR/$tdir/d2/f2 count=1 cancel_lru_locks mdc @@ -9860,14 +9982,14 @@ test_120f() { # during rename (LU-4206), so cancel osc lock now. sleep 2 cancel_lru_locks osc - can1=$(do_facet $SINGLEMDS \ + can1=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk1=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | awk '/ldlm_bl_callback/ {print $2}') mrename $DIR/$tdir/d1/f1 $DIR/$tdir/d2/f2 sleep 5 - can2=$(do_facet $SINGLEMDS \ + can2=$(do_facet mds1 \ "$LCTL get_param -n ldlm.services.ldlm_canceld.stats" | awk '/ldlm_cancel/ {print $2}') blk2=$($LCTL get_param -n ldlm.services.ldlm_cbd.stats | @@ -10443,7 +10565,7 @@ test_129() { # check two errors: # ENOSPC for new ext4 max_dir_size (kernel commit df981d03ee) # EFBIG for previous versions included in ldiskfs series - if [ $rc -eq $EFBIG -o $rc -eq $ENOSPC ]; then + if [ $rc -eq $EFBIG ] || [ $rc -eq $ENOSPC ]; then set_dir_limits 0 0 echo "return code $rc received as expected" @@ -11408,8 +11530,8 @@ test_140() { #bug-17379 done i=$((i - 1)) echo "The symlink depth = $i" - [ $i -eq 5 -o $i -eq 7 -o $i -eq 8 -o $i -eq 40 ] || - error "Invalid symlink depth" + [ $i -eq 5 ] || [ $i -eq 7 ] || [ $i -eq 8 ] || [ $i -eq 40 ] || + error "Invalid symlink depth" # Test recursive symlink ln -s symlink_self symlink_self @@ -13458,12 +13580,12 @@ obdecho_test() { "test_brw $count w v $pages $id" || rc=4; } [ $rc -eq 0 ] && { do_facet $node "$LCTL --device ec destroy $id 1" || rc=4; } - [ $rc -eq 0 -o $rc -gt 2 ] && { do_facet $node "$LCTL --device ec " \ - "cleanup" || rc=5; } - [ $rc -eq 0 -o $rc -gt 1 ] && { do_facet $node "$LCTL --device ec " \ - "detach" || rc=6; } - [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" - return $rc + [ $rc -eq 0 ] || [ $rc -gt 2 ] && + { do_facet $node "$LCTL --device ec cleanup" || rc=5; } + [ $rc -eq 0 ] || [ $rc -gt 1 ] && + { do_facet $node "$LCTL --device ec detach" || rc=6; } + [ $rc -ne 0 ] && echo "obecho_create_test failed: $rc" + return $rc } test_180a() { @@ -16263,7 +16385,7 @@ run_test 251 "Handling short read and write correctly" test_252() { remote_mds_nodsh && skip "remote MDS with nodsh" remote_ost_nodsh && skip "remote OST with nodsh" - if [ "$ost1_FSTYPE" != "ldiskfs" -o "$mds1_FSTYPE" != "ldiskfs" ]; then + if [ "$ost1_FSTYPE" != ldiskfs ] || [ "$mds1_FSTYPE" != ldiskfs ]; then skip_env "ldiskfs only test" fi @@ -16749,7 +16871,7 @@ test_255c() { local rc test_mkdir -p $DIR/$tdir - $LFS setstripe -i 0 $DIR/$tdir + $LFS setstripe -i 0 -c 1 $DIR/$tdir #test 10 returns only success/failure i=10 @@ -17476,61 +17598,6 @@ test_271d() { } run_test 271d "DoM: read on open (1K file in reply buffer)" -test_271e() { - [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && - skip "Need MDS version at least 2.10.57" - - local dom=$DIR/$tdir/dom - local tmp=$TMP/${tfile}.data - trap "cleanup_271def_tests $tmp" EXIT - - mkdir -p $DIR/$tdir - - $LFS setstripe -E 1024K -L mdt $DIR/$tdir - - local mdtidx=$($LFS getstripe --mdt-index $DIR/$tdir) - - cancel_lru_locks mdc - dd if=/dev/urandom of=$tmp bs=30K count=1 - dd if=$tmp of=$dom bs=30K count=1 - cancel_lru_locks mdc - cat /etc/hosts >> $tmp - lctl set_param -n mdc.*.stats=clear - - echo "Append to the same page" - cat /etc/hosts >> $dom - - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - cancel_lru_locks mdc - lctl set_param -n mdc.*.stats=clear - - echo "Open and read file" - cat $dom > /dev/null - local num=$(get_mdc_stats $mdtidx ost_read) - local ra=$(get_mdc_stats $mdtidx req_active) - local rw=$(get_mdc_stats $mdtidx req_waittime) - - [ -z $num ] || error "$num READ RPC occured" - # Reply buffer can be adjusted for larger buffer by resend - echo "... DONE with $((ra - rw)) resends" - - # compare content - cmp $tmp $dom || error "file miscompare" - - return 0 -} -run_test 271e "DoM: read on open (30K file with reply buffer adjusting)" - test_271f() { [ $MDS1_VERSION -lt $(version_code 2.10.57) ] && skip "Need MDS version at least 2.10.57" @@ -18060,11 +18127,12 @@ test_300_check_default_striped_dir() for dir in $(find $DIR/$tdir/$dirname/*); do stripe_count=$($LFS getdirstripe -c $dir) [ $stripe_count -eq $default_count ] || - [ $stripe_count -eq 0 -o $default_count -eq 1 ] || + [ $stripe_count -eq 0 ] || [ $default_count -eq 1 ] || error "stripe count $default_count != $stripe_count for $dir" stripe_index=$($LFS getdirstripe -i $dir) - [ $default_index -eq -1 -o $stripe_index -eq $default_index ] || + [ $default_index -eq -1 ] || + [ $stripe_index -eq $default_index ] || error "$stripe_index != $default_index for $dir" #check default stripe @@ -18396,13 +18464,13 @@ test_300o() { numfree1=$(lctl get_param -n mdc.*MDT0000*.filesfree) numfree2=$(lctl get_param -n mdc.*MDT0001*.filesfree) - if [ $numfree1 -lt 66000 -o $numfree2 -lt 66000 ]; then + if [ $numfree1 -lt 66000 ] || [ $numfree2 -lt 66000 ]; then skip "not enough free inodes $numfree1 $numfree2" fi numfree1=$(lctl get_param -n mdc.*MDT0000-mdc-*.kbytesfree) numfree2=$(lctl get_param -n mdc.*MDT0001-mdc-*.kbytesfree) - if [ $numfree1 -lt 300000 -o $numfree2 -lt 300000 ]; then + if [ $numfree1 -lt 300000 ] || [ $numfree2 -lt 300000 ]; then skip "not enough free space $numfree1 $numfree2" fi @@ -19177,9 +19245,10 @@ run_test 404 "validate manual {de}activated works properly for OSPs" test_405() { [ -n "$FILESET" ] && skip "Not functional for FILESET set" - [ $MDS1_VERSION -lt $(version_code 2.6.92) -o \ - [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && - skip "Layout swap lock is not supported" + [ $MDS1_VERSION -lt $(version_code 2.6.92) ] || + [ $CLIENT_VERSION -lt $(version_code 2.6.99) ] && + skip "Layout swap lock is not supported" + check_swap_layouts_support test_mkdir $DIR/$tdir @@ -19630,6 +19699,23 @@ test_418() { } run_test 418 "df and lfs df outputs match" +test_419() +{ + local dir=$DIR/$tdir + + mkdir -p $dir + touch $dir/file + + cancel_lru_locks mdc + + #OBD_FAIL_LLITE_OPEN_BY_NAME 0x1410 + $LCTL set_param fail_loc=0x1410 + cat $dir/file + $LCTL set_param fail_loc=0 + rm -rf $dir +} +run_test 419 "Verify open file by name doesn't crash kernel" + prep_801() { [[ $(lustre_version_code mds1) -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] && @@ -19811,7 +19897,7 @@ test_801c() { do_facet mgs $LCTL barrier_freeze $FSNAME 30 local b_status=$(barrier_stat) - [ "$b_status" = "'expired'" -o "$b_status" = "'failed'" ] || { + [ "$b_status" = "'expired'" ] || [ "$b_status" = "'failed'" ] || { do_facet mgs $LCTL barrier_thaw $FSNAME error "(2) unexpected barrier status $b_status" } @@ -20401,6 +20487,177 @@ test_812() { } run_test 812 "do not drop reqs generated when imp is going to idle (LU-11951)" +test_813() { + local file_heat_sav=$($LCTL get_param -n llite.*.file_heat 2>/dev/null) + [ -z "$file_heat_sav" ] && skip "no file heat support" + + local readsample + local writesample + local readbyte + local writebyte + local readsample1 + local writesample1 + local readbyte1 + local writebyte1 + + local period_second=$($LCTL get_param -n llite.*.heat_period_second) + local decay_pct=$($LCTL get_param -n llite.*.heat_decay_percentage) + + $LCTL set_param -n llite.*.file_heat=1 + echo "Turn on file heat" + echo "Period second: $period_second, Decay percentage: $decay_pct" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + local out=$($LFS heat_get $DIR/$tfile) + + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -le 4 ] || error "read sample ($readsample) is wrong" + [ $writesample -le 3 ] || error "write sample ($writesample) is wrong" + [ $readbyte -le 20 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -le 15 ] || error "write bytes ($writebyte) is wrong" + + sleep $((period_second + 3)) + echo "Sleep $((period_second + 3)) seconds..." + # The recursion formula to calculate the heat of the file f is as + # follow: + # Hi+1(f) = (1-P)*Hi(f)+ P*Ci + # Where Hi is the heat value in the period between time points i*I and + # (i+1)*I; Ci is the access count in the period; the symbol P refers + # to the weight of Ci. + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $(bc <<< "$readsample <= 4 * $decay_pct / 100") -eq 1 ] || + error "read sample ($readsample) is wrong" + [ $(bc <<< "$writesample <= 3 * $decay_pct / 100") -eq 1 ] || + error "write sample ($writesample) is wrong" + [ $(bc <<< "$readbyte <= 20 * $decay_pct / 100") -eq 1 ] || + error "read bytes ($readbyte) is wrong" + [ $(bc <<< "$writebyte <= 15 * $decay_pct / 100") -eq 1 ] || + error "write bytes ($writebyte) is wrong" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + sleep $((period_second + 3)) + echo "Sleep $((period_second + 3)) seconds..." + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample1=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample1=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte1=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte1=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $(bc <<< "$readsample1 <= ($readsample * (100 - $decay_pct) + \ + 4 * $decay_pct) / 100") -eq 1 ] || + error "read sample ($readsample1) is wrong" + [ $(bc <<< "$writesample1 <= ($writesample * (100 - $decay_pct) + \ + 3 * $decay_pct) / 100") -eq 1 ] || + error "write sample ($writesample1) is wrong" + [ $(bc <<< "$readbyte1 <= ($readbyte * (100 - $decay_pct) + \ + 20 * $decay_pct) / 100") -eq 1 ] || + error "read bytes ($readbyte1) is wrong" + [ $(bc <<< "$writebyte1 <= ($writebyte * (100 - $decay_pct) + \ + 15 * $decay_pct) / 100") -eq 1 ] || + error "write bytes ($writebyte1) is wrong" + + echo "Turn off file heat for the file $DIR/$tfile" + $LFS heat_set -o $DIR/$tfile + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong" + + echo "Trun on file heat for the file $DIR/$tfile" + $LFS heat_set -O $DIR/$tfile + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -gt 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -gt 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -gt 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -gt 0 ] || error "write bytes ($writebyte) is wrong" + + $LFS heat_set -c $DIR/$tfile + $LCTL set_param -n llite.*.file_heat=0 + echo "Turn off file heat support for the Lustre filesystem" + + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + echo "QQQQ" > $DIR/$tfile + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + cat $DIR/$tfile > /dev/null + + out=$($LFS heat_get $DIR/$tfile) + $LFS heat_get $DIR/$tfile + readsample=$(echo "$out" | grep 'readsample' | awk '{ print $2 }') + writesample=$(echo "$out" | grep 'writesample' | awk '{ print $2 }') + readbyte=$(echo "$out" | grep 'readbyte' | awk '{ print $2 }') + writebyte=$(echo "$out" | grep 'writebyte' | awk '{ print $2 }') + + [ $readsample -eq 0 ] || error "read sample ($readsample) is wrong" + [ $writesample -eq 0 ] || error "write sample ($writesample) is wrong" + [ $readbyte -eq 0 ] || error "read bytes ($readbyte) is wrong" + [ $writebyte -eq 0 ] || error "write bytes ($writebyte) is wrong" + + $LCTL set_param -n llite.*.file_heat=$file_heat_sav + rm -f $DIR/$tfile +} +run_test 813 "File heat verfication" + # # tests that do cleanup/setup should be run at the end #