X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsanity.sh;h=924d05abab8f4756d5e0af02861eee6b1393305d;hb=4b47ec5a8e68950ced4895e1ccfdf2254c016194;hp=d168bd3e60b7861ab5a3ab5381fe964322e4b1a0;hpb=7e0208da21f9358d96feebce5124f8587778c318;p=fs%2Flustre-release.git diff --git a/lustre/tests/sanity.sh b/lustre/tests/sanity.sh index d168bd3..924d05a 100755 --- a/lustre/tests/sanity.sh +++ b/lustre/tests/sanity.sh @@ -63,8 +63,8 @@ if [[ $(uname -m) = aarch64 ]]; then ALWAYS_EXCEPT+=" 45 317" fi -# skip nfs tests on kernels >= 4.14.0 until they are fixed -if [ $LINUX_VERSION_CODE -ge $(version_code 4.14.0) ]; then +# skip nfs tests on kernels >= 4.12.0 until they are fixed +if [ $LINUX_VERSION_CODE -ge $(version_code 4.12.0) ]; then # bug number: LU-12661 ALWAYS_EXCEPT+=" 817" fi @@ -4880,6 +4880,8 @@ test_43A() { # was test_43 $DIR/$tdir/$tfile && error "execute $DIR/$tdir/$tfile succeeded" || true kill -USR1 $pid + # Wait for multiop to exit + wait $pid } run_test 43A "execution of file opened for write should return -ETXTBSY" @@ -5129,6 +5131,27 @@ test_48e() { # bug 4134 } run_test 48e "Access to recreated parent subdir (should return errors)" +test_48f() { + [[ $MDS1_VERSION -ge $(version_code 2.13.55) ]] || + skip "need MDS >= 2.13.55" + [[ $MDSCOUNT -ge 2 ]] || skip "needs >= 2 MDTs" + [[ "$(facet_host mds1)" != "$(facet_host mds2)" ]] || + skip "needs different host for mdt1 mdt2" + [[ $(facet_fstype mds1) == ldiskfs ]] || skip "ldiskfs only" + + $LFS mkdir -i0 $DIR/$tdir + $LFS mkdir -i 1 $DIR/$tdir/sub1 $DIR/$tdir/sub2 $DIR/$tdir/sub3 + + for d in sub1 sub2 sub3; do + #define OBD_FAIL_OSD_REF_DEL 0x19c + do_facet mds1 $LCTL set_param fail_loc=0x8000019c + rm -rf $DIR/$tdir/$d && error "rm $d should fail" + done + + rm -d --interactive=never $DIR/$tdir || error "rm $tdir fail" +} +run_test 48f "non-zero nlink dir unlink won't LBUG()" + test_49() { # LU-1030 [ $PARALLEL == "yes" ] && skip "skip parallel run" remote_ost_nodsh && skip "remote OST with nodsh" @@ -7694,7 +7717,7 @@ test_60g() { do_facet mds$index $LCTL set_param fail_loc=0x8000019a \ > /dev/null - usleep 100 + sleep 0.01 done kill -9 $pid @@ -8607,36 +8630,45 @@ test_74c() { } run_test 74c "ldlm_lock_create error path, (shouldn't LBUG)" -num_inodes() { - [ -f /sys/kernel/slab/lustre_inode_cache/shrink ] && - echo 1 > /sys/kernel/slab/lustre_inode_cache/shrink - awk '/lustre_inode_cache/ {print $2; exit}' /proc/slabinfo +slab_lic=/sys/kernel/slab/lustre_inode_cache +num_objects() { + [ -f $slab_lic/shrink ] && echo 1 > $slab_lic/shrink + [ -f $slab_lic/objects ] && awk '{ print $1 }' $slab_lic/objects || + awk '/lustre_inode_cache/ { print $2; exit }' /proc/slabinfo } -test_76() { # Now for bug 20433, added originally in bug 1443 +test_76() { # Now for b=20433, added originally in b=1443 [ $PARALLEL == "yes" ] && skip "skip parallel run" cancel_lru_locks osc + # there may be some slab objects cached per core local cpus=$(getconf _NPROCESSORS_ONLN 2>/dev/null) - local before=$(num_inodes) + local before=$(num_objects) local count=$((512 * cpus)) - [ "$SLOW" = "no" ] && count=$((64 * cpus)) + [ "$SLOW" = "no" ] && count=$((128 * cpus)) + local margin=$((count / 10)) + if [[ -f $slab_lic/aliases ]]; then + local aliases=$(cat $slab_lic/aliases) + (( aliases > 0 )) && margin=$((margin * aliases)) + fi - echo "before inodes: $before" + echo "before slab objects: $before" for i in $(seq $count); do touch $DIR/$tfile rm -f $DIR/$tfile done cancel_lru_locks osc - local after=$(num_inodes) - echo "after inodes: $after" - while (( after > before + 8 * ${cpus:-1} )); do + local after=$(num_objects) + echo "created: $count, after slab objects: $after" + # shared slab counts are not very accurate, allow significant margin + # the main goal is that the cache growth is not permanently > $count + while (( after > before + margin )); do sleep 1 - after=$(num_inodes) + after=$(num_objects) wait=$((wait + 1)) - (( wait % 5 == 0 )) && echo "wait $wait seconds inodes: $after" - if (( wait > 30 )); then - error "inode slab grew from $before to $after" + (( wait % 5 == 0 )) && echo "wait $wait seconds objects: $after" + if (( wait > 60 )); then + error "inode slab grew from $before+$margin to $after" fi done } @@ -9519,12 +9551,11 @@ test_101g_brw_size_test() { sed -n '/pages per rpc/,/^$/p' | awk '/'$pages':/ { reads += $2; writes += $6 }; \ END { print reads,writes }')) - [ ${rpcs[0]} -ne $count ] && error "${rpcs[0]} != $count read RPCs" && - return 5 - [ ${rpcs[1]} -ne $count ] && error "${rpcs[1]} != $count write RPCs" && - return 6 - - return 0 + # allow one extra full-sized read RPC for async readahead + [[ ${rpcs[0]} == $count || ${rpcs[0]} == $((count + 1)) ]] || + { error "${rpcs[0]} != $count read RPCs"; return 5; } + [[ ${rpcs[1]} == $count ]] || + { error "${rpcs[1]} != $count write RPCs"; return 6; } } test_101g() { @@ -11782,18 +11813,18 @@ test_124a() { skip "Limit is too small $LIMIT" fi - # Make LVF so higher that sleeping for $SLEEP is enough to _start_ - # killing locks. Some time was spent for creating locks. This means - # that up to the moment of sleep finish we must have killed some of - # them (10-100 locks). This depends on how fast ther were created. - # Many of them were touched in almost the same moment and thus will - # be killed in groups. - local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE)) - - # Use $LRU_SIZE_B here to take into account real number of locks - # created in the case of CMD, LRU_SIZE_B != $NR in most of cases - local LRU_SIZE_B=$LRU_SIZE - log "LVF=$LVF" + # Make LVF so higher that sleeping for $SLEEP is enough to _start_ + # killing locks. Some time was spent for creating locks. This means + # that up to the moment of sleep finish we must have killed some of + # them (10-100 locks). This depends on how fast ther were created. + # Many of them were touched in almost the same moment and thus will + # be killed in groups. + local LVF=$(($MAX_HRS * 60 * 60 / $SLEEP * $LIMIT / $LRU_SIZE * 100)) + + # Use $LRU_SIZE_B here to take into account real number of locks + # created in the case of CMD, LRU_SIZE_B != $NR in most of cases + local LRU_SIZE_B=$LRU_SIZE + log "LVF=$LVF" local OLD_LVF=$($LCTL get_param -n $NSDIR.pool.lock_volume_factor) log "OLD_LVF=$OLD_LVF" $LCTL set_param -n $NSDIR.pool.lock_volume_factor $LVF @@ -14981,6 +15012,71 @@ test_160k() { } run_test 160k "Verify that changelog records are not lost" +# Verifies that a file passed as a parameter has recently had an operation +# performed on it that has generated an MTIME changelog which contains the +# correct parent FID. As files might reside on a different MDT from the +# parent directory in DNE configurations, the FIDs are translated to paths +# before being compared, which should be identical +compare_mtime_changelog() { + local file="${1}" + local mdtidx + local mtime + local cl_fid + local pdir + local dir + + mdtidx=$($LFS getstripe --mdt-index $file) + mdtidx=$(printf "%04x" $mdtidx) + + # Obtain the parent FID from the MTIME changelog + mtime=$($LFS changelog $FSNAME-MDT$mdtidx | tail -n 1 | grep MTIME) + [ -z "$mtime" ] && error "MTIME changelog not recorded" + + cl_fid=$(sed -e 's/.* p=//' -e 's/ .*//' <<<$mtime) + [ -z "$cl_fid" ] && error "parent FID not present" + + # Verify that the path for the parent FID is the same as the path for + # the test directory + pdir=$($LFS fid2path $MOUNT "$cl_fid") + + dir=$(dirname $1) + + [[ "${pdir%/}" == "$dir" ]] || + error "MTIME changelog parent FID is wrong, expected $dir, got $pdir" +} + +test_160l() { + [ $PARALLEL == "yes" ] && skip "skip parallel run" + + remote_mds_nodsh && skip "remote MDS with nodsh" + [[ $MDS1_VERSION -ge $(version_code 2.13.55) ]] || + skip "Need MDS version at least 2.13.55" + + local cl_user + + changelog_register || error "changelog_register failed" + cl_user="${CL_USERS[$SINGLEMDS]%% *}" + + changelog_users $SINGLEMDS | grep -q $cl_user || + error "User '$cl_user' not found in changelog_users" + + # Clear some types so that MTIME changelogs are generated + changelog_chmask "-CREAT" + changelog_chmask "-CLOSE" + + test_mkdir $DIR/$tdir || error "failed to mkdir $DIR/$tdir" + + # Test CL_MTIME during setattr + touch $DIR/$tdir/$tfile + compare_mtime_changelog $DIR/$tdir/$tfile + + # Test CL_MTIME during close + dd if=/dev/urandom of=$DIR/$tdir/${tfile}_2 bs=1M count=64 || + error "cannot create file $DIR/$tdir/${tfile}_2" + compare_mtime_changelog $DIR/$tdir/${tfile}_2 +} +run_test 160l "Verify that MTIME changelog records contain the parent FID" + test_161a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" @@ -15690,7 +15786,8 @@ obdecho_test() { test_180a() { [ $PARALLEL == "yes" ] && skip "skip parallel run" - if ! module_loaded obdecho; then + if ! [ -d /sys/fs/lustre/echo_client ] && + ! module_loaded obdecho; then load_module obdecho/obdecho && stack_trap "rmmod obdecho" EXIT || error "unable to load obdecho on client" @@ -17214,6 +17311,34 @@ test_226b () { } run_test 226b "call path2fid and fid2path on files of all type under remote dir" +test_226c () { + [ $MDSCOUNT -lt 2 ] && skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -ge $(version_code 2.13.55) ]] || + skip "Need MDS version at least 2.13.55" + + local submnt=/mnt/submnt + local srcfile=/etc/passwd + local dstfile=$submnt/passwd + local path + local fid + + rm -rf $DIR/$tdir + rm -rf $submnt + $LFS setdirstripe -c -1 -i 1 $DIR/$tdir || + error "create remote directory failed" + mkdir -p $submnt || error "create $submnt failed" + $MOUNT_CMD $MGSNID:/$FSNAME/$tdir $submnt || + error "mount $submnt failed" + stack_trap "umount $submnt" EXIT + + cp $srcfile $dstfile + fid=$($LFS path2fid $dstfile) + path=$($LFS fid2path $submnt "$fid") + [ "$path" = "$dstfile" ] || + error "fid2path $submnt $fid failed ($path != $dstfile)" +} +run_test 226c "call path2fid and fid2path under remote dir with subdir mount" + # LU-1299 Executing or running ldd on a truncated executable does not # cause an out-of-memory condition. test_227() { @@ -18214,6 +18339,41 @@ test_230q() { } run_test 230q "dir auto split" +test_230r() { + [[ $PARALLEL != "yes" ]] || skip "skip parallel run" + [[ $MDSCOUNT -ge 2 ]] || skip_env "needs >= 2 MDTs" + [[ $MDS1_VERSION -ge $(version_code 2.13.54) ]] || + skip "Need MDS version at least 2.13.54" + + # maximum amount of local locks: + # parent striped dir - 2 locks + # new stripe in parent to migrate to - 1 lock + # source and target - 2 locks + # Total 5 locks for regular file + mkdir -p $DIR/$tdir + $LFS mkdir -i1 -c2 $DIR/$tdir/dir1 + touch $DIR/$tdir/dir1/eee + + # create 4 hardlink for 4 more locks + # Total: 9 locks > RS_MAX_LOCKS (8) + $LFS mkdir -i1 -c1 $DIR/$tdir/dir2 + $LFS mkdir -i1 -c1 $DIR/$tdir/dir3 + $LFS mkdir -i1 -c1 $DIR/$tdir/dir4 + $LFS mkdir -i1 -c1 $DIR/$tdir/dir5 + ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir2/eee + ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir3/eee + ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir4/eee + ln $DIR/$tdir/dir1/eee $DIR/$tdir/dir5/eee + + cancel_lru_locks mdc + + $LFS migrate -m1 -c1 $DIR/$tdir/dir1 || + error "migrate dir fails" + + rm -rf $DIR/$tdir || error "rm dir failed after migration" +} +run_test 230r "migrate with too many local locks" + test_231a() { # For simplicity this test assumes that max_pages_per_rpc @@ -21887,6 +22047,11 @@ test_398d() { # LU-13846 aiocp -a $PAGE_SIZE -b 64M -s 64M -f O_DIRECT $DIR/$tfile $aio_file diff $DIR/$tfile $aio_file || "file diff after aiocp" + + # make sure we don't crash and fail properly + aiocp -a 512 -b 64M -s 64M -f O_DIRECT $DIR/$tfile $aio_file && + error "aio not aligned with PAGE SIZE should fail" + rm -rf $DIR/$tfile $aio_file } run_test 398d "run aiocp to verify block size > stripe size" @@ -22356,6 +22521,8 @@ test_410() { [[ $CLIENT_VERSION -lt $(version_code 2.9.59) ]] && skip "Need client version at least 2.9.59" + [ -f $LUSTRE/tests/kernel/kinode.ko ] || + skip "Need MODULES build" # Create a file, and stat it from the kernel local testfile=$DIR/$tfile @@ -23203,6 +23370,41 @@ test_424() { } run_test 424 "simulate ENOMEM in ptl_send_rpc bulk reply ME attach" +test_425() { + test_mkdir -c -1 $DIR/$tdir + $LFS setstripe -c -1 $DIR/$tdir + + lru_resize_disable "" 100 + stack_trap "lru_resize_enable" EXIT + + sleep 5 + + for i in $(seq $((MDSCOUNT * 125))); do + local t=$DIR/$tdir/$tfile_$i + + dd if=/dev/zero of=$t bs=4K count=1 > /dev/null 2>&1 || + error_noexit "Create file $t" + done + stack_trap "rm -rf $DIR/$tdir" EXIT + + for oscparam in $($LCTL list_param ldlm.namespaces.*osc-[-0-9a-f]*); do + local lru_size=$($LCTL get_param -n $oscparam.lru_size) + local lock_count=$($LCTL get_param -n $oscparam.lock_count) + + [ $lock_count -le $lru_size ] || + error "osc lock count $lock_count > lru size $lru_size" + done + + for mdcparam in $($LCTL list_param ldlm.namespaces.*mdc-*); do + local lru_size=$($LCTL get_param -n $mdcparam.lru_size) + local lock_count=$($LCTL get_param -n $mdcparam.lock_count) + + [ $lock_count -le $lru_size ] || + error "mdc lock count $lock_count > lru size $lru_size" + done +} +run_test 425 "lock count should not exceed lru size" + prep_801() { [[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] || [[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&